【问题标题】:Accurate BPM Detection on a music file C#音乐文件 C# 上的准确 BPM 检测
【发布时间】:2013-03-01 06:25:19
【问题描述】:

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

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

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

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

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

【问题讨论】:

  • 你看过aubio.com吗
  • 大声笑你听起来像我特维斯。你找到什么好的库了吗?
  • 到目前为止还没有真正的东西,不幸的是:(

标签: c# signal-processing


【解决方案1】:

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

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

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

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-10-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-18
    相关资源
    最近更新 更多