您正在尝试做的事情已经被数百名研究人员一遍又一遍地尝试,并且有大量的工作要做。检查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。它非常简单,但是接近最新的算法。