键检测舞曲错误 - matlab

信息处理 matlab fft 音乐 检测
2022-02-09 11:36:40

我一直在从事一个具有多种 DJ 功能的项目。我快结束了,但是,当输入舞曲曲目时,它的关键检测部分的准确率并不令人愉快。对于古典音乐,该算法返回的准确率非常好。

首先,我必须解释一下我从未在大学学习过信号处理,而我必须自己学习这些概念,所以请原谅我在这门学科上缺乏扩展知识(因此我在这里问这个问题)。

我花了大部分时间进行研究,最后我想出了一个算法,它混合了文献中提出的技术。

实现总结:音频被分成 5.5 秒的部分并转换为单声道,下采样至 11025hz 并使用 STFT 技术转换为频域。以 hz 为单位的 STFT 结果由 Chromagram 转换为真实的音符。色度图是一个 12 维色度向量,其中每个 bin 代表一个真实的音级,即第一个 bin 代表 A,第二个 bin 代表 A#,第三个代表 B 等等。然后每个色度向量与 24 个键模板相关。为每个键获得一个系数,当其他相关键之间的差异显着时,加权系统奖励最高相关键,并在差异很小时惩罚。

我在网上找到的 Dan Ellis 包的帮助下执行 STFT 和 Chromagram 步骤。

现在在原始代码中的参数是: w (4086) 是基本的 STFT DFT 长度(窗口是一半,跳是 1/4)

在同一个人写的论文中有这一部分:http: //imgur.com/0EVyjFc,他解释了 STFT 是如何执行的。

第一个问题:我不明白为什么他在将窗口传递给 STFT 函数之前将其分成两半?

现在,我使用了 8192 个样本的 FFT 长度,这与 Ellis 的 4086 不同,在执行参数测试后,该长度给了我最好的结果。

在计算汉宁窗之前,这些是参数的值。

sr =

11025


N =

8192


W =

4096


 H =

2048

第二个问题:舞曲结果如此不一致和不准确的原因是什么?是否可能是舞曲的某些特征使色谱图难以将 STFT 中的 hz 音符与真实的音符相匹配?也许是因为 Kicks,或者与较低的频率范围有关?您建议在执行 STFT 之前可以对音频做什么?可能是某种过滤器?你能建议在 STFT 中尝试任何不同的参数吗?或者一般来说有任何其他建议/额外步骤以使最终检测更好?然而,完全改变密钥检测的主要步骤的建议有点遥不可及,因为我没有太多时间提交项目了。

提前致谢!

2个回答

12 维色谱图可能无法很好地估计音高,因为合成的半音声音在多个奇次谐波处包含大量能量,因为这些谐波通常最终会出现在错误的音级槽中。如果有很多音调的低音,则在低音乐器/合成器的基音主要范围之上的低通滤波可能有助于消除一些谐波和泛音。

如果鼓没有调整到键(可能不是),那么它们会干扰任何以键为中心的音级信息。也许时域过滤掉所有敲击事件,并且只分析鼓声攻击之间的音调在这种情况下可能会有所帮助。即使是一个简单的低包络幅度门函数也可能是合适的(假设声音没有被压缩到包络的任何范围部分都没有更低的幅度!)。

而且,根据前面的答案,您确定您的“舞曲”的声音实际上包含一个音调吗?(而不是产生一些认知或听觉的音调错觉)。

我知道有两件事会导致问题:

  • 有些舞曲没有任何调。它只是听起来混在一起,直到听起来很棒。
  • 底鼓是最响亮的东西,但并不总是在特定的键上。通常它只是频率衰减。最近有一种趋势,将底鼓调整到轨道上,但并不总是这样做。

尝试在 100Hz 以上应用高通滤波器,看看是否能改善情况。我希望有比我更多的 FFT 技能的人来填写更多的答案!