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