FastLED 3.10.9
Loading...
Searching...
No Matches

◆ buildLinearBinLut()

void fl::audio::fft::Context::buildLinearBinLut ( fl::vector< u8 > & lut,
int fftN )
inlineprivate

Definition at line 461 of file fft_impl.cpp.hpp.

461 {
462 const int numRawBins = fftN / 2 + 1;
463 const int numLinearBins = mTotalBands;
464 lut.resize(numRawBins);
465
466 const u16x16 rawBinHz(static_cast<float>(mSampleRate) /
467 static_cast<float>(fftN));
468 const u16x16 halfBin = rawBinHz >> 1;
469 const u16x16 fminFP(mFmin);
470 const u16x16 fmaxFP(mFmax);
471 const u16x16 linearBinHz(
472 (mFmax - mFmin) / static_cast<float>(numLinearBins));
473
474 // Pre-compute loop bounds (stored for runtime use)
475 mLinearKStart = 0;
476 if (fminFP > halfBin) {
477 mLinearKStart = static_cast<int>(
478 u16x16::ceil((fminFP - halfBin) / rawBinHz).to_int());
479 }
480 mLinearKEnd = static_cast<int>(
481 u16x16::ceil((fmaxFP + halfBin) / rawBinHz).to_int());
482 if (mLinearKEnd > numRawBins) mLinearKEnd = numRawBins;
483
484 for (int k = 0; k < numRawBins; ++k) {
485 u16x16 freq = rawBinHz * static_cast<u32>(k);
486
487 if (freq < fminFP) {
488 lut[k] = 0;
489 continue;
490 }
491 int linIdx = static_cast<int>(
492 ((freq - fminFP) / linearBinHz).to_int());
493 if (linIdx >= numLinearBins)
494 linIdx = numLinearBins - 1;
495 lut[k] = static_cast<u8>(linIdx);
496 }
497 }
constexpr u32 to_int() const FL_NO_EXCEPT
Definition u16x16.h:61
static constexpr FASTLED_FORCE_INLINE u16x16 ceil(u16x16 x) FL_NO_EXCEPT
Definition u16x16.h:142
void resize(fl::size n) FL_NO_EXCEPT
Definition vector.h:593
unsigned char u8
Definition stdint.h:131

References fl::u16x16::ceil(), fl::FL_NO_EXCEPT, mFmax, mFmin, mLinearKEnd, mLinearKStart, mSampleRate, mTotalBands, and fl::u16x16::to_int().

Referenced by initHybrid(), initLogRebin(), initNaive(), and initOctaveWise().

+ Here is the call graph for this function:
+ Here is the caller graph for this function: