#include "randomaccessaudioreadable.h"
#include <Eigen/Dense>

struct SpectrogramResult {
  Eigen::MatrixXf spectrogram;
  Eigen::MatrixXf lgd;
  Eigen::ArrayXf window;
  double hopSize;
};

auto filterbankFrequencies(int bandsPerOctave, double fmin, double fmax,
                           double a = 440.0);

Eigen::MatrixXf filterbank(int numFFTBins, double sampleRate, int bands = 24,
                           double fmin = 30.0, double fmax = 17000.0,
                           bool equal = false);

SpectrogramResult spectrogram(std::shared_ptr<RandomAccessAudioReadable> audio,
                              int frameSize, double fps,
                              const Eigen::MatrixXf &filterbank,
                              bool log = false, float mul = 1.f,
                              float add = 1.f, int blockSize = 2048,
                              bool useLgd = false);

Eigen::ArrayXf superflux(const SpectrogramResult &spectrogram, float ratio);

Eigen::ArrayXf complexflux(const SpectrogramResult &spectrogram,
                           const Eigen::MatrixXf &filterbank, float ratio);