diff options
| author | Ceimour <113631258+Ceimour@users.noreply.github.com> | 2023-04-30 08:50:18 -0500 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2023-04-30 15:50:18 +0200 |
| commit | c22e30a4a6ef014c7a5086ad47eaab7740a75ff2 (patch) | |
| tree | 5afdf4ed624a8b41dc4aea723a8c8f38d726545a /src/libs/arduinoFFT-develop/Examples/FFT_01 | |
| parent | 40f7e1c7be6882e01058b5ccf64d5005c6105346 (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/Examples/FFT_01')
| -rw-r--r-- | src/libs/arduinoFFT-develop/Examples/FFT_01/FFT_01.ino | 119 |
1 files changed, 119 insertions, 0 deletions
diff --git a/src/libs/arduinoFFT-develop/Examples/FFT_01/FFT_01.ino b/src/libs/arduinoFFT-develop/Examples/FFT_01/FFT_01.ino new file mode 100644 index 00000000..22b5024a --- /dev/null +++ b/src/libs/arduinoFFT-develop/Examples/FFT_01/FFT_01.ino @@ -0,0 +1,119 @@ +/* + + Example of use of the FFT libray + + Copyright (C) 2014 Enrique Condes + Copyright (C) 2020 Bim Overbohm (header-only, template, speed improvements) + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see <http://www.gnu.org/licenses/>. + +*/ + +/* + In this example, the Arduino simulates the sampling of a sinusoidal 1000 Hz + signal with an amplitude of 100, sampled at 5000 Hz. Samples are stored + inside the vReal array. The samples are windowed according to Hamming + function. The FFT is computed using the windowed samples. Then the magnitudes + of each of the frequencies that compose the signal are calculated. Finally, + the frequency with the highest peak is obtained, being that the main frequency + present in the signal. +*/ + +#include "arduinoFFT.h" + +/* +These values can be changed in order to evaluate the functions +*/ +const uint16_t samples = 64; //This value MUST ALWAYS be a power of 2 +const double signalFrequency = 1000; +const double samplingFrequency = 5000; +const uint8_t amplitude = 100; + +/* +These are the input and output vectors +Input vectors receive computed results from FFT +*/ +double vReal[samples]; +double vImag[samples]; + +/* Create FFT object */ +ArduinoFFT<double> FFT = ArduinoFFT<double>(vReal, vImag, samples, samplingFrequency); + +#define SCL_INDEX 0x00 +#define SCL_TIME 0x01 +#define SCL_FREQUENCY 0x02 +#define SCL_PLOT 0x03 + +void setup() +{ + Serial.begin(115200); + Serial.println("Ready"); +} + +void loop() +{ + /* Build raw data */ + double cycles = (((samples-1) * signalFrequency) / samplingFrequency); //Number of signal cycles that the sampling will read + for (uint16_t i = 0; i < samples; i++) + { + vReal[i] = int8_t((amplitude * (sin((i * (TWO_PI * cycles)) / samples))) / 2.0);/* Build data with positive and negative values*/ + //vReal[i] = uint8_t((amplitude * (sin((i * (twoPi * cycles)) / samples) + 1.0)) / 2.0);/* Build data displaced on the Y axis to include only positive values*/ + vImag[i] = 0.0; //Imaginary part must be zeroed in case of looping to avoid wrong calculations and overflows + } + /* Print the results of the simulated sampling according to time */ + Serial.println("Data:"); + PrintVector(vReal, samples, SCL_TIME); + FFT.windowing(FFTWindow::Hamming, FFTDirection::Forward); /* Weigh data */ + Serial.println("Weighed data:"); + PrintVector(vReal, samples, SCL_TIME); + FFT.compute(FFTDirection::Forward); /* Compute FFT */ + Serial.println("Computed Real values:"); + PrintVector(vReal, samples, SCL_INDEX); + Serial.println("Computed Imaginary values:"); + PrintVector(vImag, samples, SCL_INDEX); + FFT.complexToMagnitude(); /* Compute magnitudes */ + Serial.println("Computed magnitudes:"); + PrintVector(vReal, (samples >> 1), SCL_FREQUENCY); + double x = FFT.majorPeak(); + Serial.println(x, 6); + while(1); /* Run Once */ + // delay(2000); /* Repeat after delay */ +} + +void PrintVector(double *vData, uint16_t bufferSize, uint8_t scaleType) +{ + for (uint16_t i = 0; i < bufferSize; i++) + { + double abscissa; + /* Print abscissa value */ + switch (scaleType) + { + case SCL_INDEX: + abscissa = (i * 1.0); + break; + case SCL_TIME: + abscissa = ((i * 1.0) / samplingFrequency); + break; + case SCL_FREQUENCY: + abscissa = ((i * 1.0 * samplingFrequency) / samples); + break; + } + Serial.print(abscissa, 6); + if(scaleType==SCL_FREQUENCY) + Serial.print("Hz"); + Serial.print(" "); + Serial.println(vData[i], 4); + } + Serial.println(); +} |
