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

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

我知道消除噪声的算法,但是这仍然给我带来了检测BPM的问题。并且取决于解决BPM问题的方式,我什至可能不需要去噪(由于鼓的频率往往较低,而噪声的频率较高,因此简单的低通可能就足够了。) br />

评论

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

#1 楼

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

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

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



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

评论


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

$ \ begingroup $
@Rethunk:如果BPM随时间变化,则需要分块进行,并找到每个BPM。
$ \ endgroup $
– Endolith
2012年1月16日4:20



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

$ \ begingroup $
@MSalters:注释也可以相互关联
$ \ endgroup $
– Endolith
2014年3月11日,0:09

#2 楼

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


如果您知道鼓的频谱,请对信号进行带通滤波,以便仅与频率相关保留到鼓上。
取决于鼓,这可能会很窄,应该消除
绝大多数噪声。
然后计算信号的时域包络(“有损峰值”
是最简单的方法),其时间常数与鼓拍的长度大致匹配。
然后进行自相关