From 7f340769fa5250c7ded285862ddc3304489ec178 Mon Sep 17 00:00:00 2001 From: Enrique Condes Date: Thu, 21 Nov 2024 15:26:23 +0800 Subject: [PATCH] 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.