使用 FFT 频谱查找类似音乐

信息处理 声音的 fft 音乐
2022-01-11 03:32:01

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

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

经过几周的失败尝试后,我有了一个新想法,本文稍后将对此进行描述。简单地说,它通过获取文件的频谱样本来工作,制作类似文件的“平均频谱”来比较它们。背后的想法是,例如 Hardstyle 比一般的摇滚音乐有更多的低音,我还通过查看 Audacity 中的一些 Spectrums 来验证这一点。

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

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

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它非常简单,但接近最先进的算法。