Анализ БПФ не в реальном времени для аудио файла

Я пытаюсь запустить спектральный анализ файла. Поскольку файл, который я хотел бы проанализировать, может быть довольно длинным (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 БПФ.

Другие вопросы по тегам