
左右声道大小不一样,只能说明电平不同。两路信号即使电平完全一样,也可能反相;不同乐器的宽带混音更没有一个能概括全段的单一相位角。让动效听懂这个区别,比换一种发光颜色有用。
先选能解释的量
本例使用去均值后的 Pearson 相关系数,范围接近 -1 到 +1:相同波形为 +1,反相为 -1。静音或近似常量段的方差太小,结果应为未知,不能画成“完全同相”。Web Audio 提供声道数据与分析能力,但指标的解释仍由应用定义。
左右 RMS 的差适合驱动平衡位置,不应改名叫相位差。相关系数可以驱动画面宽度或连线方向,依然只是窗口内线性相似性。纯正弦且频率相同时,相关性与相位角有数学联系;复杂音乐不能直接用 arccos 变成可靠的相位仪。
function stereoCorrelation(left,right){
if(left.length!==right.length||left.length<2)throw Error('length');
const n=left.length;
if(![...left,...right].every(Number.isFinite))throw Error('sample');
let ml=0,mr=0;for(let i=0;i<n;i++){ml+=left[i]/n;mr+=right[i]/n;}
let ll=0,rr=0,lr=0;
for(let i=0;i<n;i++){const l=left[i]-ml,r=right[i]-mr;ll+=l*l;rr+=r*r;lr+=l*r;}
if(ll/n<1e-12||rr/n<1e-12)return null;
return Math.max(-1,Math.min(1,lr/Math.sqrt(ll*rr)));
}
function visualWidth(c){
if(c===null)return {width:1,label:'unknown',animate:false};
if(!Number.isFinite(c))throw Error('correlation');
return {width:1+.2*(1-Math.max(-1,Math.min(1,c))),label:'window-correlation',animate:true};
}

三组曲线是概念示意。本轮用离散合成信号验证了 +1、-1、缩放不变和静音未知,没有录制声卡数据。图中第三格是一侧静音、另一侧仍有波形;任一侧方差为零就不能定义相关系数。UNDEFINED 对应代码的 null,不应插值成某个正常读数。
窗口和延迟会改变结果
一条声道相对另一条延迟少量样本,相关性就可能下降;这不必然是录音错误,也可能是立体声空间设计。要检查延迟,可另外做受限 lag 范围的互相关,并报告采样率、窗口和最大搜索范围,不能只挑一个最大值然后声称“找到了真实相位”。
实时实现避免每帧展开长数组复制数据;示例的可读性优先,生产版本应复用缓冲并按固定窗口计算。动效再做有时间单位的平滑、幅度上限和静态模式。相关性剧烈变化时尤其不要让画面闪烁。
本轮没有浏览器双声道拆分、AudioWorklet 或设备回环验证。若音源本来是单声道复制到两路,得到 +1 是预期结果,不是算法识别出了丰富空间信息。
复现记录
本轮在 Node.js v26.3.0 中运行随文核心逻辑的构造样例,进程退出码为 0。测试输出:
PASS: identical/inverted/scaled-offset signals, silence undefined, static fallback, length error
将上方完整代码保存为 example.mjs,以 Node.js 26 执行 node example.mjs 可加载核心与教学输入;函数默认不访问网络、模型或硬件。浏览器适配入口需要明确传入对应对象,本轮未执行这些入口。上面的通过项来自独立构造样例,不能替代集成测试。
资料与时效
- Web Audio API 1.1:2026-09-22。
- Media Queries Level 5:2026-02-19。
本稿对应原预排时段;实际发布前须人工复核来源更正、SDK/API 版本及可用性,不据此预言 10 月 24–31 日的新事件。
本文探讨如何利用去均值后的Pearson相关系数量化左右声道相似性,用于驱动音频可视化动效。强调区分振幅差与相位差,指出相关系数在-1到+1范围内反映线性相似性,但不等价于物理相位角;静音或低方差段应标记为未知。讨论窗口大小、样本延迟对结果的影响,并提醒避免将RMS差误标为相位差。基于Web Audio API实现,适用于实时音频分析与可视化。

134

被折叠的 条评论
为什么被折叠?



