From 7f340769fa5250c7ded285862ddc3304489ec178 Mon Sep 17 00:00:00 2001 From: Enrique Condes Date: Thu, 21 Nov 2024 15:26:23 +0800 Subject: [PATCH 1/2] Misc changes to improve performance --- src/arduinoFFT.cpp | 31 ++++++++++++++++--------------- 1 file changed, 16 insertions(+), 15 deletions(-) diff --git a/src/arduinoFFT.cpp b/src/arduinoFFT.cpp index 43b328b..1a162d2 100644 --- a/src/arduinoFFT.cpp +++ b/src/arduinoFFT.cpp @@ -52,7 +52,7 @@ template void ArduinoFFT::complexToMagnitude(T *vReal, T *vImag, uint_fast16_t samples) const { // vM is half the size of vReal and vImag - for (uint_fast16_t i = 0; i < samples; i++) { + for (uint_fast16_t i = 0; i < (samples >> 1) + 1; i++) { vReal[i] = sqrt_internal(sq(vReal[i]) + sq(vImag[i])); } } @@ -189,11 +189,12 @@ void ArduinoFFT::majorPeak(T *vData, uint_fast16_t samples, T delta = 0.5 * ((vData[IndexOfMaxY - 1] - vData[IndexOfMaxY + 1]) / (vData[IndexOfMaxY - 1] - (2.0 * vData[IndexOfMaxY]) + vData[IndexOfMaxY + 1])); - T interpolatedX = ((IndexOfMaxY + delta) * samplingFrequency) / (samples - 1); - if (IndexOfMaxY == (samples >> 1)) // To improve calculation on edge values - interpolatedX = ((IndexOfMaxY + delta) * samplingFrequency) / (samples); + if (IndexOfMaxY == (samples >> 1)) { // To improve calculation on edge values + *frequency = ((IndexOfMaxY + delta) * samplingFrequency) / (samples); + } else { + *frequency = ((IndexOfMaxY + delta) * samplingFrequency) / (samples - 1); + } // returned value: interpolated frequency peak apex - *frequency = interpolatedX; if (magnitude != nullptr) { #if defined(ESP8266) || defined(ESP32) *magnitude = fabs(vData[IndexOfMaxY - 1] - (2.0 * vData[IndexOfMaxY]) + @@ -504,16 +505,16 @@ template double ArduinoFFT::sqrt_internal(double x) const { template const T ArduinoFFT::_WindowCompensationFactors[11] = { - 1.0000000000 * 2.0, // rectangle (Box car) - 1.8549343278 * 2.0, // hamming - 1.8554726898 * 2.0, // hann - 2.0039186079 * 2.0, // triangle (Bartlett) - 2.8163172034 * 2.0, // nuttall - 2.3673474360 * 2.0, // blackman - 2.7557840395 * 2.0, // blackman nuttall - 2.7929062517 * 2.0, // blackman harris - 3.5659039231 * 2.0, // flat top - 1.5029392863 * 2.0, // welch + 2.0, // 1.0000000000 * 2.0, // rectangle (Box car) + 3.7098686556, // 1.8549343278 * 2.0, // hamming + 3.7109453796, // 1.8554726898 * 2.0, // hann + 4.0078372158, // 2.0039186079 * 2.0, // triangle (Bartlett) + 5.6326344068, // 2.8163172034 * 2.0, // nuttall + 4.734694872, // 2.3673474360 * 2.0, // blackman + 5.511568079, // 2.7557840395 * 2.0, // blackman nuttall + 5.5858125034, // 2.7929062517 * 2.0, // blackman harris + 7.1318078462, // 3.5659039231 * 2.0, // flat top + 3.0058785726, // 1.5029392863 * 2.0, // welch // This is added as a precaution, since this index should never be // accessed under normal conditions 1.0 // Custom, precompiled value. From 7f7bf6efa0d3b528a02605e7d7cfb52e3058c903 Mon Sep 17 00:00:00 2001 From: Enrique Condes Date: Thu, 21 Nov 2024 15:32:42 +0800 Subject: [PATCH 2/2] Allow performing bit reversal on the complex part of the input --- library.json | 2 +- library.properties | 4 ++-- src/arduinoFFT.cpp | 3 +++ 3 files changed, 6 insertions(+), 3 deletions(-) diff --git a/library.json b/library.json index 2568b67..9773b8d 100644 --- a/library.json +++ b/library.json @@ -25,7 +25,7 @@ "email": "bim.overbohm@googlemail.com" } ], - "version": "2.0.3", + "version": "2.0.4", "frameworks": ["arduino","mbed","espidf"], "platforms": "*", "headers": "arduinoFFT.h" diff --git a/library.properties b/library.properties index 4329c75..e591115 100644 --- a/library.properties +++ b/library.properties @@ -1,9 +1,9 @@ name=arduinoFFT -version=2.0.3 +version=2.0.4 author=Enrique Condes maintainer=Enrique Condes sentence=A library for implementing floating point Fast Fourier Transform calculations on the Arduino framework. -paragraph=With this library you can calculate the dominant frequency of a sampled signal. +paragraph=With this library you can calculate the frequencies present on a sampled signal. category=Data Processing url=/~https://github.com/kosme/arduinoFFT architectures=* diff --git a/src/arduinoFFT.cpp b/src/arduinoFFT.cpp index 1a162d2..a9604a0 100644 --- a/src/arduinoFFT.cpp +++ b/src/arduinoFFT.cpp @@ -82,6 +82,9 @@ void ArduinoFFT::compute(T *vReal, T *vImag, uint_fast16_t samples, for (uint_fast16_t i = 0; i < (samples - 1); i++) { if (i < j) { swap(&vReal[i], &vReal[j]); + #ifdef COMPLEX_INPUT + swap(&vImag[i], &vImag[j]); + #endif if (dir == FFTDirection::Reverse) swap(&vImag[i], &vImag[j]); }