YIN-频率检测和泛音(吉他弦)
Posted
技术标签:
【中文标题】YIN-频率检测和泛音(吉他弦)【英文标题】:YIN-Frequency-Detection and overtones (guitar strings) 【发布时间】:2015-04-15 09:34:14 【问题描述】:我正在开发一个用于频率检测的 ios 应用程序,并且我正在使用非常精确的 YIN 算法:女巫 Audacity,我已经生成了不同频率的矩形波 - 我的算法的精度约为 0.1 % - 例如生成 82.4 Hz(E 弦)的音调,我真的得到 82.4 Hz,仅此而已。
无论如何,当我弹奏吉他弦时,我经常会得到泛音,有时会比基音 (F0) 更强(幅度更高)。因此,我的显示器开始“跳舞”并切换 - 有时,甚至会发生(当音调消失时)我的算法停止在泛音的频率(例如 A 而不是 E) - 所以用户必须再次弹奏弦乐以便查看是否存在他想要的音调(频率)。
我知道这种现象与我的算法无关,因为它只是一个“硬件”问题(我的意思是吉他只会产生泛音)。
一旦检测到关键频率(例如 E 弦 +/- 容差为 82.4 Hz),我尝试平滑(频率检测的)结果或“捕捉”到固定频率,但均未果.无论如何,我的算法也经常出现错误的频率。
我在问自己,吉他调音器(吉他商店售价 10 美元)的效果如何,因为它们的频率检测可靠且稳定。
我不想更改算法,但我想到了两种可能的解决方案:
-
信号预处理(可能是汉宁窗、低通或带通滤波)和/或
信号后处理(某种频率平滑)。
有人知道如何克服“不稳定”的结果吗?
【问题讨论】:
【参考方案1】:我为我的免费半音应用 iTransposer 使用了自相关,并合并了一个 Hanning 窗口,因此这可能会对您有所帮助。我最初并没有寻找准确性,因为我想在五线谱上而不是米上显示音符。然而,我的一个朋友在他的工作中使用信号发生器将其测试到 0.1 Hz,并且在使用简单信号(如正弦波)时遇到了超过 383 Hz 的问题。我用各种铜管乐器、吉他和 Garageband 乐器进行了尝试,似乎没问题调音。 基本上我实现了这个http://www.ucl.ac.uk/~ucjt465/tutorials/praatpitch.html 使用 VDSP 并更新了 Kevin P Murphy https://github.com/kevmdev/PitchDetectorExample 提供的示例项目
【讨论】:
谢谢你,psybersonic - 我已经尝试了你的建议,并且在频率稳定性方面有轻微的改进。论文“Pitch in Praat”帮助了我很多,以便更好地理解音高或语音检测。非常感谢! 很高兴帮助乌尔里希。数字音频并不容易。如果您使用 Kevin Murphy 的任何代码,则音频控制器中存在内存泄漏。需要添加free(THIS->bufferList.mBuffers[0].mData);在录音回调结束时。 (如果我没记错的话)。以上是关于YIN-频率检测和泛音(吉他弦)的主要内容,如果未能解决你的问题,请参考以下文章