我正在Python上开始一个项目,在那里我需要开发一个音高检测系统,基本上我要做的就是记录来自吉他弦的声音,然后确定声音的音调。
我已经阅读并搜索了网站(包括stackoverflow),因此我可以了解重要内容的主要思想,例如:FFT,时域,频率域,谐波,音调检测算法, Octave 误差等。
经过研究,我发现我可以使用HPS(谐波产品频谱)算法,并且该算法属于频域方法,这意味着我必须(一般步骤):
到频域(这就是FFT的作用)。
找到最高音,这将是音串声音。
我的问题从最后一步开始,我已经阅读了HPS的功能以及一些相关的讲座,但是我仍然无法理解它并开发自己的功能。
我是否想念一些我不理解的东西?
我只是找不到编程自己的HPS算法的方法。
最佳答案
在此处的HPS问题中:
How to get the fundamental frequency using Harmonic Product Spectrum?,
所考虑的谐波数为5(R = 5);在按顺序谐波比率下采样后,5个谐波频谱在hps2到hps5之间(加上原始FFT频谱)。
然后将5个降采样的频谱相加。
然后,搜索整个HPS求和阵列的长度,以找到求和的5个谐波中的峰值或最大值位于何处。
在该示例中,可能无法最佳地进行下采样和搜索最佳HPS估计值。但这是不同的问答(其中一些已经在上述SO问题的答案中)。