实时结合时域和频域数据进行 BPM 检测

信息处理 声音的
2022-02-11 16:53:00

我想写一个 BPM 检测器。是否有任何一个域为此类分析提供了更多信息?

究竟在数据中寻找什么来检测任一域中 BPM 检测的开始?

在时域中跟踪能量值是否会导致节奏检测?

显然可以使用模式识别,但是如何使用 c 实时地足够快地完成呢?

1个回答

BPM 检测器通过在起始检测函数中找到最强周期来工作 - 一个时间函数,表明在时间 t 有起始的可能性有多大。这带来了发病检测的话题......

在时域中跟踪能量/包络是检测节奏/音符的弱策略,因为:

  • 对于某些乐器,有一些演奏技巧可以在不显着改变能量的情况下产生新的音符(例如,在大提琴的弦上移动手指而不改变弓弦,或者在长笛上改变指法并持续吹奏)。这具有在时域包络中没有明显变化的情况下产生基频变化的效果。
  • 许多商业音乐被严重压缩,以至于信号几乎一直被“泵送”到最大幅度。
  • 虽然这是另一个极端情况,但值得提醒的是,某些乐器或演奏技巧的启动速度非常慢。

因此,天真地寻找时域中的峰值(通过能量)不会很稳健。你要寻找更好的“线索”,频域就是答案。可以在频域中完成的最简单的事情是计算相邻 STFT 帧之间的能量差(一种称为“光谱能量通量”的度量)。

一个更精细的指标,实际上在计算成本方面同样便宜,包括检查 STFT bin 中复振幅的实际值和预期值之间的偏差(参考这里) - 这种偏差在稳定段中为空一个音符(因为振幅只是维持或缓慢衰减;并且相位只是保持滚动),并且在开始时很高。

所有这些技术的计算成本都非常低,甚至可以在相对便宜的微控制器上实时实施——完整的节拍跟踪器(起始检测 + BPM 检测 + 节拍跟踪)在 10 MIPS 范围内。