2013-06-30 53 views
3

我想开发音符探测器作为我的学位项目,我想从头开始。我已经编写了用于“.wav”文件的代码,该文件从该音频音乐文件中提取所有信息,并为此给出幅度。如何获得以赫兹为单位的DFT/FFT输出频率?

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

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

我有C语言编写这一点,我不希望使用任何内置库

+0

当你说实轴是振幅而虚轴是相位时,你是在自己计算一下吗?或者直接从DFT中拉出来?当你从DFT得到复杂的结果时,振幅就是结果的绝对值,相位就是结果的角度(又称参数)。 –

+0

是的,我自己计算DFT,意味着我得到的公式是“Sigma从k = 0 - > N-1,对于所有f(x)* W * N,这里W * N = e ^( - i 2 PI/N)“就像这样......我只是把这个公式转换成我的C程序。 – mossad

+2

峰值FFT大小处的频率段频率通常不是音乐音频中的音符音高。 – hotpaw2

回答

10

你需要找到的峰值幅度然后制定出相应的频率:

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

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

+0

对不起保罗R,但我没有得到它。我也计算了我的DFT结果的幅度。现在的问题是我必须找到每个窗口(1024个样本)的i_max?而根据我所读到的关于DFT,我只是在512个样本上找到这个数值,这个数值是我得到最大值的N/2。 m我right.means我想asj dat ..并且也非常感谢你.. :) – mossad

相关问题