快速音高识别

信息处理 声音的 信号检测 沥青 参数估计
2021-12-26 19:19:23

我需要在音乐家演奏音乐时检测音高(测量信号频率),如果他们走调了就会发出警告,但是音乐对于 FFT(快速傅立叶变换)来说有点太快了。

下面我尝试对问题进行技术描述。

音乐家以 90-140 bpm 的速度演奏音乐。这意味着每分钟有 90-140 个音符组,每组最多 8 个(更频繁地,最多 4 个)音符(60/140/8 = 0.0536 秒,60/90/4 = 0.167 秒),即也就是说,音符可能会以每秒 6-19 个音符的速度变化。

音乐使用对数刻度(见附图):440Hz 和 880Hz 之间的范围分为 12 个音符,其中只有 7 个用于旋律。(基本上,他们只使用钢琴上的白键;当他们想改变起始频率时,他们使用一些黑键而不使用一些白键。)也就是说,每个下一个音符的频率相乘乘以 2^(1/12) = 1.05946。

更复杂的是,A (La) 频率可能在 438 到 446 Hz 之间变化。弦乐器理论上可以调音,而管乐器则取决于空气的温度和湿度,因此音乐家在检查声音时会重新协商频率。

有时音乐家和歌手会在频率上出错,他们称之为“走调”。他们想要一种能够通知他们此类“失调错误”的设备。他们有调音器,但调音器需要播放相同的声音大约 1 秒才能开始显示任何内容。这适用于调音,但在播放音乐时不起作用。

最有可能的是,调谐器正在执行 FFT,并且由于公式等待 1 秒以获得 1Hz 分辨率。df=1/T

对于 A=440Hz,两个音符之间的频率差为 440*0.05946 = 26.16 Hz,要获得该频率分辨率,必须使用 0.038 秒的采集时间,也就是说,在 tempo=196bpm 时,FFT 只能区分两个注意,在 98 bpm 时,只要它在音高变化的那一刻开始采集,它就能够分辨出 50% 的失调错误。如果我们在采集期间允许音高变化,我们会得到 49 bpm,这太慢了。此外,非常希望对频率更精确,例如检测 25% 或 12% 的失调误差。

有没有比 FFT 更好地测量频率(检测音高)的方法,即在更短的采集时间内获得更好的分辨率?(至少好 2 倍,理想情况下好 8-16 倍。)作为交换,我不需要区分不同八度的音符,例如 440 和 880 都可以识别为 A。我不需要 FFT 的线性度输出,对数刻度会更好。(可能,更多的权衡是可能的,只是现在我没有想到其他任何事情。)

这里有一张非常好的图:

注意从维基百科链接的频率

2个回答

有没有比 FFT 更好地测量频率(检测音高)的方法,即在更短的采集时间内获得更好的分辨率?

就在这里。或者是。有多种更好的方法可以实时进行音高检测,这些方法比运行 FFT 好得多。

考虑

平均幅度差函数 (AMDF)

Qx[k]=n|x[n]x[nk]|

均方差分函数 (ASDF)

Qx[k]=n(x[n]x[nk])2

自相关函数 (AF)

Rx[k]=nx[n]x[nk]

请注意,我在求和的限制下玩得又快又松。

另请注意,没有关于波形形状或过零或其他阈值交叉的假设。唯一的假设是,当滞后大约是一个周期(或两个周期或周期长度的某个其他整数倍)时,看起来很像所以唯一的假设是音高与周期性或接近周期性(我喜欢称之为“准周期性”)函数的基频有关。kx[n]x[nk]

我最喜欢的是 ASDF(这是我刚刚向所有人宣布的一个隐秘的商业秘密,但comp.dsp上的人已经知道了)。这些都是时域,AMDF 和 ASDF 看起来非常相似,ASDF 看起来像是 AF 的颠倒版本。您正在寻找 AMDF 或 ASDF 中的空值或 AF 中的峰值,这些峰值对应于准周期输入的潜在周期长度。

这里还有一些其他的技巧:

  1. 您始终可以将最新 个样本与延迟的一些个样本相关联。这样您就可以在实时应用程序中处理可能的最新数据。NNk

  2. 您无需计算每个整数滞后的相关性。实际上,由于您喜欢对数频率,因此较大的间距可能大于较小的间距。kkk

  3. 当找到潜在的空值 (AM_F) 或峰值 (AF) 时,您可以计算的相邻整数值的相关性。k

  4. 的相邻整数值之间,您可以进行插值以将峰值位置确定为小数样本精度。我不会告诉你怎么做的。用你的想象力。k

  5. 整个技巧(这是商业秘密和 IVL 专利适用的秘诀)是在有多个候选者时选择正确的峰值或空值。选择不正确的峰值或空值将导致“八度错误”。我不会告诉你怎么做。用你的想象力。

给我发一封电子邮件,如果你想让我为你设计一个踢屁股音高探测器,我们可以讨论合同条款。比 YIN 好得多,在我看来,YIN 像狗屎一样工作。

我已经在这里回答了你的问题:https ://stackoverflow.com/questions/33667275/fast-frequency-measurement/33678202#33678202

但是,总而言之,在某些情况下,您可以将 FFT 结果内插到比 FFT bin 间距更精细的分辨率,从而允许您使用更短的数据窗口来获得更好的时间分辨率。

但 FFT 频率不是基频。对于某些乐器(产生轻微不和谐泛音的乐器),自相关函数(或其相关函数,如 AMDF)频率也不是。那是因为音高是一种心理声学现象。