33

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

我查看了几个开源库,例如FFTW,但我真的不知道如何使用它们来解决我的问题。任何帮助将不胜感激。提前致谢!

4

1 回答 1

56

已经有很多关于 SO 的类似/相关问题非常值得一读,因为答案包含很多有用的信息和建议,但本质上你需要这样做:

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

请注意,虽然 FFTW 是一种非常好且非常快速的 FFT,但对于初学者来说可能有点难以承受 - 如果您想将其作为商业产品的一部分包含它也非常昂贵 - 我建议从KissFFT开始。

于 2011-01-13T09:06:59.803 回答