YIN-频率检测和泛音(吉他弦)

时间:2015-04-15 09:34:14

标签: c audio core-audio pitch-tracking

我正在开发一个用于频率检测的IOS应用程序,并且我使用YIN算法,这非常精确:使用Audacity,我生成了不同频率的矩形波 - 以及我的算法具有大约0.1%的精度 - 例如产生82.4赫兹(E弦)的音调,我真的得到82.4赫兹而没有别的。

无论如何,当我弹奏一根吉他弦时,我经常会听到有时比基音(F0)更强(有更高振幅)的泛音。因此,我的显示开始"跳舞"和切换 - 有时甚至会发生(当音调消失时)我的算法停止在泛音的频率(例如A而不是E) - 所以用户必须再次敲击字符串以查看是否他想要的音调(频率)存在。

我知道这种现象与我的算法无关,因为它只是一个"硬件"问题(我的意思是吉他只会产生泛音)。

我徒劳地试图平滑(频率检测的)结果或者#34; snap"一旦检测到关键频率(例如,对于E弦+/-容差为82.4Hz),则固定频率。无论如何,我的算法经常会出现错误的频率。

我问自己吉他调音器的价格是多么便宜(吉他店10美元),因为它们的频率检测也是可靠和稳定的。

我不想改变算法,但我想到了两种可能的解决方案:

  1. 信号的预处理(可能是Hanning窗口,低通或带通滤波)和/或
  2. 信号的后处理(某种频率平滑)。
  3. 有人知道如何克服"波涛汹涌的"结果

1 个答案:

答案 0 :(得分:1)

我为我的免费色彩应用程序iTransposer使用自相关并合并了汉宁窗口,这可能对您有所帮助。我最初并不是在寻找准确性,因为我想在一个木板上显示音符而不是一米。然而,我的一个朋友在他的工作中使用信号发生器测试它为0.1赫兹,并且通过简单的信号(如正弦波)发出超过383赫兹的问题。我已经尝试过使用各种铜管乐器,吉他和Garageband乐器似乎是好的调整。 基本上我实现了这个http://www.ucl.ac.uk/~ucjt465/tutorials/praatpitch.html 使用VDSP并更新了Kevin P Murphy https://github.com/kevmdev/PitchDetectorExample

提供的示例项目