Анализ БПФ не в реальном времени для аудио файла
Я пытаюсь запустить спектральный анализ файла. Поскольку файл, который я хотел бы проанализировать, может быть довольно длинным (40 минут или около того), анализировать его в реальном времени на самом деле не вариант для меня.
В настоящее время я использую класс БПФ Минина, но похоже, что я могу запустить только песню, которая уже играет. Я также посмотрел на библиотеку ess, но понял, что это также ограничено наличием потока в реальном времени.
Есть ли способ просто перебрать аудиофайл небольшими порциями, а затем запустить fft для этих данных?
Вот упрощенная версия того, что я имею сейчас:
void setup()
{
minim = new Minim(this);
frameRate(30);
song = minim.loadFile("../shortfile.mp3", 1024);
song.loop();
fft = new FFT(song.bufferSize(), song.sampleRate());
background(#ffffff);
}
void draw()
{
fft.forward(song.mix);
for(int i = 0; i < height/2; i++)
{
intensity = constrain((log(fft.getBand(i)*1.4) / log(1.15)), 0, 40);
intensity = int(map(intensity, 0 , 40, 0, 255));
stroke(strokeColour(int(intensity)));
point(framecount, i);
}
}
2 ответа
Этот пример из официального депо GitHub может вам помочь; они называют это анализом в автономном режиме.
Вы хотите прочитать часть файла, используя стандартные команды io, а затем использовать FFTW. См. http://www.fftw.org/fftw2_doc/fftw_2.html
Кроме того, вы можете написать свой собственный код FFT из фрагментов в режиме онлайн. Это будет быстрее, чем изучение FFTW. Взгляните на эту страницу http://cnx.org/content/m12016/latest/ Похоже, что это реализация C FFT. Если вы уберете воображаемые части, вы получите простую для понимания схему 1D БПФ.