1

我正在尝试对文件进行频谱分析。由于我要分析的文件可能很长(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);
  }
}
4

2 回答 2

2

这个来自官方 GitHub 仓库的示例可能会对您有所帮助;他们称之为离线分析

于 2013-03-27T08:30:57.320 回答
1

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

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

于 2012-03-24T23:43:56.710 回答