FastLED 3.10.6
Loading...
Searching...
No Matches

◆ update()

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

Implements fl::audio::Detector.

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

49 {
50 // Use sample rate from context if available
51 mSampleRate = context->getSampleRate();
52
53 // Use shared master fft::FFT via context (downsampled to our config)
54 mRetainedFFT = context->getFFT(kNumBands, kFFTMinFreq, kFFTMaxFreq);
55 const fft::Bins& fftBins = *mRetainedFFT;
56 sFrequencyBandsFFTCount++; // Diagnostic counter (no private fft::FFT anymore)
57
58 span<const i16> pcm = context->getPCM();
59
60 // Calculate energy for each band using fractional bin overlap
61 float bassEnergy = calculateBandEnergy(fftBins, mBassMin, mBassMax, kFFTMinFreq, kFFTMaxFreq);
62 float midEnergy = calculateBandEnergy(fftBins, mMidMin, mMidMax, kFFTMinFreq, kFFTMaxFreq);
63 float trebleEnergy = calculateBandEnergy(fftBins, mTrebleMin, mTrebleMax, kFFTMinFreq, kFFTMaxFreq);
64
65 // Compute dt from actual audio buffer duration: pcmSize / sampleRate
66 const float dt = computeAudioDt(pcm.size(), mSampleRate);
67 mBass = mBassSmoother.update(bassEnergy, dt);
68 mMid = mMidSmoother.update(midEnergy, dt);
69 mTreble = mTrebleSmoother.update(trebleEnergy, dt);
70
71 // Per-band normalization — mirrors EnergyAnalyzer pattern
72 auto normalizeBand = [](float val, AttackDecayFilter<float>& filter,
73 float frameDt) -> float {
74 float runningMax = filter.update(val, frameDt);
75 if (runningMax < 0.001f) runningMax = 0.001f;
76 return fl::min(1.0f, val / runningMax);
77 };
78 mBassNorm = normalizeBand(mBass, mBassMaxFilter, dt);
79 mMidNorm = normalizeBand(mMid, mMidMaxFilter, dt);
80 mTrebleNorm = normalizeBand(mTreble, mTrebleMaxFilter, dt);
81}
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_NO_EXCEPT
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_NO_EXCEPT
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: