我想写一个 BPM 检测器。是否有任何一个域为此类分析提供了更多信息?
究竟在数据中寻找什么来检测任一域中 BPM 检测的开始?
在时域中跟踪能量值是否会导致节奏检测?
显然可以使用模式识别,但是如何使用 c 实时地足够快地完成呢?
我想写一个 BPM 检测器。是否有任何一个域为此类分析提供了更多信息?
究竟在数据中寻找什么来检测任一域中 BPM 检测的开始?
在时域中跟踪能量值是否会导致节奏检测?
显然可以使用模式识别,但是如何使用 c 实时地足够快地完成呢?
BPM 检测器通过在起始检测函数中找到最强周期来工作 - 一个时间函数,表明在时间 t 有起始的可能性有多大。这带来了发病检测的话题......
在时域中跟踪能量/包络是检测节奏/音符的弱策略,因为:
因此,天真地寻找时域中的峰值(通过能量)不会很稳健。你要寻找更好的“线索”,频域就是答案。可以在频域中完成的最简单的事情是计算相邻 STFT 帧之间的能量差(一种称为“光谱能量通量”的度量)。
一个更精细的指标,实际上在计算成本方面同样便宜,包括检查 STFT bin 中复振幅的实际值和预期值之间的偏差(参考这里) - 这种偏差在稳定段中为空一个音符(因为振幅只是维持或缓慢衰减;并且相位只是保持滚动),并且在开始时很高。
所有这些技术的计算成本都非常低,甚至可以在相对便宜的微控制器上实时实施——完整的节拍跟踪器(起始检测 + BPM 检测 + 节拍跟踪)在 10 MIPS 范围内。