我想开发音符探测器作为我的学位项目,我想从头开始。我已经编写了用于“.wav”文件的代码,该文件从该音频音乐文件中提取所有信息,并为此给出幅度。如何获得以赫兹为单位的DFT/FFT输出频率?
然后我写了一个DFT的代码 - 它给我输出一个复数,其中一个轴(实数/虚数)是振幅/幅度,另一个是相位。
现在我想要的答案在频率(赫兹不在向量)的问题,所以我可以检查我的DFT是否给我正确的输出。我如何将我的DFT输出转换为频率?
我有C语言编写这一点,我不希望使用任何内置库
我想开发音符探测器作为我的学位项目,我想从头开始。我已经编写了用于“.wav”文件的代码,该文件从该音频音乐文件中提取所有信息,并为此给出幅度。如何获得以赫兹为单位的DFT/FFT输出频率?
然后我写了一个DFT的代码 - 它给我输出一个复数,其中一个轴(实数/虚数)是振幅/幅度,另一个是相位。
现在我想要的答案在频率(赫兹不在向量)的问题,所以我可以检查我的DFT是否给我正确的输出。我如何将我的DFT输出转换为频率?
我有C语言编写这一点,我不希望使用任何内置库
你需要找到的峰值幅度然后制定出相应的频率:
magnitude = sqrt(re*re+im*im)
i_max
。freq = i_max * Fs/N
,这里Fs
=采样率(Hz)和N
= FFT中没有点。请参阅this answer了解bin索引和频率如何相关的更详细说明。
对不起保罗R,但我没有得到它。我也计算了我的DFT结果的幅度。现在的问题是我必须找到每个窗口(1024个样本)的i_max?而根据我所读到的关于DFT,我只是在512个样本上找到这个数值,这个数值是我得到最大值的N/2。 m我right.means我想asj dat ..并且也非常感谢你.. :) – mossad
当你说实轴是振幅而虚轴是相位时,你是在自己计算一下吗?或者直接从DFT中拉出来?当你从DFT得到复杂的结果时,振幅就是结果的绝对值,相位就是结果的角度(又称参数)。 –
是的,我自己计算DFT,意味着我得到的公式是“Sigma从k = 0 - > N-1,对于所有f(x)* W * N,这里W * N = e ^( - i 2 PI/N)“就像这样......我只是把这个公式转换成我的C程序。 – mossad
峰值FFT大小处的频率段频率通常不是音乐音频中的音符音高。 – hotpaw2