我正在开发依赖于和弦检测的软件。我知道一些基于倒谱分析或自相关技术的音高检测算法,但它们主要集中在单声道材料识别上。但我需要处理一些复音识别,即同时识别多个音高,就像和弦一样;有人知道这方面的一些好的研究或解决方案吗?
我目前正在开发一些基于 FFT 的算法,但是如果有人对我可以使用的一些算法或技术有想法,那将有很大的帮助。
我正在开发依赖于和弦检测的软件。我知道一些基于倒谱分析或自相关技术的音高检测算法,但它们主要集中在单声道材料识别上。但我需要处理一些复音识别,即同时识别多个音高,就像和弦一样;有人知道这方面的一些好的研究或解决方案吗?
我目前正在开发一些基于 FFT 的算法,但是如果有人对我可以使用的一些算法或技术有想法,那将有很大的帮助。
这是一个相当不错的开源项目: https ://patterns.enm.bris.ac.uk/hpa-software-package
它根据色谱图检测和弦 - 一个很好的解决方案,将整个频谱的窗口分解为具有浮点值的音高类数组(大小:12)。然后,可以通过隐马尔可夫模型检测和弦。
..应该为您提供所需的一切。:)
Capo的作者,Mac 的转录程序,有一个非常深入的博客。“A Note on Auto Tabbing ”有一些很好的起点:
我在 2009 年年中开始研究不同的自动转录方法,因为我很好奇这项技术的发展程度,以及它是否可以集成到 Capo 的未来版本中。
这些自动转录算法中的每一个都从音频数据的某种中间表示开始,然后将其转换为符号形式(即音符开始和持续时间)。
这就是我遇到一些计算量大的谱表示(连续小波变换(CWT)、恒定 Q 变换(CQT)等)的地方。我实现了所有这些谱变换,以便我也可以实现我的论文中提出的算法正在阅读。这会让我知道他们是否会在实践中发挥作用。
Capo 拥有一些令人印象深刻的技术。突出的特点是它的主视图不像大多数其他音频程序那样是频谱图。它像钢琴卷一样呈现音频,肉眼可见音符。
(注:硬笔记条是由用户绘制的。下面的模糊点是 Capo 显示的内容。)
和弦检测和键检测之间有很大的重叠,因此您可能会发现我之前对该问题的一些回答很有用,因为它有一些指向论文和论文的链接。获得一个好的复音识别器非常困难。
我自己的观点是,应用复音识别来提取音符,然后尝试从音符中检测和弦是错误的做法。原因是这是一个模棱两可的问题。如果您有两个完全相隔八度的复杂音调,则无法检测是否播放了一个或两个音符(除非您有额外的上下文,例如了解谐波轮廓)。C5 的每个谐波也是 C4(以及 C3、C2 等)的谐波。因此,如果您在复调识别器中尝试一个大和弦,那么您可能会得到与您的和弦谐波相关的整个音符序列,但不一定是您弹奏的音符。如果您使用基于自相关的音高检测方法,那么您会非常清楚地看到这种效果。
相反,我认为最好寻找由某些和弦形状(大调、小调、7th 等)组成的模式。
请参阅我对这个问题的回答: 如何在 .Net 中进行实时音高检测?
对这篇 IEEE 论文的参考主要是您要查找的内容: http://ieeexplore.ieee.org/Xplore/login.jsp?reload=true&url=/iel5/89/18967/00876309.pdf?arnumber= 876309
谐波让你失望。此外,即使基本音不存在,人类也可以在声音中找到基本音!想想阅读,但要覆盖一半的字母。大脑填补了空白。
混音中其他声音的背景以及之前的声音对于我们如何感知音符非常重要。
这是一个非常困难的模式匹配问题,可能适用于训练神经网络或遗传算法等 AI 技术。
基本上,在每个时间点,您都会猜测正在播放的音符数量、音符、演奏音符的乐器、振幅和音符的持续时间。然后,您将所有这些乐器在其包络中的那个点(起音、衰减等)以该音量播放时会产生的所有谐波和泛音的幅度相加。从信号的频谱中减去所有这些谐波的总和,然后将所有可能性的差异最小化。重击/吱吱声/拨动瞬态噪声/等的模式识别。在注释的开头可能也很重要。然后进行一些决策分析以确保您的选择有意义(例如,单簧管不会突然变成小号演奏另一个音符并在 80 毫秒后再次返回),以最大限度地减少错误概率。
如果您可以限制您的选择(例如,只有 2 个长笛只演奏四分音符等),尤其是对于泛音能量非常有限的乐器,它会使问题变得容易得多。
还有http://www.schmittmachine.com/dywapitchtrack.html
dywapitchtrack 库实时计算音频流的音高。音高是波形的主要频率(播放或演唱的“音符”)。它表示为以 Hz 为单位的浮点数。
http://clam-project.org/可能会有所帮助。