我需要在音乐家播放音乐时测量信号频率,而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赫兹之间变化。理论上可以调整弦乐器,而管乐器则取决于空气温度和湿度,因此在声音检查过程中音乐家会重新协商频率。
有时音乐家和歌手会在频率上出错,他们称之为“失调”。他们想要一种可以告知他们这种“失调错误”的设备。他们有调音器,但调音器需要播放相同的声音约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)
答案 0 :(得分:2)
关于FFT,假设窄带频谱内容稀疏并且在足够低的背景噪声中很好地分离,可以对频率峰值进行插值或相位编码,使其分辨率远高于FFT二进制间距(与二进制间距相关的二进制间距)实际时域数据段的长度的倒数)。抛物线插值很常见,但还有其他更精确的插值内核。相位声码器频率估计方法需要跨越2个重叠帧的平稳性,然而这2个帧的总跨度可以相对较短。
但FFT报告的峰值频谱频率与人类感知的音调频率不同(因为声音和许多乐器可以在泛音系列中比在音高频率下辐射更多的声谱能量,有时略微不和谐。)有些算法比FFT(单独)更适合基音估计。部分列表在此答案中:FFT on iPhone to ignore background noise and find lower pitches
关于音乐音高估计方法的许多学术论文可以在music-ir / MIREX网站上找到:http://www.music-ir.org/mirex/wiki/MIREX_HOME