FastLED 3.10.8
Loading...
Searching...
No Matches
equalizer.h
Go to the documentation of this file.
1#pragma once
2
6#include "fl/stl/function.h"
7#include "fl/stl/span.h"
8#include "fl/stl/vector.h"
9#include "fl/stl/noexcept.h"
10
11namespace fl {
12namespace audio {
13namespace detector {
14
23
27 float minFreq = 90.0f;
28 float maxFreq = 5120.0f;
29 float smoothing = 0.05f;
30 float normAttack = 0.001f;
31 float normDecay = 4.0f;
32 float silenceThreshold = 10.0f;
33
38 float outputAttack = 0.0f;
39 float outputDecay = 0.0f;
40
43
46};
47
49struct Equalizer {
50 static constexpr int kNumBins = 16;
51 float bass = 0;
52 float mid = 0;
53 float treble = 0;
54 float volume = 0;
55 float zcf = 0;
56 float volumeNormFactor = 1.0f;
57 bool isSilence = false;
59
60 // P2 features: peak detection and dB mapping
61 float dominantFreqHz = 0.0f;
62 float dominantMagnitude = 0.0f;
63 float volumeDb = -100.0f;
64};
65
84public:
85 static constexpr int kNumBins = 16;
86
89
91 void configure(const EqualizerConfig& config) FL_NO_EXCEPT;
92
93 // Detector interface
94 void update(shared_ptr<Context> context) FL_NO_EXCEPT override;
95 void fireCallbacks() FL_NO_EXCEPT override;
96 bool needsFFT() const FL_NO_EXCEPT override { return true; }
97 const char* getName() const FL_NO_EXCEPT override { return "EqualizerDetector"; }
98 void reset() FL_NO_EXCEPT override;
99 void setSampleRate(int rate) FL_NO_EXCEPT override { mSampleRate = rate; }
100
101 // WLED-compatible getters (all return 0.0-1.0)
102 float getBass() const FL_NO_EXCEPT { return mBass; }
103 float getMid() const FL_NO_EXCEPT { return mMid; }
104 float getTreble() const FL_NO_EXCEPT { return mTreble; }
105 float getVolume() const FL_NO_EXCEPT { return mVolume; }
106 float getZcf() const FL_NO_EXCEPT { return mZcf; }
110 bool getIsSilence() const FL_NO_EXCEPT { return mIsSilence; }
111 float getBin(int index) const FL_NO_EXCEPT;
112 const float* getBins() const FL_NO_EXCEPT { return mBins; }
113
116
117 // Callback — single struct with everything
118 function_list<void(const Equalizer&)> onEqualizer;
119
120 // P2 getters
123 float getVolumeDb() const FL_NO_EXCEPT { return mVolumeDb; }
124
125private:
127 int mSampleRate = 44100;
128 float mBins[kNumBins] = {};
129 float mBass = 0, mMid = 0, mTreble = 0, mVolume = 0, mZcf = 0;
130 float mVolumeNormFactor = 1.0f;
131 bool mIsSilence = false;
132 float mGain = 1.0f;
133 float mDominantFreqHz = 0.0f;
134 float mDominantMagnitude = 0.0f;
135 float mVolumeDb = -100.0f;
136
137 // Per-bin adaptive normalization (running max with slow decay)
140
141 // Smoothing for output stability — may be ExponentialSmoother or AttackDecayFilter
142 // depending on whether outputAttack/outputDecay are set
146
147 // Spectral equalization (optional, applied to raw bins before normalization)
149 float mEqBuffer[kNumBins] = {};
150
151 // Microphone correction gains (applied before spectral EQ)
152 float mMicGains[kNumBins] = {};
153 bool mHasMicCorrection = false;
155
156 // Pink noise spectral tilt compensation (always active)
159
160 // Compute log-spaced bin center frequencies from current config
161 void computeBinCenters(float* out) const FL_NO_EXCEPT;
162
163 // Cached FFT from Context (shared across detector)
165
166 // FFT windowing correction factor (WLED-MM FFT_DOWNSCALE = 0.40)
167 static constexpr float kFFTDownscale = 0.40f;
168};
169
170} // namespace detector
171} // namespace audio
172} // namespace fl
SpectralEqualizer applies frequency-dependent gain correction to address mid-frequency dominance and ...
void computeBinCenters(float *out) const FL_NO_EXCEPT
void update(shared_ptr< Context > context) FL_NO_EXCEPT override
const float * getBins() const FL_NO_EXCEPT
Definition equalizer.h:112
vector< AttackDecayFilter< float > > mBinMaxFilters
Definition equalizer.h:138
float getDominantFreqHz() const FL_NO_EXCEPT
Definition equalizer.h:121
AttackDecayFilter< float > mVolumeMax
Definition equalizer.h:139
float getVolumeNormFactor() const FL_NO_EXCEPT
Definition equalizer.h:107
bool getIsSilence() const FL_NO_EXCEPT
Definition equalizer.h:110
float getVolumeDb() const FL_NO_EXCEPT
Definition equalizer.h:123
bool needsFFT() const FL_NO_EXCEPT override
Definition equalizer.h:96
void fireCallbacks() FL_NO_EXCEPT override
static constexpr float kFFTDownscale
Definition equalizer.h:167
const char * getName() const FL_NO_EXCEPT override
Definition equalizer.h:97
vector< AttackDecayFilter< float > > mBinOutputFilters
Definition equalizer.h:144
void configure(const EqualizerConfig &config) FL_NO_EXCEPT
Reconfigure equalizer tuning parameters at runtime.
float getZcf() const FL_NO_EXCEPT
Definition equalizer.h:106
float getAutoGain() const FL_NO_EXCEPT
Definition equalizer.h:109
float getMid() const FL_NO_EXCEPT
Definition equalizer.h:103
vector< ExponentialSmoother< float > > mBinSmoothers
Definition equalizer.h:143
void setSampleRate(int rate) FL_NO_EXCEPT override
Definition equalizer.h:99
shared_ptr< const fft::Bins > mRetainedFFT
Definition equalizer.h:164
void reset() FL_NO_EXCEPT override
function_list< void(const Equalizer &)> onEqualizer
Definition equalizer.h:118
float getBass() const FL_NO_EXCEPT
Definition equalizer.h:102
float getTreble() const FL_NO_EXCEPT
Definition equalizer.h:104
float getBin(int index) const FL_NO_EXCEPT
float getDominantMagnitude() const FL_NO_EXCEPT
Definition equalizer.h:122
float getVolume() const FL_NO_EXCEPT
Definition equalizer.h:105
void setMicProfile(MicProfile profile) FL_NO_EXCEPT
Set microphone correction profile (propagated from Processor).
#define constexpr
Declares that it is possible to evaluate a value at compile time, introduced in C++11.
Definition cpp_compat.h:15
FFTScalingMode
FFT bin scaling mode applied before per-bin normalization.
Definition equalizer.h:17
@ Logarithmic
Log10(1 + magnitude) — compresses high peaks.
Definition equalizer.h:20
@ Linear
Identity (same as None, explicit name for WLED compat)
Definition equalizer.h:21
@ None
Raw magnitudes (no scaling)
Definition equalizer.h:18
@ SquareRoot
Square root of magnitude (WLED-MM default, good perceptual balance)
Definition equalizer.h:19
float outputAttack
Output smoothing with separate attack/decay (dynamics limiter).
Definition equalizer.h:38
float normAttack
Normalization attack time (seconds)
Definition equalizer.h:30
float minFreq
Low end of spectrum (Hz). Must be >= FFT bin width (sampleRate/fftSize, e.g. 86 Hz at 44100/512) to e...
Definition equalizer.h:27
float silenceThreshold
Raw RMS threshold for silence detection.
Definition equalizer.h:32
FFTScalingMode scalingMode
FFT bin scaling mode applied to raw magnitudes before normalization.
Definition equalizer.h:42
float outputDecay
Output decay time (seconds). 0 = use smoothing tau.
Definition equalizer.h:39
EqualizationCurve curve
Spectral equalization curve applied to FFT bins before normalization.
Definition equalizer.h:45
float normDecay
Normalization decay time (seconds)
Definition equalizer.h:31
float smoothing
Bin temporal smoothing (ExponentialSmoother tau, used as attack)
Definition equalizer.h:29
float maxFreq
High end of spectrum (Hz)
Definition equalizer.h:28
Configuration for the equalizer detector.
Definition equalizer.h:26
MicProfile
Microphone frequency response correction profile.
@ None
No correction (flat response assumed)
EqualizationCurve
Equalization curve type.
unsigned char u8
Definition stdint.h:131
u8 u8 fract8 blur_amount FL_NO_EXCEPT
Definition blur.h:186
Base definition for an LED controller.
span< const float, kNumBins > bins
16 bins, each 0.0-1.0
Definition equalizer.h:58
float volumeNormFactor
Volume normalization factor (1/volumeMax). Higher = quieter input was scaled more.
Definition equalizer.h:56
float dominantFreqHz
Frequency of strongest bin (Hz)
Definition equalizer.h:61
float volume
0.0-1.0 (self-normalized RMS)
Definition equalizer.h:54
static constexpr int kNumBins
Definition equalizer.h:50
bool isSilence
True when input signal is effectively silent.
Definition equalizer.h:57
float dominantMagnitude
Magnitude of strongest bin (0.0-1.0, normalized)
Definition equalizer.h:62
float volumeDb
Volume in approximate dB (roughly -100 to 0)
Definition equalizer.h:63
float zcf
0.0-1.0 (zero-crossing factor)
Definition equalizer.h:55
Snapshot of equalizer state, passed to onEqualizer callbacks.
Definition equalizer.h:49