FastLED 3.9.15
Loading...
Searching...
No Matches
frequency_bin_mapper.h
Go to the documentation of this file.
1#pragma once
2
3#include "fl/stl/int.h"
4#include "fl/stl/vector.h"
5#include "fl/stl/span.h"
6#include "fl/stl/noexcept.h"
7
8namespace fl {
9namespace audio {
10
12enum class FrequencyBinMode {
13 Bins16 = 16, // 16-bin mode (default, matches WLED)
14 Bins32 = 32 // 32-bin mode (higher resolution)
15};
16
21
23 float minFrequency = 20.0f;
24
26 float maxFrequency = 16000.0f;
27
29 u32 sampleRate = 22050;
30
33 u32 fftBinCount = 256;
34
37 bool useLogSpacing = true;
38};
39
72public:
74 explicit FrequencyBinMapper(const FrequencyBinMapperConfig& config);
76
79 void configure(const FrequencyBinMapperConfig& config);
80
84 void mapBins(span<const float> fftBins, span<float> outputBins) const;
85
89 float getBassEnergy(span<const float> frequencyBins) const;
90
94 float getMidEnergy(span<const float> frequencyBins) const;
95
99 float getTrebleEnergy(span<const float> frequencyBins) const;
100
105 float minFreq;
106 float maxFreq;
107 };
108 FrequencyRange getBinFrequencyRange(size binIndex) const;
109
111 const FrequencyBinMapperConfig& getConfig() const { return mConfig; }
112
114 size getNumBins() const { return static_cast<size>(mConfig.mode); }
115
117 struct Stats {
118 u32 binMappingCount = 0; // Total bin mappings performed
119 u32 lastFFTBinsUsed = 0; // Number of FFT bins used in last mapping
120 float maxMagnitude = 0.0f; // Maximum magnitude in last mapping
121 };
122
123 const Stats& getStats() const { return mStats; }
124
125private:
128
132
136 float frequencyToFFTBin(float frequency) const;
137
140
143
146
150
153 struct BinMapping {
154 u32 startBin; // First FFT bin (inclusive)
155 u32 endBin; // Last FFT bin (exclusive)
156 };
158
161 static constexpr size BASS_BIN_START = 0;
162 static constexpr size BASS_BIN_END = 2; // Bins 0-1 (exclusive end)
163 static constexpr size MID_BIN_START = 6;
164 static constexpr size MID_BIN_END = 8; // Bins 6-7 (exclusive end)
165 static constexpr size TREBLE_BIN_START = 14;
166 static constexpr size TREBLE_BIN_END = 16; // Bins 14-15 (exclusive end)
167};
168
169} // namespace audio
170} // namespace fl
FrequencyRange getBinFrequencyRange(size binIndex) const
static constexpr size TREBLE_BIN_START
void calculateBinMappings()
Calculate FFT bin to frequency bin mappings Pre-calculates which FFT bins contribute to each frequenc...
float frequencyToFFTBin(float frequency) const
Convert frequency (Hz) to FFT bin index.
static constexpr size BASS_BIN_START
Bass/mid/treble bin indices (for 16-bin mode) These are pre-calculated based on the bin count.
float getBassEnergy(span< const float > frequencyBins) const
Get bass energy (average of bins 0-1 in 16-bin mode)
vector< float > mBinFrequencies
Pre-calculated frequency boundaries for each output bin Size: numBins + 1 (includes both lower and up...
float getMidEnergy(span< const float > frequencyBins) const
Get mid energy (average of bins 6-7 in 16-bin mode)
void mapBins(span< const float > fftBins, span< float > outputBins) const
Map FFT bins to frequency channels.
FrequencyBinMapperConfig mConfig
const FrequencyBinMapperConfig & getConfig() const
Get current configuration.
void calculateLinearFrequencies()
Calculate linearly-spaced frequency boundaries.
void calculateLogFrequencies()
Calculate logarithmically-spaced frequency boundaries.
float getTrebleEnergy(span< const float > frequencyBins) const
Get treble energy (average of bins 14-15 in 16-bin mode)
void calculateBinBoundaries()
Calculate frequency bin boundaries (linear or logarithmic spacing)
size getNumBins() const
Get number of output bins (16 or 32)
void configure(const FrequencyBinMapperConfig &config)
Configure the frequency bin mapper This calculates bin boundaries and FFT-to-frequency bin mappings.
Get frequency boundaries for a specific output bin.
Mapping from output bins to FFT bin ranges Each entry contains (startBin, endBin) for averaging.
Get statistics (for debugging/monitoring)
FrequencyBinMode
Frequency bin mode - controls number of output bins.
bool useLogSpacing
Use logarithmic spacing (recommended for audio) Logarithmic spacing provides better bass/mid/treble s...
u32 fftBinCount
Number of FFT bins available from FFT output For 512-sample FFT at 22050 Hz: 256 bins (512/2)
float minFrequency
Minimum frequency (Hz) - default 20 Hz (bass)
float maxFrequency
Maximum frequency (Hz) - default 16000 Hz (treble)
u32 sampleRate
Sample rate (Hz) - must match FFT sample rate.
FrequencyBinMode mode
Number of output frequency bins (16 or 32)
Configuration for frequency bin mapping.
Base definition for an LED controller.
Definition crgb.hpp:179
#define FL_NOEXCEPT