11#define FFT_SQRT_APPROXIMATION
12#define FFT_SPEED_OVER_PRECISION
13#include "src/depends/arduinoFFT/src/arduinoFFT.h"
28template<u
int16_t samplesFFT, u
int16_t resultSize,
typename T =
float>
class FftAnalyzer
30 static_assert(samplesFFT > 0 && (samplesFFT & (samplesFFT - 1)) == 0,
"samplesFFT must be a power of two");
31 static constexpr uint16_t samplesFFTRes = samplesFFT >> 1;
41 std::array<T, resultSize + 1> minFrequenciesPerBin_log;
44 std::array<uint16_t, samplesFFTRes> _numSamplesPerBar_log;
46 const FFTWindow fftWindowing = FFTWindow::Rectangle;
67 static constexpr T logMultiplier = 1.2;
69 _numSamplesPerBar_log.fill(0);
70 minFrequenciesPerBin_log[0] = 0.0;
72 for (uint16_t octave = 1; octave < resultSize; ++octave)
74 assert(octave < minFrequenciesPerBin_log.size());
76 minFrequenciesPerBin_log[octave] = (
SAMPLE_RATE / 2.0) / pow(logMultiplier, resultSize - octave);
79 minFrequenciesPerBin_log[resultSize] = (SAMPLE_RATE / 2.0);
82 _numSamplesPerBar_log[0] = 0;
83 for (uint16_t i = 1; i < samplesFFTRes; ++i)
87 for (; octave < resultSize; ++octave)
92 assert(octave >= 0 && octave < resultSize);
93 _numSamplesPerBar_log[i] = octave;
98 for (uint16_t i = 0; i < samplesFFTRes; ++i)
100 FFT.windowing(fftWindowing, FFTDirection::Forward);
102 for (uint16_t i = 0; i < samplesFFTRes; ++i)
103 windowSum += vReal[i] * 2;
112 return round(frequency / (
static_cast<T
>(
SAMPLE_RATE) / samplesFFT));
126 return (index + 0.5) *
SAMPLE_RATE /
static_cast<T
>(samplesFFT);
136 if (index >= minFrequenciesPerBin_log.size())
137 index = minFrequenciesPerBin_log.size() - 1;
138 return minFrequenciesPerBin_log[index];
154 if (index >= samplesFFT)
155 index = samplesFFT - 1;
167 FFT.windowing(fftWindowing, FFTDirection::Forward);
168 FFT.compute(FFTDirection::Forward);
169 FFT.complexToMagnitude();
175 for (uint16_t i = 0; i < samplesFFTRes; ++i)
177 const T t = fabsf(vReal[i]) * 2.0 / windowSum;
180 const uint16_t octave = _numSamplesPerBar_log[i];
181 assert(octave >= 0 && octave <
fftLog.size());
Definition: arduinoFFT.h:58
Wrapper class for the FFT implementation.
Definition: fft.h:29
T min_bin_frequency(uint16_t index) const noexcept
min frequency of a linear bin
Definition: fft.h:117
T medium_bin_frequency(uint16_t index) const noexcept
center frequency of a linear bin
Definition: fft.h:115
std::array< T, resultSize > fftLog
fft result as a log scale
Definition: fft.h:35
T max_bin_frequency(uint16_t index) const noexcept
max frequency of a linear bin
Definition: fft.h:124
T get_log_bin_max_frequency(uint16_t index) const noexcept
get the minimum frequency represented by the fft bin at index
Definition: fft.h:145
std::array< T, samplesFFTRes > fftBin
output variables
Definition: fft.h:34
T maxMagnitude
maximum detected frequency magnitude
Definition: fft.h:36
T get_log_bin_min_frequency(uint16_t index) const noexcept
get the minimum frequency represented by the fft bin at index
Definition: fft.h:134
void set_data(const T data, uint16_t index)
Set the microphone data at the target index.
Definition: fft.h:152
int to_bin_index(const T frequency) const noexcept
Map frequency to bin index.
Definition: fft.h:110
T maxFrequency
maximum detected frequency, in Hertz
Definition: fft.h:37
void run_fast_fourrier_transform()
Run FFT main code.
Definition: fft.h:162
constexpr int SAMPLE_RATE
Base sample rate in Hz - standard.
Definition: fft.h:21
Program scope.
Definition: control_fixed_modes.hpp:12