如何在C++中使用fft生成音频频谱?

MRa*_*hid 31 c++ audio fft spectrum

我想生成一个mp3音频文件的音频频谱(如本视频所示).基本上这个问题需要计算音频信号的fft.如何在C/C++中编程?

我看过几个开源库,比如FFTW,我真的不知道如何使用这些来解决我的问题.任何帮助将不胜感激.提前致谢!

Pau*_*l R 52

SO上已经有相当多的相似/相关问题值得一读,因为答案中包含了大量有用的信息和建议,但实质上你需要这样做:

  • 将音频数据转换为FFT所需的格式(例如int - > float,单独的L/R通道)
  • 应用合适的窗口功能(例如Hann aka Hanning window)
  • 应用FFT(注意:如果使用典型的复数到复数FFT,则将输入数组的虚部设置为零)
  • 计算第一个N/2 FFT输出箱的大小(sqrt(re*re + im*im))
  • 可选地将幅度转换为dB(log)scale(20 * log10(magnitude))
  • 绘制N/2(对数)幅度值

请注意,虽然FFTW是一个非常好且非常快的FFT,但对于初学者来说可能有点压倒性 - 如果你想将它作为商业产品的一部分包含它也是非常昂贵的 - 我建议从KissFFT开始.

  • 我只想补充一点,如果你正在做一个对数刻度你可以简化 - 而不是计算幅度(用sqrt)然后缩放'20*log10`,取大小的平方(跳过sqrt)然后缩放`10*log10`.在数学上等效,但保存不必要的`sqrt`调用. (12认同)
  • +1 - 我唯一要添加的是将左(或右,无关)通道从音频文件中分离出来的第一步.如果我可以在使用FFTW之前使用KissFFT另外+1. (3认同)