钢琴音高检测

信息处理 fft 声音的 沥青
2022-01-16 15:07:40

我正在研究一个钢琴调音程序,其中一部分需要实时音高检测。这是我到目前为止的方案,它在某种程度上有效,但可能需要一些改进。

我正在以 2^14 个样本块的形式捕获单声道、44.1kHz、16 位 PCM 音频。我将最后 4 个样本合并到一个 2^16 长度的缓冲区中,将 Hann 窗口应用于缓冲区并在其上运行 FFT。然后,我将 FFT 的结果分成两个分辨率。首先,我将桶分成 200 个桶,然后以这个粒度运行 HPS 音高检测算法。我不需要在这里获得确切的频率,我只想靠近。然后,我将其分成 12000 个桶,从 10Hz 到 10kHz 的分辨率为 1 美分。一旦我从 200 bin HPS 算法中知道了一个近似频率,我就会在 12000 bin 案例的范围内搜索一个峰值以获得更准确的频率。

这似乎适用于键盘中间的音符。低音符会发生大约 1.5 秒的错误识别,通常是真实音符的第二或第三部分,然后正确识别该音符。

在我创建的所有光谱图中,我希望看到发生了什么,峰的宽度更大。从 200 箱到 12000 箱的情况,这个宽度在视觉上有些一致。我本来预计在 200 箱的情况下峰值会更窄。

所以,信号处理对我来说是新的,所以可能会有一些我不想问的问题,但就具体问题而言,样本量是否足以完成这项任务?Hann 是正确的窗口选择吗?我应该在 FFT 之前也平滑数据吗?HPS 对 bin 数量有多敏感?我在想,如果我使用了很多箱,那么不和谐可能不会使部分与 HPS 算法的简单方法(除以 2、3、4 等)重叠它们的基本原理。

4个回答

类似于这个线程:

是否有一种算法可以在没有 DFT 或 FFT 的情况下找到频率?

FFT 并不是构建调谐器的一种特别有效的方法。更好(和更便宜)的方法包括自相关、锁相环和延迟锁定环等。

一个例子是使用局部最大值和最小值的跟踪来粗略地磨练基频,然后使用本地振荡器和锁相环来精确地跟踪这个频率。即使频率较低且基波较弱,这也可以在调谐期间快速、连续且高精度地跟踪移动的基波。

搜索“钢琴调音软件”或类似项目会产生大量的点击量——有些不错,有些不太好。

每种乐器都具有影响其声音的独特的声学/物理/环境特性。而且它可能会变得复杂,正如成千上万的书籍和研究论文所暗示的那样(例如:音调、起音/衰减特性、不和谐等)。

音高检测本身就是一个广泛的领域。以下只是可用内容的一小部分: 概述文章 1堆栈交换帖子概述文章 2

至于您的具体问题:1)您的样本量似乎过大了 - 根据 SNR 和波形稳定性,您可以使用其他方法使用更少的周期获得高频率精度。(有些方法是基于 FFT 的)。而且您可能会在较长的采样时间下捕获起音/衰减,2)除矩形以外的任何窗口都会扩大频域中的波束宽度,但这并不意味着您不应该使用一个 – Hann 似乎在 HPS 中很常见,据我所见,3)如上面第一个链接中所述,HPS 在低频下效果不佳,并且不和谐会影响您在较低的琴弦上。至于你的整体方法,不用写很多页,我只能说我会做不同的,这取决于我处理的频率范围和谐波。

另一个答案建议使用 PLL。我认为你应该远离 PLL:大多数关于音高跟踪的文献都关注自相关(搜索“YIN Pitch Tracking”——YIN 是一种基于自相关的现代音高跟踪算法)和 FFT。相信PLL 更适合跟踪频率的微小波动,比如无线电。

自相关是一个很好的起点。它快速、高效、准确。但是,有一些技巧可以使 FFT 非常准确和快速(大多数使用 FFT 的技术只看幅度,但您也可以使用相位信息),因此如果您熟悉 FFT,您也可以使用该技术。

如果您确实使用这些技术中的任何一种,我建议使用低通进行预滤波以减少谐波并专注于基波。使用 FFT,您可以替代或另外使用诸如查看第一个局部最大值之类的技巧。

这可能是过滤等的一个很好的起点。它还将为您提供一些避免做太多工作的提示,并链接到源代码:http ://blog.bjornroche.com/2012/07/frequency-detection-using-fft-aka-pitch.html

本书的章节使用相位信息解释了 YIN 和 FFT:http: //www.amazon.com/DAFX-Digital-Udo-ouml-lzer/dp/0470665998

最后,您必须了解钢琴的细节。我不确定调音器本身是否需要做任何特殊的 WRT,例如,拉伸调音,或者这是否由调钢琴的人决定,但你至少需要了解这些东西。另一张海报建议查看失谐谐波,但主要问题是识别和调整基波,因此只要您正确识别基波,谐波失谐就无关紧要。

您看到的宽峰可能是物理现象的结果,而不是信号处理伪影。一般而言,FFT 结果中的窄峰表示时域窗口中的未调制正弦曲线完全周期性。但是钢琴弦的振动并不是那么静止的。它们随着时间的推移而演变,产生明显的调制。

多种效果:每个音符的多个钢琴弦将通过音板交换能量;总振动能量会随时间衰减;振动模式一开始可能有点不和谐;由于非零弦刚度和直径,每个模式(谐波)的准确振动频率可能会随着振幅衰减而变化;并且每个谐波可能以不同的速率衰减,等等。

您可能必须决定将这些多种调制中的哪一种称为“音高”(听力学书籍可能会有所帮助),并找到一种方法来更好地在 FFT 的“宽峰”内跟踪它。