Apply equalization to frequency bins.
118 {
119 if (inputBins.size() !=
mConfig.numBands) {
120 FL_WARN(
"SpectralEqualizer: input size mismatch (" << inputBins.size() <<
" != " <<
mConfig.numBands <<
")");
121 return;
122 }
123
124 if (outputBins.size() <
mConfig.numBands) {
125 FL_WARN(
"SpectralEqualizer: output buffer too small (" << outputBins.size() <<
" < " <<
mConfig.numBands <<
")");
126 return;
127 }
128
129
130 float inputPeak = 0.0f;
131 float outputPeak = 0.0f;
132 float inputSum = 0.0f;
133 float outputSum = 0.0f;
134
135
136 for (size i = 0; i <
mConfig.numBands; ++i) {
137 float inputValue = inputBins[i];
139 float outputValue = inputValue * gain;
140
141
142 if (
mConfig.enableCompression) {
144 }
145
146 outputBins[i] = outputValue;
147
148
149 if (inputValue > inputPeak) {
150 inputPeak = inputValue;
151 }
152 if (outputValue > outputPeak) {
153 outputPeak = outputValue;
154 }
155 inputSum += inputValue;
156 outputSum += outputValue;
157 }
158
159
160 float makeupGain = 1.0f;
163
164
165 for (size i = 0; i <
mConfig.numBands; ++i) {
166 outputBins[i] *= makeupGain;
167 }
168
169
170 outputPeak *= makeupGain;
171 outputSum *= makeupGain;
172 }
173
174
175 mStats.applicationsCount++;
176 mStats.lastInputPeak = inputPeak;
177 mStats.lastOutputPeak = outputPeak;
178 mStats.lastMakeupGain = makeupGain;
179 mStats.avgInputLevel = inputSum /
static_cast<float>(
mConfig.numBands);
180 mStats.avgOutputLevel = outputSum /
static_cast<float>(
mConfig.numBands);
181}
float applyCompression(float value) const FL_NO_EXCEPT
Apply dynamic range compression per band.
float calculateMakeupGain(span< const float > inputBins, span< const float > outputBins) const FL_NO_EXCEPT
Calculate makeup gain to maintain target level.
SpectralEqualizerConfig mConfig
vector< float > mGains
Per-band gain multipliers.