我正在寻找解决以下问题的算法:给定嘈杂的 .wav 声音捕获(麦克风上有一些风+摩擦噪声),如何检测柔和鼓声的 BPM?
我尝试用谷歌搜索该主题,但结果很差,因为用于分析和指纹 ID 生成的 mp3 相关软件数量巨大。他们都没有提供有关如何实际执行此操作的信息。
我知道消除噪音的算法,但这仍然给我留下了检测 BPM 的问题。并且根据 BPM 问题的解决方式,我什至可能不需要去噪(因为鼓往往处于较低频率而噪声较高,因此简单的低通可能就足够了预处理)。
我正在寻找解决以下问题的算法:给定嘈杂的 .wav 声音捕获(麦克风上有一些风+摩擦噪声),如何检测柔和鼓声的 BPM?
我尝试用谷歌搜索该主题,但结果很差,因为用于分析和指纹 ID 生成的 mp3 相关软件数量巨大。他们都没有提供有关如何实际执行此操作的信息。
我知道消除噪音的算法,但这仍然给我留下了检测 BPM 的问题。并且根据 BPM 问题的解决方式,我什至可能不需要去噪(因为鼓往往处于较低频率而噪声较高,因此简单的低通可能就足够了预处理)。
如果存在相对较强的鼓声,一种可行的方法是获取波形的 STFT 幅度,然后仅在时间维度上自动关联它。自相关函数的峰值将是节拍,或它的约数。
这相当于将信号分解成许多不同的频带,找到每个频带的幅度包络,对每个包络进行自相关,然后将它们相加。通过互相关运算将音乐的噪声和其他部分平均化。
这是因为鼓声在许多频率(垂直线)上产生短暂的声音,而音乐的其他部分仅在少数频率(水平线)上长期存在,并且噪声在所有频率上都是长期存在的但随机的。如果您查看 STFT,您可以看到节拍重复:
我为一个学校项目想出了这个来为整个音乐文件找到一个 BPM 值,但它也可以适应改变 BPM 的音频流。您需要处理至少两倍于您正在寻找的 BPM 周期的块。
自相关当然是一个很好的基本方法。您可以做一些事情来进一步增强这一点: