对音乐文件C#进行准确的BPM检测

时间:2013-03-01 06:25:19

标签: c# signal-processing

我一直在做很多关于这方面的研究,我仍然遇到麻烦,所以我希望对数字(音频)信号处理有深刻了解的人能指出我正确的方向。

我很惊讶找到一个可以执行准确节拍检测的库是多么困难。我对DSP和FFT几乎一无所知。我真正想要的是一个图书馆,我可以简单地说:

BPMDetect detector = new BPMDetect();
float bpm = detector.GetBpm(filename);

但显然这要求得太多了。我最接近的是使用SoundTouch库,但我最近发现BPM检测非常不可靠。我知道bpm检测不是一门精确的科学,但是SoundTouch声称我的一个音乐文件是170 BPM,而abyssmedia的BPM Counter程序准确地将它定为120 BPM。所以我知道这是可能的。我更关注准确性而不是速度。

所以我的问题是:是否有一个C#库可以做到这一点而不必了解很多关于DSP的知识?

1 个答案:

答案 0 :(得分:3)

您应该能够在不诉诸FFT的情况下进行基本的节拍检测。我已经建立了这样做的节拍检测算法。

基本思路是将您的音频信号分配到一小段时间,比如10毫秒左右。对于每个桶计算RMS功率:对于桶中的每个样本s [i],归一化到-1.0 ... 1.0并且它们计算s [i] ** 2的总和。

现在你已经获得了一小段时间的力量(=响度)。

接下来采取从桶到桶的变化率(衍生物):d [i] = s [i + 1] - s [i]。

衍生物数组告诉你响度从谷粒到谷物的增加有多快。变化越快,节拍越强烈。

这里有点巧妙。您在这些d [i]值上设置了一个阈值,以确定哪些突然足以构成节拍。然后你进行自相关以查看它们是否稳定并以常规模式排列。