我已经尝试了数周,以找到一种在包含不同音乐流派的库中匹配/查找类似歌曲的方法。

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

经过数周的尝试失败,我有了一个新的主意,本文稍后将对此进行介绍。简而言之,它可以通过对文件的频谱样本进行采样,使之类似于文件的“平均频谱”来进行比较。
背后的想法是,例如Hardstyle的低音比普通的摇滚音乐要多得多,我也验证了



文件1:获取完整的文件FFT频谱(2048个样本大小atm,幅度对数缩放)
求和所有频谱阵列,每个Bin的平均值
对其他文件进行相同处理,存储所有结果
制作文件1和其他文件之间的FFT值差异列表
对文件1和文件X之间的差异求平均值
/>通过这些平均值进行升序排序
“差值”最低的歌曲被认为是相似的。

某些有丰富知识的人可以告诉我这是否是正确的/实现我的想法的好方法?

评论

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

也许您应该请主持人将此移至dsp.SE

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

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

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

#1 楼

您正在尝试做的事情已经被数百名研究人员反复尝试,并且有关此问题的工作量很大。检查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的“ Penny”功能(沿时间轴的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。它非常简单,但是接近最新的算法。

评论


$ \ begingroup $
感谢您的详细回答,在这种情况下,我已经多次听说过MFCC,因此不使用裸露的FFT结果似乎是合理的。用我当前的“知识状态”和开发环境(C#,巴斯图书馆的FFT结果)实施起来似乎很复杂,但是我会尝试的。
$ \ endgroup $
– gfg
2012年2月9日在12:54