FastLED 3.9.15
Loading...
Searching...
No Matches
frequency_bands.h
Go to the documentation of this file.
1#pragma once
2
4#include "fl/audio/fft/fft.h"
6#include "fl/stl/function.h"
7#include "fl/stl/shared_ptr.h"
8#include "fl/stl/noexcept.h"
9
10namespace fl {
11namespace audio {
12namespace detector {
13
14class FrequencyBands : public Detector {
15public:
18
19 void update(shared_ptr<Context> context) override;
20 void fireCallbacks() override;
21 bool needsFFT() const override { return true; }
22 const char* getName() const override { return "FrequencyBands"; }
23 void reset() override;
24 void setSampleRate(int sampleRate) override { mSampleRate = sampleRate; }
25
26 // Callbacks (multiple listeners supported)
27 function_list<void(float bass, float mid, float treble)> onLevelsUpdate;
28 function_list<void(float level)> onBassLevel;
29 function_list<void(float level)> onMidLevel;
30 function_list<void(float level)> onTrebleLevel;
31
32 // State access (raw unnormalized values)
33 float getBass() const { return mBass; }
34 float getMid() const { return mMid; }
35 float getTreble() const { return mTreble; }
36
37 // Per-band normalized values (0.0 - 1.0, self-referential via running max)
38 float getBassNorm() const { return mBassNorm; }
39 float getMidNorm() const { return mMidNorm; }
40 float getTrebleNorm() const { return mTrebleNorm; }
41
42 // Configuration - set frequency ranges (in Hz)
43 void setBassRange(float min, float max) { mBassMin = min; mBassMax = max; }
44 void setMidRange(float min, float max) { mMidMin = min; mMidMax = max; }
45 void setTrebleRange(float min, float max) { mTrebleMin = min; mTrebleMax = max; }
46
47 // Smoothing time constant in seconds (higher = smoother)
48 void setSmoothing(float tau) { mBassSmoother.setTau(tau); mMidSmoother.setTau(tau); mTrebleSmoother.setTau(tau); }
49
50 int getSampleRate() const { return mSampleRate; }
51
52 // Diagnostic counters
53 static int getPrivateFFTCount();
54 static void resetPrivateFFTCount();
55
56private:
57 int mSampleRate = 44100;
58 float mBass;
59 float mMid;
60 float mTreble;
61
62 // Frequency ranges (Hz)
63 float mBassMin;
64 float mBassMax;
65 float mMidMin;
66 float mMidMax;
69
70 // Smoothing (time-aware exponential smoothing)
74
75 // Per-band adaptive normalization (same pattern as EnergyAnalyzer)
79 float mBassNorm = 0.0f;
80 float mMidNorm = 0.0f;
81 float mTrebleNorm = 0.0f;
82
83 // Retained FFT from context (keeps shared_ptr alive during update)
85
86 float calculateBandEnergy(const fft::Bins& fft, float minFreq, float maxFreq,
87 float fftMinFreq, float fftMaxFreq);
88};
89
90} // namespace detector
91} // namespace audio
92} // namespace fl
void setSampleRate(int sampleRate) override
~FrequencyBands() FL_NOEXCEPT override
function_list< void(float level)> onBassLevel
void setBassRange(float min, float max)
shared_ptr< const fft::Bins > mRetainedFFT
AttackDecayFilter< float > mBassMaxFilter
AttackDecayFilter< float > mTrebleMaxFilter
void setTrebleRange(float min, float max)
function_list< void(float level)> onTrebleLevel
function_list< void(float level)> onMidLevel
ExponentialSmoother< float > mBassSmoother
void update(shared_ptr< Context > context) override
ExponentialSmoother< float > mTrebleSmoother
float calculateBandEnergy(const fft::Bins &fft, float minFreq, float maxFreq, float fftMinFreq, float fftMaxFreq)
function_list< void(float bass, float mid, float treble)> onLevelsUpdate
void setMidRange(float min, float max)
AttackDecayFilter< float > mMidMaxFilter
ExponentialSmoother< float > mMidSmoother
const char * getName() const override
FL_DISABLE_WARNING_PUSH U constexpr common_type_t< T, U > min(T a, U b) FL_NOEXCEPT
Definition math.h:71
constexpr common_type_t< T, U > max(T a, U b) FL_NOEXCEPT
Definition math.h:75
Base definition for an LED controller.
Definition crgb.hpp:179
#define FL_NOEXCEPT