我一直在从事一个具有多种 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 中尝试任何不同的参数吗?或者一般来说有任何其他建议/额外步骤以使最终检测更好?然而,完全改变密钥检测的主要步骤的建议有点遥不可及,因为我没有太多时间提交项目了。
提前致谢!