2

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

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

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

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

我的问题从最后一步开始,我已经阅读了 HPS 的 ecuation 和一些关于它的讲座,但我仍然无法理解它并开发自己的功能。

我是否遗漏了一些我不理解的东西或某些东西,而我认为我知道了?我只是找不到编写自己的 HPS 算法的方法。

4

2 回答 2

1

在此处的 HPS 问题中:

如何使用谐波产品频谱获得基频?,

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

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

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

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

于 2016-09-09T22:16:49.473 回答
0

我之前以几种方式完成了此操作(在频域中工作的 FFT 或在时域中工作的自相关和 AMDF)。就我个人而言,自相关是最喜欢的,因为它实现起来简单明了,并且在您的用例中,分析吉他弦,以 100% 的准确度工作。所以我可以推荐给你。我之前分享过我的代码,您可以在以下链接中找到它的完整解释: Android:查找音频输入的基频

于 2016-09-09T12:32:02.380 回答