实时人体音高检测


11

我正在尝试实现一个唱歌游戏,该游戏将分析原始麦克风输入并告诉玩家他的演唱水平如何。这需要实时完成。

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

正如文章所解释的,我提取了真实的频率和幅度,但是我不知道以此找到基本频率。我试图获得最大幅度的信号仓,但是对于较高音调的信号只能给出正确的结果,无论我使用哪种过采样因子,对于低频信号仍然会得到不好的数据。这种方法是完全错误的,还是我在正确的轨道上却只是缺少一些东西?

提前致谢,

编辑:我忘了提及我只对音高类感兴趣,因此可以确定基本面是否缺失,但样本中的色相强烈。

EDIT2:谢谢大家,我刚刚完成了一个算法的工作,它就像一个魅力。低音高估计问题是由于我的输入测试所致。当我演唱音符时,音符正确匹配。另外,我现在正在考虑所有谐波,而不仅仅是最高峰值。


维基百科有一些信息。
Emre 2012年

Answers:


9

我试图获得最大幅度的信号仓,但是对于较高音调的信号只能给出正确的结果,无论我使用哪种过采样因子,对于低频信号仍然会得到不好的数据。

这是因为谐波不是根本大。绘制频谱图,您会看到。找到真实基础的更好方法是自相关。然后,您将“滑动”波形经过自身并找到波形与自身对齐的延迟。

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

您是否真的要他们唱出确切的音符,还是可以根据他们的声音寄存器在其上或以下唱八度音调?


没错,我忘了说我只对音高课感兴趣。我正在使用此网站来测试我的工具:Seventhstring.com/tuningfork/tuningfork.html。对于A(220Hz)的输入,它返回E(660Hz)作为找到的音调等级。我看了一下频谱,确实有220Hz,但是幅度小于660Hz。在滤除低于最小幅度的值并且在我想要的范围内的上限频率之后,我从中获得的频谱有4个峰值。[峰,幅] = [220,0.0203],[618,0.0142],[660,0.0668],[703,0.0497]。
费利佩·里拉

我只是想,也许我在计算幅度时应该考虑相位偏移,就像我正在做以获得真实的频率一样。那有意义吗?我的意思是,如果我为一个bin设置了大约90º的相位偏移,那么“峰值”将处于0幅度,不是吗?
费利佩·里拉

@elipedrl:所以您实际上是在写吉他调音器。:)据我了解,它们通过低通滤波器来清理波形,然后计算峰值以获得音调。electronicdesign.com/article/articles/... aboutmicrocontroller.blogspot.com/2008/04/...有更好的方法,不过,如果你要的准确性,而不是廉价gist.github.com/255291
endolith

@elipedrl:仓的相位偏移应与音高无关。每个垃圾箱都是一个复数,因此您对该数字的绝对值或大小感兴趣。en.wikipedia.org/wiki/Absolute_value#Complex_numbers
endolith

1
并且如果由于某种原因(延迟,时间量子等)碰巧有2个较短的FFT,则相位声码器的计算量要少于另一个较长的FFT并进行内插的计算量。
hotpaw2 2012年

6

是的,将峰值频率估算器用于音调是错误的。音调是一种心理声学现象,因此音调检测或估计与频率估计不同。在前面的答案中,对于类似问题,已经有很多音高估计方法。有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- frequency.html


我用我只对音高课感兴趣的信息更新了问题。我真的希望带有后处理的FFT足以满足此要求,但我的进度落后了,改变方法对我来说很糟糕。
费利佩·里拉

@elipedrl:FFT应该可以工作了。得到几个峰值,然后聪明地选择其中一个应该足够了。请记住,有效峰值将接近(但不完全是)基波的整数倍,而虚假峰值则不会。您必须避免选择虚假峰值,并避免选择与要查找的音符相距八度音阶的三次谐波等。
endlith 2012年

尽管可能不大可能,但没有一个峰值出现在音乐音调频率上。一些男性元音可能与此接近,仅在由元音共振峰过滤后留下高泛音。
hotpaw2 2012年

通过对初始FFT结果进行后处理,谐波乘积频谱方法可能适合于找到一组频谱峰值的LCD最低公分母估计。
2012年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.