37 const size numBins =
static_cast<size
>(
mConfig.mode);
51 const size numBins =
static_cast<size
>(
mConfig.mode);
54 const float logStep = (logMax - logMin) /
static_cast<float>(numBins);
57 for (size i = 0; i <= numBins; ++i) {
58 float logFreq = logMin +
static_cast<float>(i) * logStep;
65 const size numBins =
static_cast<size
>(
mConfig.mode);
66 const float step = (
mConfig.maxFrequency -
mConfig.minFrequency) /
static_cast<float>(numBins);
69 for (size i = 0; i <= numBins; ++i) {
70 float freq =
mConfig.minFrequency +
static_cast<float>(i) *
step;
76 const size numBins =
static_cast<size
>(
mConfig.mode);
82 for (size i = 0; i < numBins; ++i) {
91 u32 startBin =
static_cast<u32
>(startBinFloat);
92 u32 endBin =
static_cast<u32
>(
fl::ceilf(endBinFloat));
95 if (startBin >=
mConfig.fftBinCount) {
96 startBin =
mConfig.fftBinCount - 1;
98 if (endBin >
mConfig.fftBinCount) {
103 if (endBin <= startBin) {
104 endBin = startBin + 1;
117 const float fftSize =
static_cast<float>(
mConfig.fftBinCount) * 2.0f;
118 return (frequency /
static_cast<float>(
mConfig.sampleRate)) * fftSize;
122 const size numBins =
static_cast<size
>(
mConfig.mode);
125 if (outputBins.size() < numBins) {
126 FL_WARN(
"FrequencyBinMapper: output buffer too small (" << outputBins.size() <<
" < " << numBins <<
")");
135 for (size i = 0; i < numBins; ++i) {
142 for (u32 j = mapping.
startBin; j < mapping.
endBin && j < fftBins.size(); ++j) {
147 if (fftBins[j] > maxMag) {
154 outputBins[i] = sum /
static_cast<float>(count);
156 outputBins[i] = 0.0f;
174 sum += frequencyBins[i];
187 sum += frequencyBins[i];
200 sum += frequencyBins[i];
static constexpr size TREBLE_BIN_END
FrequencyRange getBinFrequencyRange(size binIndex) const FL_NO_EXCEPT
void configure(const FrequencyBinMapperConfig &config) FL_NO_EXCEPT
Configure the frequency bin mapper This calculates bin boundaries and FFT-to-frequency bin mappings.
static constexpr size TREBLE_BIN_START
float getBassEnergy(span< const float > frequencyBins) const FL_NO_EXCEPT
Get bass energy (average of bins 0-1 in 16-bin mode)
void calculateLogFrequencies() FL_NO_EXCEPT
Calculate logarithmically-spaced frequency boundaries.
float frequencyToFFTBin(float frequency) const FL_NO_EXCEPT
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.
FrequencyBinMapper() FL_NO_EXCEPT
vector< float > mBinFrequencies
Pre-calculated frequency boundaries for each output bin Size: numBins + 1 (includes both lower and up...
void calculateLinearFrequencies() FL_NO_EXCEPT
Calculate linearly-spaced frequency boundaries.
float getTrebleEnergy(span< const float > frequencyBins) const FL_NO_EXCEPT
Get treble energy (average of bins 14-15 in 16-bin mode)
FrequencyBinMapperConfig mConfig
static constexpr size MID_BIN_END
float getMidEnergy(span< const float > frequencyBins) const FL_NO_EXCEPT
Get mid energy (average of bins 6-7 in 16-bin mode)
static constexpr size BASS_BIN_END
void calculateBinBoundaries() FL_NO_EXCEPT
Calculate frequency bin boundaries (linear or logarithmic spacing)
void calculateBinMappings() FL_NO_EXCEPT
Calculate FFT bin to frequency bin mappings Pre-calculates which FFT bins contribute to each frequenc...
void mapBins(span< const float > fftBins, span< float > outputBins) const FL_NO_EXCEPT
Map FFT bins to frequency channels.
~FrequencyBinMapper() FL_NO_EXCEPT
vector< BinMapping > mBinMappings
static constexpr size MID_BIN_START
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)
Configuration for frequency bin mapping.
float logf(float value) FL_NO_EXCEPT
u8 u8 fract8 blur_amount FL_NO_EXCEPT
constexpr enable_if< is_fixed_point< T >::value, T >::type step(T edge, T x) FL_NO_EXCEPT
float ceilf(float value) FL_NO_EXCEPT
float expf(float value) FL_NO_EXCEPT
Base definition for an LED controller.