CreatePeriodicWave 是 AudioContext 提供的低阶波形生成工具,用于创建自定义周期性波表,需配合 OscillatorNode 使用;它通过 real 和 imag 数组定义傅里叶级数谐波系数(索引0被忽略),支持快速构造方波、锯齿波等常见波形及音色调制。

CreatePeriodicWave 是 AudioContext 提供的低阶波形生成工具,用于创建自定义周期性波表(wave table),常用于构建基础合成器音色(如正弦、方波、锯齿波、脉冲波,或更复杂的谐波叠加音色)。它不直接播放声音,而是配合 OscillatorNode 使用,替代默认的 type(如 "sine")来驱动振荡器输出你定义的波形。
核心原理:用实部与虚部构造频谱
CreatePeriodicWave 接收两组浮点数数组:real 和 imag,分别代表傅里叶级数中各谐波的余弦项(实部)和正弦项(虚部)系数。数组长度为 N,对应从基频(1×f₀)到第 N 次谐波(N×f₀)的幅度与相位信息。索引 0(即第 0 项)被忽略(直流分量强制为 0)。
例如,想构造一个纯正弦波(仅含 1 次谐波),只需:
const real = [0, 1]; // 第1项(索引1)实部=1 → cos(2πft)<br> const imag = [0, 0]; // 虚部全0 → 无 sin 分量<br> const wave = audioCtx.createPeriodicWave(real, imag);
快速生成常见波形的实用方法
无需手算傅里叶系数,可用数学规律直接构造:
-
方波(奇次谐波,幅度按 1/n 衰减):
const len = 128; const real = new Float32Array(len);<br> for (let i = 1; i < len; i += 2) real[i] = 1 / i;
-
锯齿波(所有谐波,幅度按 1/n 衰减,带相位):
const imag = new Float32Array(len);<br> for (let i = 1; i < len; i++) imag[i] = -1 / i;
-
三角波(奇次谐波,幅度按 1/n² 衰减,且只含余弦项):
for (let i = 1; i
在 Oscillator 中使用自定义波表
创建后需赋给 oscillator.setPeriodicWave(),并确保 oscillator 的 type 设为 "custom":
立即学习“前端免费学习笔记(深入)”;
const osc = audioCtx.createOscillator();<br> osc.type = "custom"; // 必须显式设置<br> osc.setPeriodicWave(wave); // 绑定你的 wave<br> osc.connect(destination);<br> osc.start();
⚠️ 注意:一旦设为 "custom",就不能再切换回 "sine" 等内置类型;若需动态换波形,应新建 oscillator 或复用 setPeriodicWave() 更新。
进阶技巧:实现简单音色塑形
通过调整谐波权重可实时改变音色质感:
- 衰减高频(如把
i > 20的系数设为 0)→ 更柔和、类木管音色 - 增强第 3、5 次谐波 → 增加“鼻音”或“簧片感”
- 对
imag数组加入小随机扰动 → 引入轻微失谐,模拟模拟合成器的温暖感 - 用 Web Audio 的
ScriptProcessorNode(已废弃)或AudioWorklet动态更新 wave(需重新 createPeriodicWave 并 set)



















