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

◆ update()

void fl::audio::detector::FrequencyBands::update ( shared_ptr< Context > context)
overridevirtual

Implements fl::audio::Detector.

Definition at line 45 of file frequency_bands.cpp.hpp.

45 {
46 // Use sample rate from context if available
47 mSampleRate = context->getSampleRate();
48
49 // Use shared master fft::FFT via context (downsampled to our config)
50 mRetainedFFT = context->getFFT(kNumBands, kFFTMinFreq, kFFTMaxFreq);
51 const fft::Bins& fftBins = *mRetainedFFT;
52 sFrequencyBandsFFTCount++; // Diagnostic counter (no private fft::FFT anymore)
53
54 span<const i16> pcm = context->getPCM();
55
56 // Calculate energy for each band using fractional bin overlap
57 float bassEnergy = calculateBandEnergy(fftBins, mBassMin, mBassMax, kFFTMinFreq, kFFTMaxFreq);
58 float midEnergy = calculateBandEnergy(fftBins, mMidMin, mMidMax, kFFTMinFreq, kFFTMaxFreq);
59 float trebleEnergy = calculateBandEnergy(fftBins, mTrebleMin, mTrebleMax, kFFTMinFreq, kFFTMaxFreq);
60
61 // Compute dt from actual audio buffer duration: pcmSize / sampleRate
62 const float dt = computeAudioDt(pcm.size(), mSampleRate);
63 mBass = mBassSmoother.update(bassEnergy, dt);
64 mMid = mMidSmoother.update(midEnergy, dt);
65 mTreble = mTrebleSmoother.update(trebleEnergy, dt);
66
67 // Per-band normalization — mirrors EnergyAnalyzer pattern
68 auto normalizeBand = [](float val, AttackDecayFilter<float>& filter,
69 float frameDt) -> float {
70 float runningMax = filter.update(val, frameDt);
71 if (runningMax < 0.001f) runningMax = 0.001f;
72 return fl::min(1.0f, val / runningMax);
73 };
74 mBassNorm = normalizeBand(mBass, mBassMaxFilter, dt);
75 mMidNorm = normalizeBand(mMid, mMidMaxFilter, dt);
76 mTrebleNorm = normalizeBand(mTreble, mTrebleMaxFilter, dt);
77}
shared_ptr< const fft::Bins > mRetainedFFT
AttackDecayFilter< float > mBassMaxFilter
AttackDecayFilter< float > mTrebleMaxFilter
ExponentialSmoother< float > mBassSmoother
ExponentialSmoother< float > mTrebleSmoother
float calculateBandEnergy(const fft::Bins &fft, float minFreq, float maxFreq, float fftMinFreq, float fftMaxFreq)
AttackDecayFilter< float > mMidMaxFilter
ExponentialSmoother< float > mMidSmoother
float computeAudioDt(fl::size pcmSize, int sampleRate) FL_NOEXCEPT
Compute the time delta (in seconds) for an audio buffer.
FL_DISABLE_WARNING_PUSH U constexpr common_type_t< T, U > min(T a, U b) FL_NOEXCEPT
Definition math.h:71

References FrequencyBands(), calculateBandEnergy(), fl::audio::computeAudioDt(), mBass, mBassMax, mBassMaxFilter, mBassMin, mBassNorm, mBassSmoother, fl::min(), mMid, mMidMax, mMidMaxFilter, mMidMin, mMidNorm, mMidSmoother, mRetainedFFT, mSampleRate, mTreble, mTrebleMax, mTrebleMaxFilter, mTrebleMin, mTrebleNorm, mTrebleSmoother, fl::audio::detector::sFrequencyBandsFFTCount, fl::span< T, Extent >::size(), and update().

Referenced by ~FrequencyBands(), and update().

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