使用FFT频谱查找相似的音乐


16

我已经尝试了几个星期,以找到一种在包含不同音乐流派的图书馆中匹配/查找相似歌曲的方法。

我的第一个尝试是检测诸如Tempo之类的功能或在歌曲中有多少低音以形成组,但由于采用了这种方法(基于音量变化的节拍检测),我并没有走得太远,因为不必计算大约20%的歌曲节拍总是,有时是它们的1/2或1/3,我无法实现。

经过数周的尝试失败后,我得到了一个新的主意,本文稍后会对此进行介绍。简而言之,它通过对文件的频谱样本进行采样,使之类似于文件的“平均频谱”来进行比较。背后的想法是,例如Hardstyle比一般的摇滚音乐拥有更多的低音,我还通过查看Audacity中的一些Spectrum来验证了这一点。

  • 文件1:获取完整的文件FFT频谱(2048个样本大小atm,对数幅度标度)
  • 对所有频谱阵列求和,取每个仓的平均值
  • 与其他文件相同,存储所有结果
  • 列出文件1和其他文件之间FFT值差异的列表
  • 对文件1和文件X之间的差异求平均值
  • 按这些平均值升序排列
  • “差值”最低的歌曲被视为相似。

你们中有一些知识渊博的人可以告诉我这是否是实施我的想法的正确/好的方法吗?


1
如果要检测速度,则可能需要对信号进行平方运算,然后进行傅立叶变换。在普通(非平方)FFT频谱中不会出现1 Hz量级的频率,因为它们已被滤除。用于音高检测的一个相关想法称为“倒谱”;您可以通过谷歌搜索找到有关它的信息。为了将流行音乐和爵士乐与古典音乐区分开,您可以尝试检测没有​​音调的架子鼓的声音。颤音应该是机器可检测的。有些不谐调可以机器计算。

1
也许您应该要求主持人将此移至dsp.SE
Dilip

我标记了我的问题,并要求将其移至SE的DSP。您的意思是我可以检测是否存在Drumkit来对输入进行分类?您能解释平方信号如何导致拍子吗?

3
音乐以这种方式记录和掌握,以使它们的频谱传播最大化,尤其是在如今。我认为全长频谱不会为您提供音乐分类的良好标准。
声子

2
您应该查看频谱图,而不是频谱。频谱只能一次显示整个歌曲的频率内容。频谱图显示了频率含量如何随时间变化。
endlith 2012年

Answers:


17

您正在尝试做的事情已经被数百名研究人员一遍又一遍地尝试,并且有大量的工作要做。检查ISMIR会议的会议记录。即使不是最新的,也请阅读Elias Pampalk的论文:http ://www.ofai.at/~elias.pampalk/publications/pampalk06thesis.pdf

要快速将您定向在正确的轨道上,请执行以下操作:

音乐在许多方面可能是相似的:a)音色/纹理/流派;b)节奏模式;c)旋律/和弦进行...等等!从您的消息中不清楚您要测量什么!

  • 如果您对a)感兴趣,则可能要查看的功能是MFCC(梅尔频率倒谱系数),因为它们以某种方式捕捉了人类听力的工作方式(频率扭曲,对数刻度),因为它们是去相关的(使建模更容易) ,并且它们的维数较低(13个系数与2048)。
  • 如果您对b)感兴趣,请查看一个称为“波动模式”的功能(Pampalk,简而言之,是几个频带上0.1 .. 10 Hz范围内信号的自相关);或Whitman的“便士”功能(MFCC在时间轴上的FFT)。
  • 如果您对c)感兴趣,请查看色谱图。从Ellis的色谱图代码(http://labrosa.ee.columbia.edu/matlab/chroma-ansyn/)开始,然后在需要更强大的功能(http://isophonics.net/nnls-chroma)时继续使用Mauch的实现。 )。

这是功能。现在,一旦将歌曲表示为一系列功能,您就必须想出一种比较这些歌曲的更好方法。计算序列之间的成对差异不是很聪明-例如:比较一首歌曲和同一首歌曲,并使其保持一定的静默度会产生完全相同的差异!您宁愿比较这些功能的分布; 例如,计算歌曲A上的特征的均值/标准差,以及歌曲B上的特征的均值/标准差,然后求出概率距离(KL,Bhattacharyya)。

最后一点,但稍后会很重要:计算歌曲与语料库其余部分之间的距离以找到最接近的匹配项效率很低。当处理大型集合时,诸如LSH或Ball树之类的技术可在不与整个语料库进行显式比较的情况下执行此类最近邻居查询。

顺便说一句,速度检测是完全不同的问题。如果您想研究一下,关于此主题的最佳性能/可访问性文章是Ellis的动态编程节拍跟踪。http://www.ee.columbia.edu/~dpwe/pubs/Ellis07-beattrack.pdf。它非常简单,但是接近最新的算法。


感谢您提供详尽的答案,在这种情况下,我已经多次听说过MFCC,因此不使用裸露的FFT结果似乎是合理的。用我当前的“知识状态”和开发环境(C#,巴斯图书馆的FFT结果)实施起来似乎很复杂,但是我会尝试的。
gfg 2012年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.