2013-03-01 61 views
3

我一直在做这方面的大量研究,但我仍然遇到麻烦,所以我希望具有数字(音频)信号处理知识的人可以指点我在正确的方向。对音乐文件C的精确BPM检测#

我在有多难找到可以进行准确的节拍检测库感到惊讶。我几乎不知道DSP和FFT。我真正想要的是一个库,我可以简单地说:

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

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

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

+0

你看过aubio.com – 2013-03-01 15:33:37

+0

哈哈,你听起来像我Tevis。你有没有找到好的图书馆? – GONeale 2013-03-12 12:23:34

+0

迄今为止还没有任何东西,不幸的是:( – Tevis 2013-03-14 04:12:38

回答

2

您应该可以在不使用FFT的情况下进行基本的节拍检测。我已经建立了节拍检测算法。

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

现在,您已经获得了一小部分时间的功率(=响度)。

下一步采取从桶桶变化(衍生物)的速率:d [I] = S [I + 1] - S [i]中。

衍生物的阵列将告诉您如何快速响度从粮食到粮食增加。变化越快,节拍越激烈。

这里是它有点巧妙。你在这些d [i]值上加上一个门槛,以决定哪一个足够突然构成一个节拍。然后你进行自相关,看它们是否稳定并按照规则排列。