962 {
964 const int numRawBins = N / 2 + 1;
965
967
968
970 s.re.resize(numRawBins);
971 s.im.resize(numRawBins);
972 s.mag.resize(numRawBins);
973 s.windowed.resize(N);
975
976
978
980
982 batchMag(s.re.data(), s.im.data(), s.mag.data(), numRawBins);
983
985
986
988
989
994
995
996 int workLen = N;
997 for (int i = 0; i < N; i++) {
999 (i < static_cast<int>(buffer.size())) ? buffer[i] : 0;
1000 }
1002 workLen /= 2;
1004 workLen /= 2;
1005
1006
1009 int midRawBins = midFftN / 2 + 1;
1010 s.windowed.resize(midFftN);
1014 s.windowed[i] = 0;
1015 }
1017 s.windowed.data(),
1020 batchMag(s.re.data(), s.im.data(), s.mag.data(), midRawBins);
1021
1026 }
1027
1028
1030 workLen /= 2;
1031
1032
1039 s.windowed.data(),
1042 batchMag(s.re.data(), s.im.data(), s.mag.data(), bassRawBins);
1047 }
1048
1049
1050 fl::vector<float> &rawBins = out->raw_mut();
1053 rawBins[i] = static_cast<float>(s.rawBinsI[i]);
1054 }
1055
1056
1058 }
fl::vector< alpha16 > mHybridBassWindow
static void batchMag(const kiss_fft_scalar *re, const kiss_fft_scalar *im, u16 *mag, int n) FL_NO_EXCEPT
void computeLinearBins(const u16 *mag, int, Bins *out) FL_NO_EXCEPT
void logRebinRange(const u16 *mag, int fftN, float fs, int binStart, int binEnd, u32 *rawBinsI, const fl::vector< u8 > &lut) FL_NO_EXCEPT
fl::vector< kiss_fft_scalar > mWorkBuf
fl::vector< alpha16 > mWindowBuf
fl::vector< alpha16 > mHybridMidWindow
fl::vector< kiss_fft_cpx > mHybridMidFftOut
fl::vector< u8 > mLogBinLutMid
fl::vector< kiss_fft_cpx > mHybridSmallFftOut
static FftScratch & scratch() FL_NO_EXCEPT
static void deinterleave(const kiss_fft_cpx *cpx, kiss_fft_scalar *re, kiss_fft_scalar *im, int n) FL_NO_EXCEPT
fl::vector< u8 > mLogBinLutBass
static void applyWindow(const kiss_fft_scalar *samples, const alpha16 *win, kiss_fft_scalar *out, int N) FL_NO_EXCEPT
fl::vector< u8 > mLogBinLut
fl::vector< kiss_fft_cpx > mFftOut
kiss_fftr_cfg mHybridMidFft
static void decimateBy2(kiss_fft_scalar *buf, int len) FL_NO_EXCEPT
fl::vector< float > mHybridMergedNorm
kiss_fftr_cfg mHybridSmallFft
void resize(fl::size n) FL_NO_EXCEPT
void fl_fft_real_forward(kiss_fftr_cfg cfg, int N, const kiss_fft_scalar *in, kiss_fft_cpx *out) FL_NO_EXCEPT
Forward real-to-complex FFT.
FASTLED_FORCE_INLINE void * memset(void *s, int c, size_t n) FL_NO_EXCEPT