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