【问题标题】:How to generate the audio spectrum using fft in C++? [closed]如何在 C++ 中使用 fft 生成音频频谱? [关闭]
【发布时间】:2011-06-08 05:00:39
【问题描述】:

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

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

【问题讨论】:

  • 您已经了解 C 或 C++ 了吗?如果没有,最好从更简单的开始...
  • 你了解DSP吗? FFTW 是一个很棒的工具,但除非你对傅立叶变换/窗口/分辨率箱/等有任何了解。生产任何东西都会非常困难。
  • FFT 是功率谱密度估计的简单部分(绝对不是硬道理)。还有许多其他考虑因素,尤其是窗口化。谷歌Slepian window 用于最大限度地减少电力泄漏的强大技术。
  • edit您的问题显示the code you have so far。您应该至少包含您遇到问题的代码的大纲(但最好是minimal reproducible example),然后我们可以尝试帮助解决具体问题。您还应该阅读How to Ask

标签: c++ audio fft spectrum


【解决方案1】:

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

  • 将音频数据转换为 FFT 所需的格式(例如 int -> float,单独的 L/R 通道)
  • 申请合适的window function(例如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 开始.

【讨论】:

  • +1 - 我唯一要添加的是将左(或右,无关紧要)通道从音频文件中分离出来的第一步。如果我可以在使用 FFTW 之前使用 KissFFT,还有另一个 +1。
  • @mtrw:感谢 cmets - 在第一步中添加了重新分离 L/R 通道的注释
  • 我只想补充一点,如果你正在做一个对数比例,你可以简化 - 而不是计算幅度(使用 sqrt)然后缩放20*log10,取幅度的平方(跳过 sqrt ) 然后缩放10*log10。数学上等效,但节省了不必要的 sqrt 调用。
  • @Mark:是的,好点,如果你不需要线性幅度,你可以不用 sqrt 直接达到 dB。
  • @PaulR 什么是独立的 L/R 通道?就 FFT 而言,我是新手,我已经开始阅读有关此主题的内容,所以只是古玩?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-05-20
  • 2012-09-18
  • 1970-01-01
  • 2011-09-12
  • 1970-01-01
相关资源
最近更新 更多