public List<SpectralImage> CreateLogSpectrogram(AudioSamples audioSamples, SpectrogramConfig configuration)
{
int width = (audioSamples.Samples.Length - configuration.WdftSize) / configuration.Overlap;
if (width < 1)
{
return new List<SpectralImage>();
}
float[][] frames = new float[width][];
int[] logFrequenciesIndexes = logUtility.GenerateLogFrequenciesRanges(audioSamples.SampleRate, configuration);
float[] window = configuration.Window.GetWindow(configuration.WdftSize);
Parallel.For(0, width, i => {
float[] complexSignal = fftService.FFTForward(audioSamples.Samples, i * configuration.Overlap, configuration.WdftSize, window);
frames[i] = ExtractLogBins(complexSignal, logFrequenciesIndexes, configuration.LogBins, configuration.WdftSize);
});
return CutLogarithmizedSpectrum(frames, audioSamples.SampleRate, configuration);
}