从理论上讲,是什么让多音高检测如此困难?

信息处理 fft 离散信号 信号检测 DSP核心 沥青
2022-01-25 13:58:15

对于多音高检测,我的意思是例如同时按下几个钢琴键。对于信号音调检测(一次按一个键),在 FFT 之后,大多数幅度最大的频率是所需频率。但是,对于多音高检测,假设按下两个钢琴键,前两个幅度最大的两个频率不是我按下的琴键的频率。

2个回答

首先:

大多数情况下,幅度最大的频率是所需频率

这是一种非常幼稚且有缺陷的方法,因为您在这里测量的内容与音高的感知概念非常不同。更不用说你达到了 FFT 的有限分辨率......

在多音高检测中必须面对的一些挑战:

  • 八度音阶很难区分。将两个 C 相隔一个八度演奏,最高音符的泛音加强了最低音符的泛音,而不是在频谱中产生新的峰值,以至于人们可以听到一个具有不同音色的单个“C”音符。当将几个音符混合在一起时,它们的一些分音可以相互加强或抵消。

  • 音高检测不再被视为周期估计的问题。最成功的单声道音高检测算法是时域的,并且基于平均幅度(或平方)差分函数等度量,并且基本假设是信号具有显着的周期性 - 当及时转换时,它几乎与自身相似。这些方法不能应用于复音信号,因为周期信号混合的周期是组件周期的 LCD。知道这个液晶显示器并没有放弃这些因素......

  • 事先不知道音符的数量这一事实增加了搜索空间的大小,并使其成为一个不适定问题。您不再将假设排序为“这是 C3”与“这是 C#3”,而是“这是 C3 和 G4”与“这只是 C3”与“这是 C2 和C3”。例如,拿一个钢琴音符。人们可以将其频谱描述为“单个 C3 钢琴音符”。或者可以将其频谱描述为“C3、C4、G4 等……所有这些都由产生纯正弦音符的乐器一起演奏”。区分这两个选项需要事先了解钢琴音符的频谱形状。

西方音乐中的音程通常接近于以低整数比相关的音高频率。因此,2 个音符的合成可以创建一个泛音序列,其中包含多于 2 个可能的分组,其中包含频率大致相等的音调(谐波乘积谱和其他相关方法的问题。)

由于相等的律调,音程音符并不总是以精确的低整数比率相关……它们只是非常接近。足够接近不同基音的不同泛音来敲打。这意味着任何单个短 FFT 帧都可能处于两个泛音节拍的节拍音符中。对于多个可能的泛音序列,这进一步加剧了多个候选音高出现和消失的问题。

而不是您的频率搜索空间是由简单的 2、3、4、5 等比率序列相关的点。对于单个音高,搜索空间将需要包含所有可能的音程和弦和音程中所有音符的所有泛音的所有分数比率的序列。考虑到任何窗口噪声(FFT 长度受限的增肥谱峰),如此多的序列通常最终都重叠,而不是音高搜索空间中的不同峰值。