aboutsummaryrefslogtreecommitdiffstats
path: root/src/libs/arduinoFFT-develop/README.md
diff options
context:
space:
mode:
authorCeimour <113631258+Ceimour@users.noreply.github.com>2023-04-30 08:50:18 -0500
committerGitHub <noreply@github.com>2023-04-30 15:50:18 +0200
commitc22e30a4a6ef014c7a5086ad47eaab7740a75ff2 (patch)
tree5afdf4ed624a8b41dc4aea723a8c8f38d726545a /src/libs/arduinoFFT-develop/README.md
parent40f7e1c7be6882e01058b5ccf64d5005c6105346 (diff)
Refactored Ppg for frequency based algorithm. (#1486)
New implementation of the heart rate sensor data processing using a frequency based PPG algorithm. The HRS3300 settings are fine-tuned for better signal to noise at 10Hz. The measurement delay is now set to 100ms. Enable and use the ambient light sensor. FFT implementation based on ArduinoFFT (https://github.com/kosme/arduinoFFT, GPLv3.0).
Diffstat (limited to 'src/libs/arduinoFFT-develop/README.md')
-rw-r--r--src/libs/arduinoFFT-develop/README.md129
1 files changed, 129 insertions, 0 deletions
diff --git a/src/libs/arduinoFFT-develop/README.md b/src/libs/arduinoFFT-develop/README.md
new file mode 100644
index 00000000..f9229ef9
--- /dev/null
+++ b/src/libs/arduinoFFT-develop/README.md
@@ -0,0 +1,129 @@
+arduinoFFT
+==========
+
+# Fast Fourier Transform for Arduino
+
+This is a fork from https://code.google.com/p/makefurt/ which has been abandoned since 2011.
+~~This is a C++ library for Arduino for computing FFT.~~ Now it works both on Arduino and C projects. This is version 2.0 of the library, which has a different [API](#api). See here [how to migrate from 1.x to 2.x](#migrating-from-1x-to-2x).
+Tested on Arduino 1.6.11 and 1.8.10.
+
+## Installation on Arduino
+
+Use the Arduino Library Manager to install and keep it updated. Just look for arduinoFFT. Only for Arduino 1.5+
+
+## Manual installation on Arduino
+
+To install this library, just place this entire folder as a subfolder in your Arduino installation. When installed, this library should look like:
+
+`Arduino\libraries\arduinoFTT` (this library's folder)
+`Arduino\libraries\arduinoFTT\src\arduinoFTT.h` (the library header file. include this in your project)
+`Arduino\libraries\arduinoFTT\keywords.txt` (the syntax coloring file)
+`Arduino\libraries\arduinoFTT\Examples` (the examples in the "open" menu)
+`Arduino\libraries\arduinoFTT\LICENSE` (GPL license file)
+`Arduino\libraries\arduinoFTT\README.md` (this file)
+
+## Building on Arduino
+
+After this library is installed, you just have to start the Arduino application.
+You may see a few warning messages as it's built.
+To use this library in a sketch, go to the Sketch | Import Library menu and
+select arduinoFTT. This will add a corresponding line to the top of your sketch:
+
+`#include <arduinoFTT.h>`
+
+## API
+
+* ```ArduinoFFT(T *vReal, T *vImag, uint_fast16_t samples, T samplingFrequency, T * weighingFactors = nullptr);```
+Constructor.
+The type `T` can be `float` or `double`. `vReal` and `vImag` are pointers to arrays of real and imaginary data and have to be allocated outside of ArduinoFFT. `samples` is the number of samples in `vReal` and `vImag` and `weighingFactors` (if specified). `samplingFrequency` is the sample frequency of the data. `weighingFactors` can optionally be specified to cache weighing factors for the windowing function. This speeds up repeated calls to **windowing()** significantly. You can deallocate `vReal` and `vImag` after you are done using the library, or only use specific library functions that only need one of those arrays.
+
+```C++
+const uint32_t nrOfSamples = 1024;
+auto real = new float[nrOfSamples];
+auto imag = new float[nrOfSamples];
+auto fft = ArduinoFFT<float>(real, imag, nrOfSamples, 10000);
+// ... fill real + imag and use it ...
+fft.compute();
+fft.complexToMagnitude();
+delete [] imag;
+// ... continue using real and only functions that use real ...
+auto peak = fft.majorPeak();
+```
+* ```~ArduinoFFT()```
+Destructor.
+* ```void complexToMagnitude() const;```
+Convert complex values to their magnitude and store in vReal. Uses vReal and vImag.
+* ```void compute(FFTDirection dir) const;```
+Calcuates the Fast Fourier Transform. Uses vReal and vImag.
+* ```void dcRemoval() const;```
+Removes the DC component from the sample data. Uses vReal.
+* ```T majorPeak() const;```
+Returns the frequency of the biggest spike in the analyzed signal. Uses vReal.
+* ```void majorPeak(T &frequency, T &value) const;```
+Returns the frequency and the value of the biggest spike in the analyzed signal. Uses vReal.
+* ```uint8_t revision() const;```
+Returns the library revision.
+* ```void setArrays(T *vReal, T *vImag);```
+Replace the data array pointers.
+* ```void windowing(FFTWindow windowType, FFTDirection dir, bool withCompensation = false);```
+Performs a windowing function on the values array. Uses vReal. The possible windowing options are:
+ * Rectangle
+ * Hamming
+ * Hann
+ * Triangle
+ * Nuttall
+ * Blackman
+ * Blackman_Nuttall
+ * Blackman_Harris
+ * Flat_top
+ * Welch
+
+ If `withCompensation` == true, the following compensation factors are used:
+ * Rectangle: 1.0 * 2.0
+ * Hamming: 1.8549343278 * 2.0
+ * Hann: 1.8554726898 * 2.0
+ * Triangle: 2.0039186079 * 2.0
+ * Nuttall: 2.8163172034 * 2.0
+ * Blackman: 2.3673474360 * 2.0
+ * Blackman Nuttall: 2.7557840395 * 2.0
+ * Blackman Harris: 2.7929062517 * 2.0
+ * Flat top: 3.5659039231 * 2.0
+ * Welch: 1.5029392863 * 2.0
+
+## Special flags
+
+You can define these before including arduinoFFT.h:
+
+* #define FFT_SPEED_OVER_PRECISION
+Define this to use reciprocal multiplication for division and some more speedups that might decrease precision.
+
+* #define FFT_SQRT_APPROXIMATION
+Define this to use a low-precision square root approximation instead of the regular sqrt() call. This might only work for specific use cases, but is significantly faster. Only works if `T == float`.
+
+See the `FFT_speedup.ino` example in `Examples/FFT_speedup/FFT_speedup.ino`.
+
+# Migrating from 1.x to 2.x
+
+* The function signatures where you could pass in pointers were deprecated and have been removed. Pass in pointers to your real / imaginary array in the ArduinoFFT() constructor. If you have the need to replace those pointers during usage of the library (e.g. to free memory) you can do the following:
+
+```C++
+const uint32_t nrOfSamples = 1024;
+auto real = new float[nrOfSamples];
+auto imag = new float[nrOfSamples];
+auto fft = ArduinoFFT<float>(real, imag, nrOfSamples, 10000);
+// ... fill real + imag and use it ...
+fft.compute();
+fft.complexToMagnitude();
+delete [] real;
+// ... replace vReal in library with imag ...
+fft.setArrays(imag, nullptr);
+// ... keep doing whatever ...
+```
+* All function names are camelCase case now (start with lower-case character), e.g. "windowing()" instead of "Windowing()".
+
+## TODO
+* Ratio table for windowing function.
+* Document windowing functions advantages and disadvantages.
+* Optimize usage and arguments.
+* Add new windowing functions.
+* ~~Spectrum table?~~