Анализ БПФ не в реальном времени для аудио файла - PullRequest
1 голос
/ 25 марта 2012

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

2 голосов
/ 27 марта 2013

Этот пример из официального депо GitHub может вам помочь;они называют это анализ в автономном режиме .

1 голос
/ 25 марта 2012

Вы хотите прочитать часть файла, используя стандартные команды io, а затем использовать FFTW. Смотри http://www.fftw.org/fftw2_doc/fftw_2.html

В качестве альтернативы вы можете написать свой собственный код FFT из фрагментов в режиме онлайн. Это будет быстрее, чем научиться использовать FFTW. Взгляните на эту страницу http://cnx.org/content/m12016/latest/ Кажется, она имеет реализацию C FFT. Если вы уберете воображаемые части, вы получите простую для понимания схему 1D БПФ.

...