FastLED 3.10.8
Loading...
Searching...
No Matches

◆ buildLinearBinLut()

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

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

462 {
463 const int numRawBins = fftN / 2 + 1;
464 const int numLinearBins = mTotalBands;
465 lut.resize(numRawBins);
466
467 const u16x16 rawBinHz(static_cast<float>(mSampleRate) /
468 static_cast<float>(fftN));
469 const u16x16 halfBin = rawBinHz >> 1;
470 const u16x16 fminFP(mFmin);
471 const u16x16 fmaxFP(mFmax);
472 const u16x16 linearBinHz(
473 (mFmax - mFmin) / static_cast<float>(numLinearBins));
474
475 // Pre-compute loop bounds (stored for runtime use)
476 mLinearKStart = 0;
477 if (fminFP > halfBin) {
478 mLinearKStart = static_cast<int>(
479 u16x16::ceil((fminFP - halfBin) / rawBinHz).to_int());
480 }
481 mLinearKEnd = static_cast<int>(
482 u16x16::ceil((fmaxFP + halfBin) / rawBinHz).to_int());
483 if (mLinearKEnd > numRawBins) mLinearKEnd = numRawBins;
484
485 for (int k = 0; k < numRawBins; ++k) {
486 u16x16 freq = rawBinHz * static_cast<u32>(k);
487
488 if (freq < fminFP) {
489 lut[k] = 0;
490 continue;
491 }
492 int linIdx = static_cast<int>(
493 ((freq - fminFP) / linearBinHz).to_int());
494 if (linIdx >= numLinearBins)
495 linIdx = numLinearBins - 1;
496 lut[k] = static_cast<u8>(linIdx);
497 }
498 }
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: