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 (%s < %s)", outputBins.
size(), numBins);
135 for (size i = 0; i < numBins; ++i) {
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
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.
FrequencyBinMapper() FL_NO_EXCEPT
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
static constexpr size MID_BIN_END
static constexpr size BASS_BIN_END
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)
~FrequencyBinMapper() FL_NO_EXCEPT
vector< BinMapping > mBinMappings
void configure(const FrequencyBinMapperConfig &config)
Configure the frequency bin mapper This calculates bin boundaries and FFT-to-frequency bin mappings.
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)
constexpr fl::size size() const FL_NO_EXCEPT
Configuration for frequency bin mapping.
float logf(float value) FL_NO_EXCEPT
constexpr enable_if< is_fixed_point< T >::value, T >::type step(T edge, T x) FL_NO_EXCEPT
InputGamut g FL_NO_EXCEPT
float ceilf(float value) FL_NO_EXCEPT
float expf(float value) FL_NO_EXCEPT
Base definition for an LED controller.