在嘈杂的.wav文件中检测鼓bpm


12

我正在寻找解决以下问题的算法:给定嘈杂的.wav声音捕获(麦克风上有风和摩擦噪声),如何检测柔和鼓声的BPM?

我尝试过搜索该主题,但由于用于分析和生成指纹ID的大量mp3相关软件,结果非常差。他们都没有提供有关如何实际执行操作的信息。

我知道消除噪声的算法,但是仍然使我面临检测BPM的问题。而且,根据解决BPM问题的方式,可能甚至不需要去噪(由于鼓的频率往往较低,而噪声的频率较高,因此简单的低通可能就足够了)。


1
这听起来与我的打sn检测问题相似。
Daniel R Hicks

Answers:


13

如果鼓声相对较强,一种可行的方法是获取波形的STFT幅度,然后仅在时间维度上对其自动进行相关。自相关函数的峰值将是拍子或拍子的约数。

这等效于将信号分成很多不同的频带,找到每个频带的幅度包络,对每个包络进行自相关,然后求和。通过互相关运算将噪声和音乐的其他部分平均化。

这是因为鼓拍会在许多频率(垂直线)上产生短暂的声音,而音乐的其他部分则仅在少数几个频率(水平线)上具有较长的声音,并且噪音是长期的,但在所有频率上都是随机的。如果您查看STFT,则可以看到节拍重复:

在此处输入图片说明

我为一个学校项目想出了这一点,以便为整个音乐文件找到一个BPM值,但是随着BPM的变化,它也可以适应音频流。您需要处理的块至少要比所需的BPM周期长两倍。


FFT是查找周期信号的通用技术。如果信号不是您所希望的那么规则,可能会有些棘手:鼓手可能会在歌曲过程中有意或无意加速或减慢速度,并且这可能会干扰FFT结果在频域中。
重新思考2012年

1
@Rethunk:如果BPM随时间变化,则需要分块进行,并找到每个BPM。
endolith 2012年

请注意,节拍通常与音乐相关联,在这张图片中您也可以看到音乐的另一部分:水平线,它们会改变节拍的高度。因此,基本上有三种能量贡献:拍子(垂直),音符(水平)和噪音(余量)。
MSalters 2014年

@MSalters:注释也可以相互关联
endolith 2014年

4

自相关无疑是一种很好的基本方法。您可以采取一些措施来进一步增强此功能:

  1. 如果您知道感光鼓的频谱,请对信号进行带通滤波,以便仅保留与感光鼓相关的频率。根据鼓的不同,它可能会很窄,应该消除绝大多数噪音。
  2. 然后,使用大致与鼓拍长度匹配的时间常数,计算信号的时域包络(“有损峰值”是最简单的方法)。
  3. 然后进行自相关
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.