节拍检测:自相关如何从波形里「听」出 BPM
人打拍子,机器算相关
人判断一首歌的 BPM,靠的是「打拍子」:身体跟着节奏默数,数得顺的那个速度就是答案。机器不会默数,但它有一件人没有的武器——统计。核心思想叫自相关:把一段信号和自己错开不同长度相比较,看错开多少的时候最像自己。可以想象成给波形放一个不断拉长的「回声」,逐个延迟量去问一遍:这个延迟下,回声和原声重叠得像不像?如果乐曲里每 0.5 秒出现一次鼓点,那么把 onset 序列错开 0.5 秒再和原序列叠在一起,两者会高度重合——这个「错开多少最像自己」的量,就是节拍周期。自相关不需要知道哪里是鼓、哪里是贝斯,它只认「周期性重合」这一件事,所以对鼓组、人声、电子乐一视同仁。
四级流水线
从原始波形到 BPM,站点走的是四级流水线,每一级都只做一件小事,上一级的输出就是下一级的输入:
**① 降混单声道。**节拍信息左右声道共享,先逐采样平均合并,后面只用一条曲线算账。立体声的相位差、宽度这些「空间信息」对节拍毫无贡献,留着只会白耗算力——鼓在正中还是偏左,拍子都是同一个:
| |
**② 能量包络。**以 1024 采样为窗、512 采样为跳步,逐窗算 RMS——窗比步进长一倍,相邻窗恰好重叠一半,曲线既平滑又保得住位置感;44.1kHz 下大约每秒 86 帧,把几百万个采样压成一条「每时刻有多响」的粗曲线:
| |
**③ onset 强度。**相邻帧的能量差只取正数(半波整流):声音「新到达」的时刻才计分,能量衰减不算——衰减是余音,不是新事件。鼓点越密、越强的位置,曲线值越高,这一步把「响度」变成了「打击感」。曲线随后做一次去均值、按标准差归一,让强弱不同的歌落进同一把尺子:
| |
**④ 自相关。**把 onset 序列和自己错开 lag 相乘求和,并按重叠长度归一,避免偏向短滞后:
| |
lag 对应周期:峰所在的 lag 就是节拍周期,代入帧率与跳步换算回 BPM。归一还顺手解决了一个偏差:不按重叠长度归一的话,lag 越小重叠越多、相关值天然越高,峰会被系统性地拽向快的一侧。整条流水线在浏览器本地完成,文件不上传。
八度歧义:半速倍速都对
自相关有个绕不过去的坑。120 BPM 的歌,240 BPM「也对」——每拍踩两下照样合拍;半速的 60 同理。一个节奏里同时存在 2:1 的多层周期,自相关在这些倍频位置都会竖起合理高度的峰,哪一层是「主拍」,取决于编排和听者的耳朵,数学上没有唯一解。这就是节拍检测的根本歧义:八度歧义。
工程上诚实的做法是不假装只有一个答案。🔧 BPM节拍检测 把主 BPM 之外再列 Top-3 候选,每个候选配一键换算 0.5×/1×/2×,让用户的耳朵拍板——机器负责把候选缩小到三个,判断权交还给人。搜索区间本身设为 60–180 BPM 对应的滞后带,先避开一部分歧义;但带内半速峰与真峰并存的情况依然会发生,这正是候选列表存在的意义。顺带一提,检测结果还给出每拍毫秒与四小节时长——做卡点视频、翻唱定速的人拿到的不是孤零零一个数,而是能直接用进剪辑时间线的量。
精度:整数 lag 的台阶
滞后是整数帧,BPM 就只能落在台阶上。44.1kHz、512 跳步下帧率约 86Hz,在 120 BPM 附近(lag 约 43 帧),lag 每差一帧,换算出的 BPM 就跳约 2.8——整数 lag 给不出 120.3 这种数。解法是抛物线插值:取峰顶及其左右两点的相关值,拟合一条抛物线,用抛物线顶点作为细化后的峰位:
| |
峰位从整数帧细化到亚帧,BPM 误差从 ±3 量级压到 ±0.2——结果里那些带小数的读数就是这么来的。
置信度:显著度而不是硬答案
纯噪声、录音棚底噪、一段持续的铺底音,也能让自相关「算出」一个峰,但那个峰毫无意义——随机信号的相关峰是抽签抽出来的,恒定信号则处处等高。所以检测器还欠一个「这个峰可信吗」的账。站点的做法是看主峰相对整个滞后区间分布的显著度:把全区间的相关值做统计,主峰超出背景多少个标准差(z 分数启发式)映射成 0 到 1 的置信度——主峰比背景高出一大截才敢给高分。信号近乎静音或恒定、onset 曲线根本没有波动时,直接报「无可感知节拍」,置信度置零,而不是硬凑一个数。置信度偏低时页面会明示提醒,建议换一段更完整的片段再测。宁可说「我不知道」,也不给一个看起来精确的假答案——这是统计工具的基本操守。
拿到 BPM 之后
测出节拍只是开始。做混响和延时,每拍毫秒 = 60000 ÷ BPM,再按音符分值取值——直拍、附点(×1.5)、三连音(×2/3)各一列,🔧 BPM延时换算 给出全音符到六十四分音符的时值全表,还支持反向:给一个目标毫秒数求对应 BPM,混响预延迟该跟拍还是独立取值,页面也给了口径注记。练琴跟拍子,🔧 在线节拍器 按检测值设定 30-240 BPM,用 WebAudio 音频时钟做 lookahead 调度,拍点由硬件时钟定时、长时间运行不漂移。混音里更多按 BPM 展开的公式——每拍毫秒、四小节时长等——连同前两篇的响度账本,都收在音频创作工具箱专题里。