【发布时间】:2015-11-12 08:38:22
【问题描述】:
我需要在音乐家演奏音乐时测量信号频率,而对于 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。
为了让事情变得更复杂,the A (La) frequency 可能在 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)
【问题讨论】:
-
你说的是frequency,但我怀疑你的意思是pitch?
-
实际上,这不仅仅是学究气——如果你在处理音乐,它会产生很大的不同。频率是一个物理量,而音高是一个感知,并且与给定声音的分量的频率和幅度具有相当复杂的关系。 FFT(或更准确地说是从 FFT 导出的功率谱)将告诉您分量的频率和幅度,但从这里到感知音高并非易事(即,它不仅仅是基本分量的频率或最响亮的组件)。请参阅:谐波产品频谱。
-
您可能遗漏的另一个难题:听起来您假设样本窗口是连续的,因此每个窗口只能得到 1 个音高估计值,但常用的技术是重叠连续的样本窗口,例如如果您将每个窗口重叠 75%,那么您将获得 4 倍速率的音高估计值,但分辨率相同(尽管由于重叠,连续窗口之间存在一些相关性)。
-
@18446744073709551615:这只是给你一个 N/4 点 FFT,输出插值到 N 点 - 它不会神奇地给你 N 点 FFT 的分辨率。
-
顺便说一句,既然你在这里只是在理论阶段,我可以建议你把这个带到dsp.stackexchange.com 吗?那里会更切题,你可能会从比我知识渊博的人那里得到更好的答案。
标签: audio signal-processing fft pitch-tracking pitch-detection