和弦检测算法?
Posted
技术标签:
【中文标题】和弦检测算法?【英文标题】:Chord detection algorithms? 【发布时间】:2011-05-19 06:13:12 【问题描述】:我正在开发依赖于和弦检测的软件。我知道一些基于倒谱分析或自相关技术的音高检测算法,但它们主要集中在单声道材料识别上。但我需要处理一些复音识别,即同时识别多个音高,就像和弦一样;有人知道这方面的一些好的研究或解决方案吗?
我目前正在开发一些基于 FFT 的算法,但是如果有人对我可以使用的一些算法或技术有任何想法,那将是非常有帮助的。
【问题讨论】:
这听起来很难。在您挑选出基本音之后,我不确定您如何能够将其他音符与谐波区分开来。也许在一些简单的情况下,您可以查看小三度或大三度(或七度等)的位置,但考虑到和弦反转等等,您甚至不能保证最低频率是根音。和弦的五度与三次谐波等有关...也许在找到基本和其他不是简单谐波的音符后,您可以进行某种模式匹配来识别常见的和弦. 已经在这里实现了:github.com/adamstark/Chord-Detector-and-Chromagram 【参考方案1】:Capo(Mac 的转录程序)的作者有一个非常深入的博客。条目"A Note on Auto Tabbing" 有一些很好的起点:
我在 2009 年年中开始研究不同的自动转录方法,因为我很好奇这项技术的发展程度,以及它是否可以集成到 Capo 的未来版本中。
这些自动转录算法中的每一个都从音频数据的某种中间表示开始,然后将其转换为符号形式(即音符开始和持续时间)。
在这里我遇到了一些计算量大的频谱表示(连续小波变换 (CWT)、恒定 Q 变换 (CQT) 等)。我实现了所有这些频谱变换,以便我还可以实现由我正在阅读的论文。这会让我知道它们是否会在实践中发挥作用。
Capo 有一些impressive technology。突出的特点是它的主视图不像大多数其他音频程序那样是频谱图。它像钢琴卷一样呈现音频,音符肉眼可见。
(来源:supermegaultragroovy.com)
(注意:硬条是用户绘制的。下面的模糊点是 Capo 显示的内容。)
【讨论】:
【参考方案2】:这篇文章有点老了,但我想我会在讨论中添加以下论文:
克拉普里,安西; 使用听觉模型对复音音乐和语音信号进行多音分析; IEEE 音频、语音和语言处理汇刊,卷。 16,没有。 2、2008 年 2 月 255
这篇论文有点像多音分析的文献综述,并讨论了一种基于听觉模型的方法:
(图片来自论文,不知道要不要发帖。)
【讨论】:
了解更多信息永远不会太晚。 感谢您添加本文!【参考方案3】:还有http://www.schmittmachine.com/dywapitchtrack.html
dywapitchtrack 库实时计算音频流的音高。音高是波形的主要频率(播放或演唱的“音符”)。它以 Hz 为单位的浮点数表示。
http://clam-project.org/ 可能会有所帮助。
【讨论】:
【参考方案4】:这是一个相当不错的开源项目: https://patterns.enm.bris.ac.uk/hpa-software-package
它根据色谱图检测和弦 - 一个很好的解决方案,将整个频谱的窗口分解为具有浮点值的音级数组(大小:12)。然后,可以通过隐马尔可夫模型检测和弦。
.. 应该为您提供所需的一切。 :)
【讨论】:
这是一个很好的答案!我已经找到了这个项目,(这是一个我没有重新讨论过的老问题,但你的回答是最好的)并将它推荐给任何搜索这个项目的人。 您发布到该软件的链接无效。你能更新一下吗?谢谢。【参考方案5】:和弦检测和键检测之间有很大的重叠,因此您可能会发现我的一些 previous answer 对这个问题很有用,因为它有一些论文和论文的链接。获得一个好的复音识别器非常困难。
我自己的观点是,应用复音识别来提取音符,然后尝试从音符中检测和弦是错误的做法。原因是这是一个模棱两可的问题。如果您有两个完全相隔八度的复杂音调,则无法检测是否播放了一个或两个音符(除非您有额外的上下文,例如了解谐波轮廓)。 C5 的每个谐波也是 C4(以及 C3、C2 等)的谐波。因此,如果您在复调识别器中尝试一个大和弦,那么您可能会得到与您的和弦谐波相关的整个音符序列,但不一定是您弹奏的音符。如果您使用基于自相关的音高检测方法,那么您会非常清楚地看到这种效果。
相反,我认为最好寻找由某些和弦形状(大调、小调、7 等)组成的模式。
【讨论】:
尝试识别和弦在某些方面可能比尝试识别音高的一般问题更容易,因为至少对于三和弦和七和弦来说,各个音符在哪个八度音阶上并不重要. 在既不增也不减的和弦中,如果有一个音高似乎比任何其他音高得多,则音高很可能是根音(并且“三次谐波”的很大一部分是五音)。如果没有具有强三次谐波的音高,则和弦的五度可能是高于根音的五度或低于根音的四度。 我同意检测和弦可能更容易,只要您只尝试检测和弦的一般特征(例如'Cm7')而不是检测确切的反转。最简单的和弦 (C+C) 是最难检测的和弦之一。【参考方案6】:查看我对这个问题的回答: How can I do real-time pitch detection in .Net?
这篇 IEEE 论文的参考主要是你要找的:http://ieeexplore.ieee.org/Xplore/login.jsp?reload=true&url=/iel5/89/18967/00876309.pdf?arnumber=876309
谐波让你望而却步。此外,即使基本音不存在,人类也可以在声音中找到基本音!想想阅读,但要覆盖一半的字母。大脑填补了这些空白。
混音中其他声音的上下文以及之前的声音对于我们如何感知音符非常重要。
【讨论】:
是的,你是对的,在心理声学问题上遇到了很多麻烦......谢谢你的论文!【参考方案7】:这是一个非常困难的模式匹配问题,可能适用于训练神经网络或遗传算法等 AI 技术。
基本上,您可以在每个时间点猜测正在演奏的音符数量、音符、演奏音符的乐器、振幅和音符的持续时间。然后,您将所有这些乐器在其包络中的那个点(起音、衰减等)以该音量播放时会产生的所有谐波和泛音的幅度相加。从信号的频谱中减去所有这些谐波的总和,然后将所有可能性的差异最小化。重击/吱吱声/拨动瞬态噪声/等的模式识别。在注释的开头可能也很重要。然后进行一些决策分析以确保您的选择有意义(例如,单簧管不会突然变成小号演奏另一个音符并在 80 毫秒后再次变回),以最大限度地减少错误概率。
如果您可以限制您的选择(例如,只有 2 个长笛只演奏四分音符等),尤其是对于泛音能量非常有限的乐器,它会使问题变得容易得多。
【讨论】:
非常感谢。这是一个很好的答案,真的让我思考。它显示了一些我还没有考虑过的事情。以上是关于和弦检测算法?的主要内容,如果未能解决你的问题,请参考以下文章