4

我一直在对此进行大量研究,但仍然遇到麻烦,所以我希望对数字(音频)信号处理有深入了解的人可以为我指明正确的方向。

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

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

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

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

4

1 回答 1

4

您应该能够在不借助 FFT 的情况下进行基本的节拍检测。我已经建立了可以做到这一点的节拍检测算法。

基本的想法是把你的音频信号分割成小的时间段,比如 10 毫秒左右。对于每个桶计算 RMS 功率:对于桶中的每个样本 s[i],归一化为 -1.0...1.0,然后它们计算 s[i]**2 的总和。

现在,您已经在很短的时间内获得了一系列功率(=响度)。

接下来取桶之间的变化率(导数):d[i] = s[i+1] - s[i]。

导数数组告诉您响度从颗粒到颗粒增加的速度。变化越快,节拍就越强烈。

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

于 2015-05-16T00:18:21.293 回答