waveshapernode 是 audiocontext 中实现失真、过载等非线性音频效果的核心节点,通过自定义 float32array 查找表将输入 [-1, 1] 映射为输出,支持 tanh 软削波和条件截断硬削波等变换。

WaveShaperNode 是 AudioContext 中用于非线性波形变换的核心节点,特别适合实现失真(distortion)、过载(overdrive)、饱和(saturation)等模拟电路风格的音频效果。它的原理是通过一个自定义的“查找表”(lookup table),将输入信号的每个采样值映射为新的输出值,从而改变波形形状。
1. 创建并配置 WaveShaperNode
WaveShaperNode 本身不带默认曲线,必须手动提供一个 Float32Array 作为映射表。数组长度通常为 2048 或 4096(2 的幂次,性能更优),索引对应归一化输入 [-1, 1],值对应输出 [-1, 1]:
- 用
audioCtx.createWaveShaper()创建节点 - 生成 lookup table:对每个归一化输入 x,计算期望的非线性输出 y(如 tanh、软削波、硬削波等)
- 将 y 值填入 Float32Array,注意数组需覆盖完整 [-1, 1] 区间(索引 0 → -1,末尾 → +1)
2. 实现常见失真类型
不同数学函数产生不同音色特征:
-
软削波(Soft Clipping / Overdrive):用
Math.tanh(x * gain),增益越大越激进,保留更多谐波但避免爆音 -
硬削波(Hard Clipping):直接截断
x > 1 ? 1 : x ,产生大量奇次谐波,音色尖锐 -
整流失真(Full-wave Rectify):
Math.abs(x),仅保留正半周,带来强烈中频能量 -
指数饱和(Exponential Saturation):
Math.sign(x) * (1 - Math.exp(-Math.abs(x) * k)),模拟电子管渐进压缩感
3. 连接与实时控制技巧
WaveShaperNode 应放在增益调节之后、输出之前,典型链路为:source → GainNode(前置增益)→ WaveShaperNode → GainNode(后置衰减)→ destination:
- 前置增益(pre-gain)决定输入电平,是控制失真强度的关键——调高它让信号更多进入非线性区
- 后置增益(post-gain)用于补偿整体响度,防止削波后音量过大或过小
- 可动态更新
waveshaper.curve属性实现参数实时变化(如旋钮控制失真度),但需重新生成整个 lookup table - 注意:curve 是只读属性,修改时必须赋新数组,不可原地修改旧数组内容
4. 注意事项与优化建议
WaveShaperNode 简单高效,但易踩坑:
- 确保 lookup table 长度 ≥ 2048,太短会导致量化噪声和高频失真
- 输入必须归一化到 [-1, 1],否则超出范围的值会被静音或引发未定义行为
- 避免在 curve 中出现突变点(如不连续导数),容易引入高频杂音;可用平滑插值或低阶多项式过渡
- 若需多级失真,可串联多个 WaveShaperNode,每级配不同曲线,比单级更富层次感
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!











