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

发布于 2024-10-11 21:37:56 字数 1435 浏览 2 评论 0原文

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

肩上的翅膀 2024-10-18 21:37:57

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

  • 将音频数据转换为 FFT 所需的格式(例如int -> float,具有独立的左/右通道);
  • 应用合适的窗口函数(例如Hann 又名汉宁窗
  • 应用 FFT(注意:如果使用典型的复数到复数 FFT,则将输入数组中的所有虚部设置为零);
  • 计算前 N/2 个 FFT 输出 bin 的幅度 (sqrt(re*re + im*im));
  • 可选择将幅度转换为 dB(对数)刻度(20 * log10(magnitude)10 * log10(re*re + im*im));
  • 绘制 N/2(对数)幅度值。

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

There are quite a few similar/related questions on SO already which are well worth reading as the answers contain a lot of useful information and advice, but in essence you need to do this:

  • Convert the audio data to the format required by FFT (e.g. int -> float, with separate L/R channels);
  • Apply suitable window function (e.g. Hann aka Hanning window)
  • Apply FFT (NB: if using typical complex-to-complex FFT then set all imaginary parts in the input array to zero);
  • Calculate the magnitude of the first N/2 FFT output bins (sqrt(re*re + im*im));
  • Optionally convert magnitude to dB (log) scale (20 * log10(magnitude) or 10 * log10(re*re + im*im));
  • Plot N/2 (log) magnitude values.

Note that while FFTW is a very good and very fast FFT it may be a little overwhelming for a beginner - it's also very expensive if you want to include it as part of a commercial product. I recommend starting with KissFFT instead.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文