C# 对音乐文件C进行准确的BPM检测#

C# 对音乐文件C进行准确的BPM检测#,c#,signal-processing,C#,Signal Processing,我在这方面做了很多研究,但仍然有困难,所以我希望有人对数字(音频)信号处理有很强的了解,能为我指明正确的方向 我感到惊讶的是,要找到一个能够执行精确节拍检测的库是多么困难。我对DSP和FFT几乎一无所知。我真正想要的是一个图书馆,我可以简单地说: BPMDetect detector = new BPMDetect(); float bpm = detector.GetBpm(filename); 但显然这要求太高了。我得到的最接近的方法是使用SoundTouch库,但我最近发现那里的BPM检

我在这方面做了很多研究,但仍然有困难,所以我希望有人对数字(音频)信号处理有很强的了解,能为我指明正确的方向

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

BPMDetect detector = new BPMDetect();
float bpm = detector.GetBpm(filename);
但显然这要求太高了。我得到的最接近的方法是使用SoundTouch库,但我最近发现那里的BPM检测非常不可靠。我知道bpm检测并不是一门精确的科学,但SoundTouch声称我的一个音乐文件是170 bpm,而Abysmedia的bpm计数器程序准确地将其设置为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]值上设置一个阈值,以确定哪些值足够突然,可以构成一个节拍。然后你做自相关,看看它们是否稳定,是否以规则的模式排列。

你看过aubio.com吗?你听起来像我Tevis。你找到什么好的图书馆了吗?不幸的是,到目前为止还没有找到什么好的图书馆:(