音频文件的非实时FFT分析

时间:2012-03-24 20:13:03

标签: processing minim

我正在尝试对文件进行频谱分析。由于我想分析的文件可能很长(大约40分钟),因此实时分析这个文件并不是我的选择。

我目前正在使用Minin的FFT类,但看起来我只能播放已播放的歌曲。我也看了ess library,但我明白这也只限于实时流。

有没有办法在小块中迭代一个音频文件,然后在该数据上运行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 个答案:

答案 0 :(得分:2)

来自官方GitHub仓库的这个例子可能对你有帮助;他们称之为offline analysis

答案 1 :(得分:1)

您想使用标准io命令读取部分文件,然后使用FFTW。见http://www.fftw.org/fftw2_doc/fftw_2.html

或者,您可以在线创建自己的代码片段。这将比学习如何使用FFTW更快。看看这个页面http://cnx.org/content/m12016/latest/它似乎有一个C FFT实现。如果你去掉虚部,你会得到一个易于理解的1D FFT方案。