如何实现我自己的HPS算法?

时间:2016-09-08 18:24:52

标签: audio signal-processing fft pitch pitch-tracking

我正在开始一个关于Python的项目,我需要开发一个音高检测系统,基本上我要做的就是录制来自吉他弦的声音,然后识别哪个是那个声音的音调。 / p>

我已经通过网站阅读和搜索(包括stackoverflow),因此我可以理解重要事项的主要思想,如:FFT,时间制,频率域,谐波,音高检测算法,八度音程等。< / p>

在我的研究之后,我发现我可以使用HPS(谐波产品频谱)算法,并且该算法属于频率域方法,这意味着我必须(在一般步骤中):

  1. 录制吉他声音(避免外部噪音)。
  2. 使用FFT功能,这样我就可以从时域转换音频 到一个频率域(这就是FFT的作用)。
  3. 在我获得数据(数组)后,我必须使用HPS,所以我可以 找到最高音,它将成为音弦音。
  4. 我的问题从最后一步开始,我已经阅读了HPS的说法和一些关于此的讲座,但我仍然无法理解它并开发自己的功能。

    我错过了一些我不理解的东西,我想我会这样做? 我找不到编写自己的HPS算法的方法。

2 个答案:

答案 0 :(得分:1)

在HPS问题中:

How to get the fundamental frequency using Harmonic Product Spectrum?

考虑的谐波数为5(R = 5);在通过连续谐波比进行下采样后,5个谐波频谱在hps2到hps5(加上原始FFT频谱)。

然后将5个下采样频谱相加。

然后搜索整个HPS求和阵列长度,以找出总和5次谐波中的峰值或最大值所在的位置。

在该示例中,可能无法以最佳方式完成下采样和搜索最佳HPS估计。但这是一个不同的Q&amp; A(其中一些已经在上述SO问题的答案中)。

答案 1 :(得分:0)

之前我已经通过几种方式完成了这项工作(无论是在频域工作还是在自相关工作的FFT和在时域工作的AMDF)。 对我个人而言,Autocorrelation是最受欢迎的,因为它实现简单明了,在您的使用案例中,分析吉他弦,以100%的准确度工作。所以我可以推荐给你。 我以前分享过我的代码,您可以在以下链接中找到它: Android: Finding fundamental frequency of audio input