getPeaks method

List<double> getPeaks(
  1. List<double> data,
  2. int barCount
)

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;
}