getPeaks method
Implementation
List<double> getPeaks(List<double> data, int barCount) {
final stft = STFT(4096, Window.hanning(4096));
final spectrogram = <Float64List>[];
final freqBin = List.generate(65, (i) {
double t = i / 65;
return 15.0 * pow(25000.0 / 15.0, t);
});
// Run STFT
stft.run(data, (Float64x2List freq) {
spectrogram.add(freq.discardConjugates().squareMagnitudes());
});
double fitFactor = 0.9;
List<double> lastSpectrum = List.filled(65, 0.0);
for (var frame in spectrogram) {
for (int j = 0; j < (frame.length); j++) {
double magnitude = frame[j];
double freq = j * data.length / 4096;
for (int i = 0; i < 64; i++) {
if (freq >= freqBin[i] && freq <= freqBin[i + 1]) {
double smoothedValue = max(magnitude, lastSpectrum[i] * fitFactor);
lastSpectrum[i] = smoothedValue.abs();
}
}
}
}
return lastSpectrum;
}