本章深入探讨John Chowning开创的FM合成理论,重点关注他在1970年代发展的形态元音(formant vowel)合成技术。我们将从FM合成的数学基础出发,逐步深入到复杂的多算子调制网络,并探讨如何利用这些技术创造富有表现力的游戏音色。
FM合成的核心公式:
y(t) = A × sin(2π fc t + I × sin(2π fm t))
其中:
这个看似简单的公式隐藏着巨大的音色潜力。当调制信号作用于载波相位时,会产生瞬时频率的变化:
瞬时频率 fi(t) = fc + I×fm×cos(2π fm t)
频率偏移量在 ±I×fm 之间振荡,这就是为什么I被称为调制指数——它直接控制频率偏移的幅度。
FM信号的频谱可以用贝塞尔函数展开:
y(t) = A × Σ[n=-∞ to ∞] Jn(I) × sin(2π(fc + n×fm)t)
关键洞察:
频谱示意图(I=2, fc/fm=3):
| *
| * *
A | * * *
| * * * *
| * * * * *
|___________f
0 fm 2fm fc 4fm 5fm
贝塞尔函数Jn(I)决定了每个边带的振幅,具有几个重要特性:
贝塞尔函数振幅变化(n=0,1,2):
J(I) |\ J0
1.0 | \ /\
| \/ \/\
0.5 | X X \ J1
| / \ / \ \/\
0 | / \/ \ X \ J2
|________________\___I
0 2.4 5.5 8.7
实用的带宽估算公式:
BW ≈ 2fm(I + 1)
这个规则表明:
fc/fm比值决定频谱的谐波特性:
整数比(谐波频谱):
fc/fm = 2/1 → 边带:fc, fc±fm, fc±2fm...
产生谐波列:200, 300, 400, 500Hz...
非整数比(非谐波频谱):
fc/fm = 1.41/1 → 边带:141, 241, 341, 41Hz...
产生金属音色的非谐波泛音
当边带频率fc-n×fm<0时,会产生频谱折叠:
例:fc=200Hz, fm=150Hz, n=2
fc-2fm = 200-300 = -100Hz
折叠后:|−100Hz| = 100Hz(相位反转)
频谱折叠示意:
0Hz
|
←───┼───→
-100 | 100
↓ | ↑
折叠 | 实际
这种折叠会产生额外的拍频和粗糙度,常用于金属打击音色。
人类元音由声带基频和声道共振峰(formants)决定:
元音形态频率表(Hz):
F1 F2 F3
/a/ 700 1220 2600
/e/ 530 1840 2480
/i/ 320 2250 2890
/o/ 570 840 2410
/u/ 320 800 2200
声道作为一个复杂的声学滤波器,其共振特性由舌位、唇形和喉部形状决定。第一形态F1主要与舌的高低位置相关(舌位越低,F1越高),第二形态F2与舌的前后位置相关(舌位越前,F2越高)。
元音空间图(F1-F2平面):
F2(Hz)
2500 | /i/
| \
2000 | /e/
| \
1500 | \
| /a/ \
1000 | / /o/
| / /
500 |/u/────/
|________________F1(Hz)
300 500 700 900
Chowning的关键发现:通过精心设计的载波/调制频率比和动态调制指数,FM合成可以模拟人声形态。这个发现革命性地改变了电子音乐,因为它用简单的算法实现了复杂的声学现象。
基本策略:
Chowning的洞察在于,FM产生的边带群可以模拟形态的共振特性:
形态模拟原理:
自然形态:带通滤波器增强特定频率区域
FM形态:调制产生的边带群集中在载波附近
自然形态 FM模拟
___ ***
/ \ *****
/ \ *******
___/ \___ ***********
最简单的形态元音使用单个FM对:
/a/元音合成:
fc = 700Hz (第一形态)
fm = 110Hz (基频)
I(t) = 2 + 1.5×envelope(t)
动态频谱演化:
时间 →
t0: | * 纯正弦波
t1: | *** 出现边带
t2: | ***** 形态展宽
t3: | ******* 完整元音
形态的感知带宽对元音识别至关重要。Chowning发现调制指数I直接控制形态带宽:
带宽与调制指数关系:
BW_formant ≈ 2×fm×I
典型形态带宽:
F1: 60-130Hz
F2: 70-160Hz
F3: 100-200Hz
对应调制指数:
I1 = BW/(2×fm) ≈ 0.5-1.2
I2 = 0.6-1.5
I3 = 0.9-1.8
真实的元音需要至少两个形态(F1和F2)才能被准确识别。Chowning提出了几种实现方法:
mod1(t) = I1×sin(2π fm t)
mod2(t) = I2×sin(2π F1 t + mod1(t))
y(t) = A×sin(2π F2 t + mod2(t))
Chowning还研究了如何添加自然的颤音(vibrato)和震音(tremolo):
颤音实现(频率调制):
fc(t) = fc0 × (1 + depth_vib × sin(2π × 5Hz × t))
震音实现(振幅调制):
A(t) = A0 × (1 + depth_trem × sin(2π × 4.5Hz × t))
组合效果:
y(t) = A(t) × sin(2π fc(t) t + I×sin(2π fm t))
颤音和震音的频率略有不同(5Hz vs 4.5Hz)会产生更自然的效果,避免过于机械的周期性。
更真实的元音需要多个形态:
┌─────┐
fm1→─┤ OP1 ├─┐
└─────┘ │ ┌─────┐
├──→┤ Mix ├──→输出
┌─────┐ │ └─────┘
fm2→─┤ OP2 ├─┘
└─────┘
OP1: fc1=700Hz, I1=2.0 (F1)
OP2: fc2=1220Hz, I2=1.5 (F2)
并行结构的优势在于每个形态可以独立控制,这对于模拟不同元音间的过渡特别有用。混合比例决定了各形态的相对强度:
形态振幅比例(典型值):
F1 F2 F3
/a/ 1.0 0.7 0.3
/i/ 0.3 1.0 0.5
/u/ 0.8 0.2 0.1
动态混合实现:
A1(t) = lerp(A1_start, A1_end, t/duration)
A2(t) = lerp(A2_start, A2_end, t/duration)
Chowning的高级技术使用级联调制:
┌─────┐ ┌─────┐ ┌─────┐
fm→─┤ OP3 ├──→┤ OP2 ├──→┤ OP1 ├──→输出
└─────┘ └─────┘ └─────┘
这种结构可以产生非谐波频谱,模拟声道的非线性特性。级联的数学表达:
第一级:y1(t) = I1 × sin(2π fm t)
第二级:y2(t) = I2 × sin(2π fc2 t + y1(t))
第三级:y3(t) = A × sin(2π fc1 t + y2(t))
等效调制指数:I_eff ≈ I1 × I2
频谱复杂度呈指数增长
Yamaha DX7定义了32种算法,每种代表不同的6算子连接方式:
Algorithm 1(经典电钢琴):
[6]
|
[3]→[2]→[1]
|
[5]→[4]→输出
Algorithm 32(纯加法合成):
[1] [2] [3] [4] [5] [6]
| | | | | |
+---+---+---+---+---+→输出
算法选择的音色影响:
在FM网络中,算子可以扮演不同角色:
算子参数配置示例:
OP 频率比 调制深度 包络类型 角色
1 1.00 - Piano 载波
2 1.00 75 Decay 调制
3 3.51 50 Perc 调制
4 1.00 - Sustain 载波
5 7.00 30 Attack 调制
6 14.00 20 Fast 调制
不同的频率比产生不同的音色特征:
谐波比例(整数比):
1:1 → 奇次谐波(类方波)
2:1 → 完整谐波(类锯齿)
3:1 → 缺失某些谐波
4:1 → 仅偶次谐波
非谐波比例(音色效果):
1.41:1 → 轻微失谐,温暖感
2.71:1 → 钟声音色
3.14:1 → 金属质感
0.5:1 → 次谐波,厚重感
更复杂的FM网络包含反馈路径:
交叉反馈网络:
┌────────┐
↓ │
┌─────┐ ┌─────┐
│ OP1 ├─→┤ OP2 │
└─────┘ └─────┘
↑ │
└────────┘
参数空间:
β1: OP1→OP1 反馈量
β2: OP2→OP2 反馈量
β12: OP2→OP1 交叉反馈
β21: OP1→OP2 交叉反馈
反馈产生的效果:
游戏中可以实时改变网络拓扑:
场景切换示例:
探索模式:Algorithm 1(温暖垫音)
[6]→[5]→[4]→[3]→[2]→[1]→输出
战斗模式:Algorithm 17(尖锐主音)
[6]→[3]→[1]→输出
[5]→[2]→[1]
[4]→[1]
过渡策略:
1. 交叉淡化:500ms渐变
2. 调制深度渐变:先减后增
3. 频率滑动:portamento效果
元音过渡的关键在于调制指数的动态控制:
/i/→/a/过渡:
I1(t)
2.5 | ___
| / \
1.0 |___/ \___
|
0 100 200 300 ms
I2(t)
1.5 | ___
| ___/ \
0.5 |_/ \___
|
0 100 200 300 ms
自然人声包含微小的频率变化:
颤音实现:
fc(t) = fc0 × (1 + 0.01×sin(2π×5.5t))
fm(t) = fm0 × (1 + 0.005×sin(2π×6t + φ))
算子自调制产生噪声特性:
┌──────────┐
│ ↓
┌─┴───┐ ┌─────┐
│ OP1 ├──→┤ Out │
└─────┘ └─────┘
反馈量β控制从正弦到锯齿波的过渡
DX7风格的6算子网络:
算法示例(Algorithm 1):
OP6
↓
OP3→OP2→OP1
↑ ↓
OP5 OP4→输出
每个算子可以是载波或调制器,创造极其丰富的音色空间。
游戏中可以根据场景动态切换FM算法:
战斗状态:Algorithm 32(金属音色)
探索状态:Algorithm 1(温暖垫音)
过渡时间:500ms交叉淡化
分析其标志性的合成人声:
经典的环收集音:
fc = 1046.5Hz (C6)
fm = fc × 1.5
I:从8快速衰减到0
产生明亮的金属撞击声
关键概念:
重要公式:
贝塞尔函数计算 给定fc=440Hz,fm=110Hz,I=2,计算前5个边带的频率和相对振幅。
形态匹配 设计一个FM参数集来合成/e/元音(F1=530Hz, F2=1840Hz)。
调制指数与带宽 如果需要产生2kHz带宽的频谱,fm=100Hz,需要多大的调制指数?
频率比的影响 比较fc:fm = 1:1 和 fc:fm = 2:1 产生的频谱差异。
元音渐变设计 设计一个从/i/到/a/的平滑过渡,时长500ms。
反馈FM分析 推导反馈系数β=π/2时的输出频谱特征。
6算子音色设计 使用DX7的算法1,设计一个”水晶钟声”音色。
实时性能优化 游戏中需要同时运行32个FM音源,如何优化计算?
错误:高调制指数产生超过奈奎斯特频率的边带 解决:限制I×fm < fs/2 - fc,或使用过采样
错误:改变频率时产生咔嗒声 解决:使用相位累加器而非直接计算2πft
错误:I值阶跃变化导致频谱不连续 解决:对I值应用平滑滤波或包络
错误:深度调制时相位累积误差 解决:定期重置相位或使用双精度
错误:实时计算多个正弦函数 解决:使用查表、差分算法或波表合成