给定选择标准的复调音高检测算法?

问题描述 投票:0回答:1

是否有任何已知的音高检测算法用于检测代表复调音乐的音频中的多个特定音符?

我看到的所有复调音乐引用的算法(例如 MUSIC 或 ESPRIT)都集中在开放式领域,在该领域中,您不知道音频包含哪些音高,并尝试使用算法来检测它们。可以理解,这是一个非常困难的问题。

我对一个更受限制的领域感兴趣,在该领域中,您会得到 2-6 个特定注释的列表,并且您需要检查这些注释是否存在于音频中。我认为这将是一个更容易的问题,尽管仍然不是微不足道的,但我很难找到有关该主题的代码或学术论文。

我的域是一个应用程序,音乐家将在其乐器上演奏特定音符,该程序会向他们提供反馈,表明他们正确演奏了这些特定音符。

我目前正在使用一些 NodeJS 和 C++ 代码来执行此操作,我当前(天真的)方法是:

  1. 计算 FFT,并根据所有标准音高的频率范围对频率进行分类。
  2. 计算所有频率的中值幅度,用作噪声过滤的阈值 (T)。任何幅度低于此值的频率我都会忽略为背景噪声。
  3. 对于我正在搜索的每个音符,我计算前 3 个谐波的频率,查找每个频率的振幅,如果它们都高于平均值,则我假设该音符存在。

这有点作用,但我遇到的问题是校准 T 阈值。如果太高,它就会变得过于敏锐,无法检测到任何音符,除非它们非常响亮。如果太低,识别能力不够,会返回误报。

潜在的困难在于,对于许多乐器来说,这些音符谐波的幅度没有一致的模式。有些具有很大的基波,随后的每个谐波都会迅速减弱。有些低音音符几乎没有基音,而其他和声则衰减得非常缓慢。因此,当我发现适用于高音音符的 T 阈值时,它不适用于低音音符,反之亦然。

由于我使用中值幅度来进行噪声过滤,因此当两个音符以不等的音量一起演奏时,较大的音符可能会导致较柔和的音符被滤除,即使较柔和的音符仍然比任何其他音符响亮得多FFT 中的音调。很难找到任何最佳点。

在这种情况下我应该使用任何信号处理或滤波技术来提高准确性吗?

algorithm signal-processing pitch pitch-detection
1个回答
0
投票

我目前正在尝试解决与您相同的问题..您可能已经解决了它。

我认为对于更高频率来说,Goertzel 算法是一个不错的选择。它面临的最大问题是它至少需要一个周期的信号才能正常工作..(注释周期为< 20ms, for me). You would need to calibrate the threshholds of every key because oviously the amplitude will vary based on the note you are playing.

另外,我认为任何 FFT 解决方案都不起作用,除非你有机器学习算法来检测哪些尖峰是音符,哪些是谐波。

这个问题你解决了吗?我也想构建和你一样的东西:D

© www.soinside.com 2019 - 2024. All rights reserved.