复音检测/多音高检测/和弦识别

信息处理 信号检测 沥青
2022-02-03 11:40:36

我构建应用程序女巫将钢琴声音转换为音符。我发现了一些带有实现的音高检测算法(主要基于自相关或fft),但是和弦识别当然不起作用。钢琴乐器的最佳方法是什么(双手+和弦)?这个问题有实现吗?

4个回答

正如@jan 指出的那样,您可能要求的太多了,特别是如果您正在寻找现成的实现。在谷歌上进行快速搜索,我发现了几篇论文,这可能是一个有用的开始。

在这篇名为Multi-pitch Detection Algorithm Using Constrained Gaussian Mixture的论文中,作者使用期望最大化算法来求解高斯混合模型来检测多个音调。这很可能不是一个计算效率非常高的算法,因为混合模型通常很难求解,并且必须主要离线完成(没有实时版本)。

如果您正在寻找一种适度稳健但可能快速的算法,请查看此Stack Overflow 答案作者推荐MUSICESPRIT算法。

最好的办法是尝试一下,然后用特定的 DSP 和算法问题以及诸如Stack Overflow之类的网站来回答特定的实现问题。

这是一个参考书目,包括一些最近关于和弦音高检测/识别/估计问题的可能解决方案的研究论文:http ://www.cs.tut.fi/~klap/iiro/

ISMIR /MIREX会议也发表了许多关于这个主题的研究论文。

单声道音高检测已经够难了。和弦是一个整体维度更难。不知道 Melodyne 是怎么做到的,但他们现在可能是最重要的。

这些天来,发表的关于音高检测的论文并不多。回到过去,它是关于语音处理的,并且有一些单声道算法。然后问题变成了测量基频的问题f0(或期间,τ0) 的周期或准周期信号。最终,任何好的算法都是基于平均幅度差函数 (AMDF) 或自相关。两者之间存在关系(或至少在自相关和平均幅度平方差函数之间)。一个在另一个有最小值的地方有峰值。

我从来没有真正摆弄过和弦音高检测,因为我所做的大部分工作都是为了实时使用。也许,如果您可以从混音中识别出一个音符(可能是振幅最大的音符),您可以使用梳状滤波器过滤掉该音符,并继续识别剩余的最强音符。所有这些都是基于所有音符都是谐波或准周期的概念。人类认为具有音高的某些音调不是谐波。例如,钟声。在那种情况下,我不知道如何使用梳状滤波器来隔离音符,因为谐波可能不会与梳齿对齐。