FastLED 3.9.15
Loading...
Searching...
No Matches

◆ buildLinearBinLut()

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

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

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

References fl::u16x16::ceil(), mFmax, mFmin, mLinearKEnd, mLinearKStart, mSampleRate, mTotalBands, fl::vector< T >::resize(), 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: