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

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

我提取了真实的频率就像文章中所解释的那样,但我不知道以此找到基本频率。我试图获得最大幅度的信号仓,但对于高音调信号只能给我正确的结果,我使用哪种过采样因子都没关系,但对于低频率信号仍然会得到不好的数据。这种方法是完全错误的还是我走在正确的道路上,只是错过了什么?

感谢在先,

编辑:我忘了提到我只对音调类,所以如果根本不存在也可以,但是我的样本中有很强的泛音。

EDIT2:谢谢大家,我刚刚完成了一个算法的版本,该版本的工作原理很吸引人。低音高估计问题是由于我的输入测试。当我演唱音符时,音符正确匹配。另外,我现在正在考虑所有谐波,而不仅仅是最高峰值。

评论

维基百科上有一些信息。

#1 楼


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

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

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

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

评论


$ \ begingroup $
是的,我忘了提到我只对音高课感兴趣。我正在使用此网站测试我的工具:Seventhstring.com/tuningfork/tuningfork.html。对于A(220Hz)的输入,它返回E(660Hz)作为找到的音调等级。我看了一下频谱,确实有220Hz,但是幅度小于660Hz。在滤除低于最小幅度的值并且在我想要的范围内的上限频率之后,我从中获得的频谱有4个峰值。 [峰,幅] = [220,0.0203],[618,0.0142],[660,0.0668],[703,0.0497]。
$ \ endgroup $
–Felipe Lira
2012年3月27日12:33

$ \ begingroup $
我只是想,也许我在计算幅度时应该考虑相位偏移,就像在获取真实频率一样。那有意义吗?我的意思是,如果我为一个bin设置了大约90º的相位偏移,那么“峰值”将处于0幅度,不是吗?
$ \ endgroup $
–Felipe Lira
2012年3月27日在12:39

$ \ begingroup $
@elipedrl:所以您实际上是在编写吉他调音器。 :)据我了解,它们通过低通滤波器来清理波形,然后计算峰值以获得音调。 electronicdesign.com/article/articles/…aboutmicrocontroller.blogspot.com/2008/04/…但是,如果您追求准确性而不是便宜,那么有更好的方法gist.github.com/255291
$ \ endgroup $
– Endolith
2012年3月27日14:00



$ \ begingroup $
@elipedrl:分档的相位偏移应与音高无关。每个垃圾箱是一个复数,因此您对该数字的绝对值或大小感兴趣。 zh.wikipedia.org/wiki/Absolute_value#Complex_numbers
$ \ endgroup $
– Endolith
2012年3月27日14:03

$ \ begingroup $
,如果由于某种原因(等待时间,时间量子等)碰巧有两个较短的FFT,则相位声码器的计算要比进行另一个较长的FFT并进行插值的计算少。
$ \ endgroup $
– hotpaw2
2012年3月27日18:28



#2 楼

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

评论


$ \ begingroup $
我用我只对音高课感兴趣的信息更新了问题。我真的希望带有后处理的FFT足以满足此要求,但我的进度落后了,改变方法对我来说很糟糕。
$ \ endgroup $
–Felipe Lira
2012年3月27日在12:46

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

$ \ begingroup $
有可能(虽然可能不太可能),但没有一个峰值出现在音乐音调频率上。一些男性元音可能与此接近,仅在由元音共振峰过滤后留下高泛音。
$ \ endgroup $
– hotpaw2
2012年3月27日16:00



$ \ begingroup $
通过对初始FFT结果进行后处理,谐波乘积频谱方法可能适合于找到一组频谱峰值的LCD最低公分母估计。
$ \ endgroup $
– hotpaw2
2012年3月27日16:10