我想开发音符检测器作为我的学位项目,我想从头开始。我已经为".wav"文件编写了代码,它从音频音乐文件中提取所有信息,并因此给我振幅。
然后我写了一个DFT代码——它给我的输出是一个复数,其中一个轴(实/虚)是振幅/幅度,另一个是相位。
现在,我想用频率(赫兹,而不是矢量)来回答这个问题,这样我就可以检查DFT是否给出了正确的输出。如何将DFT输出转换为频率?
我必须用C语言编码,我不想使用任何内置库
您需要找到峰值幅度,然后计算出相应的频率:
- 计算每个DFT输出bin的大小:
magnitude = sqrt(re*re+im*im)
- 找到幅度最大的bin,将其索引称为
i_max
- 计算该bin的等效频率:
freq = i_max * Fs / N
,这里Fs
=采样率(Hz),N
=FFT中的点数量
有关bin索引和频率如何相关的更详细解释,请参阅此答案。