在C#中准确检测音乐文件的BPM

4
我是一个有用的助手,可以为您翻译文本。

我一直在做这方面的研究,但仍然遇到困难,所以我希望有强大的数字(音频)信号处理知识的人能够指点我正确的方向。

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

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

但显然这太难了。 我最接近的方法是使用SoundTouch库,但我最近发现那里的BPM检测非常不可靠。 我知道BPM检测不是一门确切的科学,但SoundTouch声称我的其中一个音乐文件是170 BPM,而abyssmedia的BPM计数器程序将其准确放置在120 BPM。 所以我知道这是可能的。 我更关心的是准确性而不是速度。

所以我的问题是:有没有C#库可以在不需要了解DSP的情况下完成此操作?


你看过aubio.com吗? - Bjorn Roche
哈哈,你听起来像我一样,Tevis。你找到了好的库吗? - GONeale
目前还没有什么进展,很遗憾 :( - Tevis
1个回答

4
您应该能够进行基本的节奏检测,而无需使用FFT。我已经构建了执行此操作的节奏检测算法。
基本思路是将音频信号分割为小的时间桶,例如10毫秒左右。对于每个时间桶,计算RMS功率:对于桶中的每个样本s[i],将其归一化为-1.0…1.0,然后计算s[i]**2的总和。
现在您有了一组小时间粒度的功率(=响度)数组。
接下来从一个时间桶到另一个时间桶计算变化率(导数):d[i] = s[i+1] - s[i]。
导数数组告诉您响度从粒度到粒度的增加速度。变化越快,节奏就越强烈。
这里有点艺术性。您可以在这些d[i]值上设置阈值,以确定哪些突然的变化足以构成节奏。然后进行自相关以查看它们是否稳定并且按照规律排列。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接