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()
127 <<
" < " << numBins <<
")");
136 for (size i = 0; i < numBins; ++i) {
148 if (fftBins[j] > maxMag) {
155 outputBins[i] = sum /
static_cast<float>(count);
157 outputBins[i] = 0.0f;
175 sum += frequencyBins[i];
188 sum += frequencyBins[i];
201 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.
float getBassEnergy(span< const float > frequencyBins) const
Get bass energy (average of bins 0-1 in 16-bin mode)
~FrequencyBinMapper() FL_NOEXCEPT
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)
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
FrequencyBinMapper() FL_NOEXCEPT
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_NOEXCEPT
Configuration for frequency bin mapping.
float expf(float value) FL_NOEXCEPT
float ceilf(float value) FL_NOEXCEPT
constexpr enable_if< is_fixed_point< T >::value, T >::type step(T edge, T x) FL_NOEXCEPT
float logf(float value) FL_NOEXCEPT
Base definition for an LED controller.