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