实时人类音高检测

信息处理 傅里叶变换 沥青 峰值检测 stft 唱歌
2022-01-10 09:47:01

我正在尝试实现一个歌唱游戏,它将分析原始麦克风输入并告诉玩家他的歌声有多好。这需要实时完成。

我遇到了很多线程问同样的问题,但我仍然没有完成它,可能是由于我缺乏该领域的经验和浅薄的数学背景。我已经根据 DSPDimension 网站音高变换的文章实现了一个算法:http ://www.dspdimension.com/admin/pitch-shifting-using-the-ft/

就像文章解释的那样,我提取了真实的频率和幅度,但我不知道用这个找到基频。我试图获得最大幅度的 bin,但这只会为我提供更高音调信号的正确结果,无论我使用哪种过采样因子,我仍然会得到低频信号的不良数据。这种方法是完全错误的,还是我在正确的轨道上但只是错过了一些东西?

提前致谢,

编辑:我忘了提到我只对音高课程感兴趣,所以如果缺少基本音也没关系,但我在样本中有很强的泛音。

EDIT2:感谢大家,我刚刚完成了一个运行得很好的算法版本。低音调估计问题是由于我的输入测试造成的。当我唱出音符时,它匹配正确。另外,我现在正在考虑所有谐波,而不仅仅是最高峰。

2个回答

我试图获得最大幅度的 bin,但这只会为我提供更高音调信号的正确结果,无论我使用哪种过采样因子,我仍然会得到低频信号的不良数据。

那是因为谐波大于基波。绘制你的光谱,你会看到。找到真正基础的更好方法是自相关。然后,您将波形“滑动”过去并找到波形与自身对齐的延迟。

http://www.phon.ucl.ac.uk/courses/spsci/matlab/lect10.html

你真的希望他们唱出准确的音符,或者他们根据他们的语音寄存器唱一个高于或低于一个八度音阶是否可以?

是的,对音高使用峰值频率估计器是错误的。音高是一种心理声学现象,因此音高检测或估计不同于频率估计。在之前对类似问题的回答中已经给出了很多音高估计方法。有超过 1 种可供选择。

这是一个:https ://stackoverflow.com/questions/4227420/matlab-missing-fundamental-from-an-fft/4231322#4231322 ,另一个:改进音高检测的技巧

添加#1:与此类似的问题经常被问到,以至于我写了一篇关于该主题的更长的博客文章:http: //www.musingpaw.com/2012/04/musical-pitch-is-not-just-fft-频率.html