146 {
147 auto bins =
fft.raw();
148 int n = static_cast<int>(bins.size());
149 if (n < 16) {
156 return;
157 }
158
159
160
161
162
163
164 int bassCutBin =
fl::max(1,
fft.freqToBin(300.0f));
165 int trebleCutBin =
fl::max(bassCutBin + 1,
fft.freqToBin(2000.0f));
166 int clickLoBin =
fl::max(bassCutBin,
fft.freqToBin(1500.0f));
167 int clickHiBin =
fl::min(n - 1,
fft.freqToBin(4500.0f));
168
169 float bassSum = 0.0f;
170 for (int i = 0; i <= bassCutBin; ++i) bassSum += bins[i];
171
172 float midSum = 0.0f;
173 for (int i = bassCutBin + 1; i < trebleCutBin; ++i) midSum += bins[i];
174
175 float trebleSum = 0.0f;
176 for (int i = trebleCutBin; i < n; ++i) trebleSum += bins[i];
177
178
179 float clickBandSum = 0.0f;
180 for (int i = clickLoBin; i <= clickHiBin; ++i) clickBandSum += bins[i];
181
182
183 float upperMidSum = midSum;
184
185 float total = bassSum + midSum + trebleSum;
186
187
188 mBassToTotal = (total > 1e-6f) ? bassSum / total : 0.0f;
189
190
192
193
194 mClickRatio = (upperMidSum > 1e-6f) ? clickBandSum / upperMidSum : 0.0f;
195
196
197 mMidToTreble = (trebleSum > 1e-6f) ? midSum / trebleSum : 0.0f;
198
199
200 int firstMidBin = bassCutBin + 1;
201 mSubBassProxy = (firstMidBin < n && bins[firstMidBin] > 1e-6f)
202 ? bins[0] / bins[firstMidBin]
203 : 0.0f;
204
205
206 int trebleBinCount = n - trebleCutBin;
207 float trebleArithMean = (trebleBinCount > 0) ? trebleSum / static_cast<float>(trebleBinCount) : 0.0f;
208 if (trebleArithMean > 1e-6f) {
209 float sumLog = 0.0f;
210 int validCount = 0;
211 for (int i = trebleCutBin; i < n; ++i) {
212 if (bins[i] > 1e-6f) {
214 ++validCount;
215 }
216 }
217 if (validCount > 0) {
218 float geoMean =
fl::expf(sumLog /
static_cast<float>(validCount));
220 } else {
222 }
223 } else {
225 }
226}
FL_DISABLE_WARNING_PUSH U constexpr common_type_t< T, U > min(T a, U b) FL_NOEXCEPT
constexpr common_type_t< T, U > max(T a, U b) FL_NOEXCEPT
float expf(float value) FL_NOEXCEPT
float logf(float value) FL_NOEXCEPT