如何实现自己的 HPS 算法?

How to implement my own HPS algorithm?

我正在 Python 上开始一个项目,我需要开发一个音高检测系统,基本上我要做的是记录来自吉他弦的声音,然后确定哪个是那个声音的基调。

我已经阅读并搜索了网站(包括 Whosebug),因此我可以理解重要事物的主要思想,例如:FFT、时域、频域、谐波、音调检测算法、八度误差等.

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

  1. 录制吉他的声音(避免外部噪音)。
  2. 使用 FFT 函数,以便我可以从时域转换该音频 到频域(这就是 FFT 所做的)。
  3. 获得该数据(一个数组)后,我必须使用 HPS,这样我才能 找到最高的音调,这将是音调字符串的声音。

我的问题是从最后一步开始的,我看了HPS的ecuation和一些相关的讲座,但还是看不懂,自己开发功能。

我是不是遗漏了什么或者我不理解但我认为我理解的东西? 我只是找不到编写自己的 HPS 算法的方法。

我以前用几种方法做过这个(在频域中工作的 FFT 或在时域中工作的自相关和 AMDF)。 就我个人而言,自相关是最喜欢的,因为它实施起来简单明了,在您的用例中,分析吉他弦,100% 准确。所以我可以推荐给你。 我之前分享过我的代码,你可以在下面的 link 中找到它的完整解释: Android: Finding fundamental frequency of audio input

在此处的 HPS 问题中:

,

考虑的谐波数为5(R = 5);在按顺序谐波比率进行下采样后,5 个谐波频谱在 hps2 到 hps5(加上原始 FFT 频谱)中。

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

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

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