FastLED 3.9.15
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);
92
93 // Detector interface
94 void update(shared_ptr<Context> context) override;
95 void fireCallbacks() override;
96 bool needsFFT() const override { return true; }
97 const char* getName() const override { return "EqualizerDetector"; }
98 void reset() override;
99 void setSampleRate(int rate) override { mSampleRate = rate; }
100
101 // WLED-compatible getters (all return 0.0-1.0)
102 float getBass() const { return mBass; }
103 float getMid() const { return mMid; }
104 float getTreble() const { return mTreble; }
105 float getVolume() const { return mVolume; }
106 float getZcf() const { return mZcf; }
107 float getVolumeNormFactor() const { return mVolumeNormFactor; }
109 float getAutoGain() const { return mVolumeNormFactor; }
110 bool getIsSilence() const { return mIsSilence; }
111 float getBin(int index) const;
112 const float* getBins() const { return mBins; }
113
115 void setMicProfile(MicProfile profile);
116
117 // Callback — single struct with everything
118 function_list<void(const Equalizer&)> onEqualizer;
119
120 // P2 getters
121 float getDominantFreqHz() const { return mDominantFreqHz; }
122 float getDominantMagnitude() const { return mDominantMagnitude; }
123 float getVolumeDb() const { 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;
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 ...
vector< AttackDecayFilter< float > > mBinMaxFilters
Definition equalizer.h:138
void setMicProfile(MicProfile profile)
Set microphone correction profile (propagated from Processor).
void setSampleRate(int rate) override
Definition equalizer.h:99
AttackDecayFilter< float > mVolumeMax
Definition equalizer.h:139
static constexpr float kFFTDownscale
Definition equalizer.h:167
vector< AttackDecayFilter< float > > mBinOutputFilters
Definition equalizer.h:144
void configure(const EqualizerConfig &config)
Reconfigure equalizer tuning parameters at runtime.
vector< ExponentialSmoother< float > > mBinSmoothers
Definition equalizer.h:143
shared_ptr< const fft::Bins > mRetainedFFT
Definition equalizer.h:164
void update(shared_ptr< Context > context) override
function_list< void(const Equalizer &)> onEqualizer
Definition equalizer.h:118
const char * getName() const override
Definition equalizer.h:97
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
Base definition for an LED controller.
Definition crgb.hpp:179
#define FL_NOEXCEPT
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