【问题标题】:How can I get DFT/FFT output frequencies in Hertz?如何获得以赫兹为单位的 DFT/FFT 输出频率?
【发布时间】:2013-06-27 18:14:21
【问题描述】:

我想开发音符检测器作为我的学位项目,我想从头开始。我已经为“.wav”文件编写了代码,该文件从该音频音乐文件中提取所有信息并给出幅度作为结果。

然后我为 DFT 编写了一个代码 - 它以复数形式输出,其中一个轴(实数/虚数)是幅度/幅度,另一个是相位。

现在我想要频率的答案(赫兹而不是矢量)的问题,所以我可以检查我的 DFT 是否给了我正确的输出。如何将我的 DFT 输出转换为频率?

我必须用 C 语言编写代码,我不想使用任何内置库

【问题讨论】:

  • 当你说实轴是幅度,虚轴是相位,你是在自己计算吗?还是直接从 DFT 中提取?当您从 DFT 获得复数结果时,幅度是该结果的绝对值,相位是结果的角度(也称为参数)。
  • 是的,我自己在计算 DFT,这意味着我得到的公式是“ Sigma From k=0 -> N-1 , For all f(x)* WN,here WN=e^(-i 2 PI /N)" 像这样......我只是把这个公式转换成我的 C 程序。
  • FFT 幅度峰值处的 bin 频率通常不是音乐音频中的音符音高。
  • @hotpaw2,我很难学到这一点。那么,在音频剪辑中找到主要音高的正确方法是什么?

标签: c audio fft dft


【解决方案1】:

你需要找到峰值幅度然后算出对应的频率:

  • 计算每个DFT输出bin的大小:magnitude = sqrt(re*re+im*im)
  • 找到幅度最大的 bin,将其索引称为 i_max
  • 计算此 bin 的等效频率:freq = i_max * Fs / N,此处 Fs = 采样率 (Hz),N = FFT 中的点数。

请参阅this answer,了解有关 bin 索引和频率如何相关的更详细说明。

【讨论】:

  • 抱歉 Paul R 但我没有得到它。我还根据我的 DFT 结果计算了幅度。现在的问题是我必须为每个窗口(1024 个样本)找到 i_max?根据我读到的关于 DFT 的内容,我只是在 512 个样本上找到了这个幅度,即 N/2,我得到了最大值。我是对的。意思是我想 asj dat ..也非常感谢你..:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-04-20
  • 2016-08-15
  • 2020-05-22
  • 2011-05-20
相关资源
最近更新 更多