我一直在做很多关于这方面的研究,我仍然遇到麻烦,所以我希望对数字(音频)信号处理有深刻了解的人能指出我正确的方向。
我很惊讶找到一个可以执行准确节拍检测的库是多么困难。我对DSP和FFT几乎一无所知。我真正想要的是一个图书馆,我可以简单地说:
BPMDetect detector = new BPMDetect();
float bpm = detector.GetBpm(filename);
但显然这要求得太多了。我最接近的是使用SoundTouch库,但我最近发现BPM检测非常不可靠。我知道bpm检测不是一门精确的科学,但是SoundTouch声称我的一个音乐文件是170 BPM,而abyssmedia的BPM Counter程序准确地将它定为120 BPM。所以我知道这是可能的。我更关注准确性而不是速度。
所以我的问题是:是否有一个C#库可以做到这一点而不必了解很多关于DSP的知识?
答案 0 :(得分:3)
您应该能够在不诉诸FFT的情况下进行基本的节拍检测。我已经建立了这样做的节拍检测算法。
基本思路是将您的音频信号分配到一小段时间,比如10毫秒左右。对于每个桶计算RMS功率:对于桶中的每个样本s [i],归一化到-1.0 ... 1.0并且它们计算s [i] ** 2的总和。
现在你已经获得了一小段时间的力量(=响度)。
接下来采取从桶到桶的变化率(衍生物):d [i] = s [i + 1] - s [i]。
衍生物数组告诉你响度从谷粒到谷物的增加有多快。变化越快,节拍越强烈。
这里有点巧妙。您在这些d [i]值上设置了一个阈值,以确定哪些突然足以构成节拍。然后你进行自相关以查看它们是否稳定并以常规模式排列。