第九章:Chowning的FM形态元音与高级调制合成
本章深入探讨John Chowning开创的FM合成理论,重点关注他在1970年代发展的形态元音(formant vowel)合成技术。我们将从FM合成的数学基础出发,逐步深入到复杂的多算子调制网络,并探讨如何利用这些技术创造富有表现力的游戏音色。
9.1 FM合成的数学基础回顾
基本FM公式
FM合成的核心公式:
y(t) = A × sin(2π fc t + I × sin(2π fm t))
其中:
- fc = 载波频率(carrier frequency)
- fm = 调制频率(modulator frequency)
- I = 调制指数(modulation index)
- A = 振幅
这个看似简单的公式隐藏着巨大的音色潜力。当调制信号作用于载波相位时,会产生瞬时频率的变化:
瞬时频率 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)
关键洞察:
- 边带位于 fc ± n×fm
- 边带振幅由贝塞尔函数Jn(I)决定
- 调制指数I控制频谱复杂度
- 某些I值会使特定边带消失(贝塞尔零点)
频谱示意图(I=2, fc/fm=3):
| *
| * *
A | * * *
| * * * *
| * * * * *
|___________f
0 fm 2fm fc 4fm 5fm
贝塞尔函数的音色意义
贝塞尔函数Jn(I)决定了每个边带的振幅,具有几个重要特性:
- 能量守恒:Σ[Jn(I)]² = 1,总能量保持不变
- 零点特性:特定I值使某些谐波消失,如J0(2.405)=0
- 渐近行为:高阶边带按n!衰减,自然限制带宽
贝塞尔函数振幅变化(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
Carson带宽规则
实用的带宽估算公式:
BW ≈ 2fm(I + 1)
这个规则表明:
- I=0时,BW=2fm(仅载波和第一边带)
- I增大时,带宽线性增长
- 98%的能量包含在此带宽内
频率比的谐波性
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
↓ | ↑
折叠 | 实际
这种折叠会产生额外的拍频和粗糙度,常用于金属打击音色。
9.2 Chowning的形态元音理论
人声形态的声学基础
人类元音由声带基频和声道共振峰(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
FM形态元音合成原理
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提出了几种实现方法:
- 并行加法合成:
y(t) = A1×sin(2π F1 t + I1×sin(2π fm t))
+ A2×sin(2π F2 t + I2×sin(2π fm t))
- 共享调制器:
mod(t) = sin(2π fm t)
y(t) = A1×sin(2π F1 t + I1×mod(t))
+ A2×sin(2π F2 t + I2×mod(t))
- 级联调制(产生更复杂的交互):
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)会产生更自然的效果,避免过于机械的周期性。
9.3 多载波FM网络
并行载波结构
更真实的元音需要多个形态:
┌─────┐
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
频谱复杂度呈指数增长
DX7的算法系统
Yamaha DX7定义了32种算法,每种代表不同的6算子连接方式:
Algorithm 1(经典电钢琴):
[6]
|
[3]→[2]→[1]
|
[5]→[4]→输出
Algorithm 32(纯加法合成):
[1] [2] [3] [4] [5] [6]
| | | | | |
+---+---+---+---+---+→输出
算法选择的音色影响:
- 串行算法(1-5):适合钟声、金属音色
- 分支算法(6-15):适合弦乐、管乐
- 并行算法(16-32):适合复杂谐波音色
算子角色与功能
在FM网络中,算子可以扮演不同角色:
- 载波算子(Carrier):直接输出到音频
- 调制算子(Modulator):调制其他算子
- 自调制算子:通过反馈调制自身
算子参数配置示例:
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 交叉反馈
反馈产生的效果:
- 低反馈(β<0.5):增加谐波丰富度
- 中反馈(0.5<β<π):锯齿波特性
- 高反馈(β>π):噪声、混沌
动态网络重配置
游戏中可以实时改变网络拓扑:
场景切换示例:
探索模式:Algorithm 1(温暖垫音)
[6]→[5]→[4]→[3]→[2]→[1]→输出
战斗模式:Algorithm 17(尖锐主音)
[6]→[3]→[1]→输出
[5]→[2]→[1]
[4]→[1]
过渡策略:
1. 交叉淡化:500ms渐变
2. 调制深度渐变:先减后增
3. 频率滑动:portamento效果
9.4 动态频谱造型技术
调制指数包络
元音过渡的关键在于调制指数的动态控制:
/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 + φ))
9.5 高级调制技术
反馈FM
算子自调制产生噪声特性:
┌──────────┐
│ ↓
┌─┴───┐ ┌─────┐
│ OP1 ├──→┤ Out │
└─────┘ └─────┘
反馈量β控制从正弦到锯齿波的过渡
交叉调制网络
DX7风格的6算子网络:
算法示例(Algorithm 1):
OP6
↓
OP3→OP2→OP1
↑ ↓
OP5 OP4→输出
每个算子可以是载波或调制器,创造极其丰富的音色空间。
动态算法切换
游戏中可以根据场景动态切换FM算法:
战斗状态:Algorithm 32(金属音色)
探索状态:Algorithm 1(温暖垫音)
过渡时间:500ms交叉淡化
9.6 游戏应用实例分析
《异度神剑》的FM人声
分析其标志性的合成人声:
- 使用4算子FM
- 形态频率随音高缩放
- 动态调制指数响应音量
《音速小子》的FM音效
经典的环收集音:
fc = 1046.5Hz (C6)
fm = fc × 1.5
I:从8快速衰减到0
产生明亮的金属撞击声
本章小结
关键概念:
- 贝塞尔函数决定FM频谱的边带分布
- 形态元音通过匹配人声共振峰频率实现
- 调制指数包络控制音色的动态演化
- 多算子网络提供丰富的音色可能性
- 反馈FM产生噪声和非谐波频谱
重要公式:
- 基本FM:y(t) = A×sin(2πfct + I×sin(2πfmt))
- 边带频率:fc ± n×fm
- 边带振幅:Jn(I)
- 调制指数与带宽:BW ≈ 2fm(I+1)
练习题
基础题
- 贝塞尔函数计算 给定fc=440Hz,fm=110Hz,I=2,计算前5个边带的频率和相对振幅。
提示
使用贝塞尔函数表或近似公式,边带位于fc±n×fm答案
边带频率:220Hz, 330Hz, 440Hz, 550Hz, 660Hz 相对振幅(查表J0(2)≈0.22, J1(2)≈0.58, J2(2)≈0.35, J3(2)≈0.13, J4(2)≈0.03)- 形态匹配 设计一个FM参数集来合成/e/元音(F1=530Hz, F2=1840Hz)。
提示
使用两个并行FM对,每个对应一个形态答案
OP1: fc1=530Hz, fm1=110Hz, I1=1.8 OP2: fc2=1840Hz, fm2=110Hz, I2=1.2 混合比例约为1:0.7- 调制指数与带宽 如果需要产生2kHz带宽的频谱,fm=100Hz,需要多大的调制指数?
提示
使用Carson带宽规则:BW ≈ 2fm(I+1)答案
2000 ≈ 2×100×(I+1) I ≈ 9- 频率比的影响 比较fc:fm = 1:1 和 fc:fm = 2:1 产生的频谱差异。
提示
考虑边带位置和谐波/非谐波特性答案
1:1产生奇次谐波频谱(类似方波) 2:1产生完整谐波列(类似锯齿波) 频谱密度和音色明亮度不同挑战题
- 元音渐变设计 设计一个从/i/到/a/的平滑过渡,时长500ms。
提示
需要同时控制多个载波频率和调制指数答案
F1: 320Hz→700Hz,使用指数曲线 F2: 2250Hz→1220Hz,使用对数曲线 I1: 1.0→2.0,线性插值 I2: 2.5→1.5,线性插值 基频保持110Hz不变- 反馈FM分析 推导反馈系数β=π/2时的输出频谱特征。
提示
考虑相位的递归关系和稳态解答案
产生类似锯齿波的频谱 奇偶谐波都存在 高频谐波按1/n衰减 出现轻微的频率偏移- 6算子音色设计 使用DX7的算法1,设计一个"水晶钟声"音色。
提示
钟声需要非谐波泛音和长衰减答案
OP1(载波): fc=基频, 长衰减 OP2(调制): fm=fc×1.41, I=3, 快衰减 OP3(调制): fm=fc×3.14, I=1, 中等衰减 OP4(载波): fc=基频×2.73, 长衰减 OP5(调制): fm=OP4×1.73, I=2 OP6: 关闭或用作LFO- 实时性能优化 游戏中需要同时运行32个FM音源,如何优化计算?
提示
考虑查表、SIMD、渐进式精度答案
- 正弦查表(4096点,线性插值) - SIMD并行计算4个声音 - LOD系统:远处音源用简化算法 - 预计算调制信号,多载波共享 - 固定点数学代替浮点 - 音频剔除:静音时跳过计算常见陷阱与错误
1. 混叠问题
错误:高调制指数产生超过奈奎斯特频率的边带 解决:限制I×fm < fs/2 - fc,或使用过采样
2. 相位不连续
错误:改变频率时产生咔嗒声 解决:使用相位累加器而非直接计算2πft
3. 调制指数突变
错误:I值阶跃变化导致频谱不连续 解决:对I值应用平滑滤波或包络
4. 数值精度问题
错误:深度调制时相位累积误差 解决:定期重置相位或使用双精度
5. CPU开销低估
错误:实时计算多个正弦函数 解决:使用查表、差分算法或波表合成
调试技巧
- 使用频谱分析器实时监控输出
- 从简单比例(1:1, 2:1)开始测试
- 记录并可视化调制指数包络
- 分离测试每个算子的输出
- 使用A/B对比测试微小参数变化