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

C++ 如何在C+中使用fft生成音频频谱+;?,c++,audio,fft,spectrum,C++,Audio,Fft,Spectrum,我想生成mp3音频文件的音频频谱(如中所示)。基本上,这个问题需要计算音频信号的fft。如何用C/C++编程 我看过一些开源库,比如,我真的不知道如何使用它们来解决我的问题。任何帮助都将不胜感激。提前谢谢 关于SO,已经有很多类似/相关的问题值得一读,因为答案包含很多有用的信息和建议,但本质上你需要这样做: 将音频数据转换为FFT所需的格式(例如int->float,单独的L/R通道) 使用合适的(例如) 应用FFT(注意:如果使用典型的复到复FFT,则将输入阵列的虚部设置为零) 计算前N/2

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


我看过一些开源库,比如,我真的不知道如何使用它们来解决我的问题。任何帮助都将不胜感激。提前谢谢

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

  • 将音频数据转换为FFT所需的格式(例如int->float,单独的L/R通道)
  • 使用合适的(例如)
  • 应用FFT(注意:如果使用典型的复到复FFT,则将输入阵列的虚部设置为零)
  • 计算前N/2个FFT输出单元的大小(
    sqrt(re*re+im*im)
  • 可选地将幅值转换为dB(对数)刻度(
    20*log10(幅值)
  • 图N/2(对数)震级值

请注意,虽然FFTW是一个非常好的、非常快的FFT,但初学者可能有点难以承受,如果你想把它作为商业产品的一部分,它也非常昂贵。我建议你从它开始。

你已经知道C还是C++了?如果没有,最好从简单的开始…看看你对DSP有什么了解吗?FFTW是一个很棒的工具,但除非你对傅里叶变换/窗口/分辨率箱等有任何了解,否则很难产生任何东西。FFT是功率谱密度估计的简单部分(绝对不是最后一个词)。还有许多其他考虑因素,尤其是窗口。谷歌
Slepian窗口
,提供可最大限度减少漏电的可靠技术。请展示您的问题。您应该至少包括您遇到问题的代码的大纲(但最好是a),然后我们可以尝试帮助解决特定问题。您还应该阅读。+1-我要添加的唯一内容是第一步,将左侧(或右侧,无所谓)通道从音频文件中分离出来。还有一个+1,如果我能在处理FFTW之前使用KissFFT的话。@mtrw:感谢您的评论-添加注释-在第一步重新分离L/R通道-我只想添加一点,如果您使用对数刻度,您可以简化-而不是计算大小(使用sqrt),然后缩放
20*log10
,取大小的平方(跳过sqrt)然后缩放
10*log10
。在数学上是等效的,但保存了一个不必要的
sqrt
调用。@马克:是的,很好的观点,如果你不需要线性幅度,你可以直接进入dB。@PaulR什么是独立的L/R通道?我是FFTs的新手,我已经开始阅读关于这个主题的内容,所以我只是cur网间网操作系统?