如何确定复调音乐中是否存在某些音符?

信息处理 沥青 音乐 峰值检测
2022-02-13 00:22:07

给定一段音频,如果您要计算音频中所有标准音符频率的频率幅度直方图,您将如何检查音频中是否存在 2-3 个特定音符?

这是一种复音检测,类似于这个问题除了我没有试图全面找到音频中存在的所有音符。我已经知道我在寻找什么笔记,我只是想看看它们是否存在。

我目前(幼稚)的方法是:

  1. 计算所有频率的平均幅度,用作噪声过滤的阈值。幅度低于此的任何频率我都忽略为背景噪声。
  2. 对于我正在搜索的每个音符,我计算前 3 个谐波的频率,查找每个频率的幅度,如果它们都高于平均值,那么我假设该音符存在。

我发现这种方法有效,但不是 100% 可靠。我遇到的主要问题是,鉴于乐器的类型,所有音符谐波的幅度在乐器的范围内可能非常不一致,这使得设置噪声阈值很容易出错。

例如,在原声吉他上弹奏高 E4 音符时,基频非常强,并且比所有其他谐波都大。然而,对于较低的 E2 音符,基频是如此之小,它通常被排除在背景噪声之外。并且低音弦中并不总是有一致的模式。一些低音低音弦音符也具有非常强的基础。

我该如何解决这个问题?我知道开放式实时复音检测是一个非常困难且未解决的问题,但是对于仅检查是否存在一些音符及其特定谐波的受限版本,是否有任何解决方案?

1个回答

由于您不想收集音频样本,我建议的最好方法是对压缩频谱进行一些过滤。

例如

(k=1ukc(h(ω/ω1)X(kωω1))dωHarmonics+(k=2vkc(h(ω/ω1)X(ωkω1))dωSubharmonics

在哪里

  • h(w)是一个函数,在对每个谐波/次谐波进行评分时会考虑频谱泄漏。
  • uk是谐波k
  • vk是谐波v
  • c(I)是将振幅转换为重要性的函数,也许您想使用对数函数,因为人类对声音强度的感知大致是对数的。也许只是一个平方根来避免检测到基频的谐波,例如假设一些木材具有非常强的三次和四次谐波,并且您演奏 C4 和 G3,如果您直接搜索使用强度,您可以检测到 G5 . 使用此压缩功能,您将更加重视检测多个谐波,而不是查看特定谐波的强度。

总和和积分被声明为无限,但由于趋于零,您可以为总和设置一个限制。由于信号的频谱有限,您可以为积分设置界限。ukvkk

然后你在不收集样本的情况下猜测所有这些参数,如果你幸运的话,你会得到一个很好的结果。如果您是根据之前的经验这样做的,那么您也隐含地使用了收集的数据。