吉他和弦识别算法?

44

有没有一种适用于吉他和弦的良好数字信号处理算法?因为我认为快速傅里叶变换只对吉他演奏的单音准确,而对同时演奏的音符(例如和弦)不准确。

谢谢!


3
向Melodyne的人询问:http://www.youtube.com/watch?v=jFCjv4_jqAY - herzmeister
6
你认为在你的情况下快速傅里叶变换(FFT)不准确的依据是什么? - Biggles
5个回答

77
短回答是你需要不止一个算法。好的和弦识别方法更准确地说可以被描述为“系统”,但通常它们确实基于对频域的初始转换(最常见的是DFT)。
如果你想获得类似于这样的歌曲和弦表示:
C G Am F7 F6 C ...

实际上这是一个与识别音频片段中的音符略有不同的问题。实际上,有两个问题(粗略地说):

  1. 找到任何时刻存在的音高
  2. 随着时间的推移将这些音高分组以便能够为时间间隔分配和弦标签。

事实证明,从时间域(正常音频)转换为频率域(光谱表示)的方式仅具有有限的重要性。重要的是你之后所做的事情,并且通常使用复杂的概率模型(类似于语音识别中的HMMs、DBNs等)来解决这个问题。

尝试在Google Scholar上搜索“chord transcription”、“chord detection”或“chord labelling”以获取该领域的先进研究成果。

大多数这些方法使用离散傅里叶变换(DFT)创建初始谱图。在进一步处理期间,它们往往只稍微有所不同,尽管使用了不同的时间序列平滑技术:隐马尔可夫模型、动态贝叶斯网络、支持向量机(SVMstruct)和条件随机场等。最先进的转录器使用自动调音、键信息、低音音符信息和度量位置的信息来改善结果。我的论文(第2章)提供了一个很好的概述。

开源弦绘制算法:

希望这能帮到你。


14
对于优秀答案并可以在答案中引用自己的论文,我给予+1的赞同。 - gary
我在使用LabROSA和弦识别时遇到了困难,你能指导我如何使用吗?我使用终端命令extractFeaturesAndTrain_svm和doChordID_svm,但是它无法识别。 - calvin sugianto

4

有一些使用DFT(FFT)的工具相对成功,但是它们在计算DFT后需要进行大量处理。

尝试这个链接来了解当前技术发展现状的概述,或者搜索“Chordino”或“Chordata”以获取开源和弦提取算法。


3

你可以尝试使用另一组基于频域的算法,例如小波变换。但我不确定这是否能解决你的准确性问题。实际上,我不明白你在什么方面遇到了FFT的困难。它总是对和弦进行近似处理,没有完美的方法来检索声音的这种信息。

因此,这取决于你对谱图进行的分析。对于单个音符,实际上有很多比FFT更好的算法,但是对于和弦,你很可能不得不使用FFT。

你将要处理的问题是将基本谐波与上部谐波分离开来,一个可能有用的方法是只考虑吉他范围内的频率。 如果你只需要处理吉他声音,应该花些时间研究吉他的正常频域图,并尝试使用它来提高你的准确性。


你好!在使用FFT时,是否可以使用bin的强度来尝试确定组成和弦的音符?因为我认为它们之间会有某种相关性。 - user488792

2
FFT可以并且会在正确设置软件的情况下提供所有单音。FFT的整个目的是区分音调,或者如果您是天体物理学家,您想知道来自恒星的光中的各个元素(硫,氢...)。
谐波不是问题,因为它们比基频(例如C=440hz,但C=880hz也是如此)具有更少的“功率”,但880将是FFT结果中较小的尖峰。

不,那并不是真的。例如,如果你尝试绘制由FFT产生的频谱,对于在小提琴上演奏的C5音符,你会发现C5的振幅比C6低。 - Yuriy Kravets
@YuriyKravets 我认为他的意思是你可以通过查找具有最大“功率”的根音来找到它。 - Stuart Clark

1

有一场科学家之间的比赛,人们试图分析音乐的不同参数。其中一个部分是和弦识别。这个比赛是公开的,任何人都可以参加并展示在这个领域的成果。2011年的结果已经发布

我的一个朋友在这个领域(也在这个比赛中)取得了不错的成绩。你可以在他的网页上了解他的方法。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接