我需要在音乐家演奏音乐时测量信号频率,而对于 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,并且由于公式
df = 1/T
等待 1 秒以获得 1Hz 分辨率。
对于 A=440Hz,两个音符之间的频率差为 440*0.05946 = 26.16 Hz,要获得该频率分辨率,必须使用 0.038 秒的采集时间,也就是说,在 tempo=196bpm 时,FFT 只能区分两个注意,在 98 bpm 时,只要它在音高变化的那一刻开始采集,它就能够分辨出 50% 的失调错误。如果我们在采集期间允许音高变化,我们会得到 49 bpm,这太慢了。此外,非常希望对频率更精确,例如检测 25% 的失调误差。
有没有比 FFT 更好地测量频率的方法,即在更短的采集时间内获得更好的分辨率?(至少好 2 倍,理想情况下,好 8 倍。)作为交换,我不需要区分不同八度的音符,例如 440 和 880 都可能被识别为 A。(可能,更多的权衡是可能的,只是现在我没有想到其他任何事情。)
UPD 这是一个非常好的绘图:
UPD2
我在以下位置找到了一篇博士论文和开源软件(TARTINI——实时音乐分析工具):
http://miracle.otago.ac.nz/tartini/
(这些页面也可以通过网络存档服务获得:http: //web.archive.org = http://archive.org = http://waybackmachine.org)