本章将快速回顾声音合成的基础理论,为后续深入学习数字合成技术奠定基础。我们将从声波的物理本质出发,经过模拟合成器的经典架构,过渡到数字音频处理的核心概念。对于已有信号处理背景的读者,本章将帮助您快速建立声音合成领域的知识框架。
声波是空气分子的压力波动,在标准大气压下以约343米/秒的速度传播。人耳可感知的频率范围约为20Hz到20kHz,这个范围定义了音频合成的基本工作域。
声压级可表示为:
p(t) = A·sin(2πft + φ)
其中:
任何周期信号都可以分解为基频及其整数倍频率的正弦波之和:
x(t) = a₀/2 + Σ[aₙcos(nω₀t) + bₙsin(nω₀t)]
其中系数为:
aₙ = (2/T)∫x(t)cos(nω₀t)dt
bₙ = (2/T)∫x(t)sin(nω₀t)dt
这一分解揭示了音色的本质:不同的谐波组合产生不同的音色。
自然乐器的频谱通常包含:
典型波形的谐波结构:
锯齿波:所有谐波,振幅∝1/n
方波:奇次谐波,振幅∝1/n
三角波:奇次谐波,振幅∝1/n²
虽然人耳对静态相位关系不敏感,但相位在以下情况很重要:
VCO是模拟合成器的声源,通过控制电压改变振荡频率:
f = f₀ · 2^(V_cv/V_oct)
其中V_oct通常为1V,实现1V/Oct标准。
经典VCO波形电路原理:
滤波器通过频率选择性衰减塑造音色:
低通滤波器(LPF):最常用,模拟自然声音的高频衰减
H(s) = ω₀²/(s² + (ω₀/Q)s + ω₀²)
关键参数:
经典滤波器类型:
VCA控制信号的振幅,实现音量包络和调制:
V_out = V_in · V_control
线性与指数响应:
ADSR定义声音的时间演化:
/\
/ \___
/ \
/ \
A D S R
各阶段的数学模型:
LFO产生低于20Hz的周期信号用于调制:
常见LFO目标:
连续信号的完美重建要求:
f_s > 2f_max
其中f_s是采样率,f_max是信号最高频率。
标准采样率:
量化将连续振幅映射到离散电平:
信噪比(dB) ≈ 6.02N + 1.76
其中N是位数。16位提供约96dB动态范围,24位提供约144dB。
量化误差可建模为均匀分布的白噪声:
σ²_q = Δ²/12
其中Δ是量化步长。
当f > f_s/2时,高频成分折返到低频:
f_alias = |f - nf_s|
防止混叠的方法:
过采样改善信号质量:
降采样流程:
数字振荡器的核心挑战是生成无混叠的经典波形。朴素方法产生的方波、锯齿波包含无限谐波,在数字域会造成严重混叠。
BLIT方法生成带限脉冲串,通过积分得到其他波形:
BLIT(t) = sin(Mπt/T) / (M·sin(πt/T))
其中M = floor(f_s/2f) + 1是最大谐波数。
锯齿波通过BLIT积分获得:
saw(t) = ∫BLIT(τ)dτ - DC_offset
BLEP在波形不连续点插入校正函数:
BLEP(t) = ∫sinc(t)dt
实现步骤:
优点:计算效率高,适合实时应用。
polyBLEP使用多项式近似BLEP函数:
polyBLEP(t) = {
t² + 2t + 1, -1 ≤ t < 0
-t² + 2t - 1, 0 ≤ t < 1
0, otherwise
}
实现锯齿波:
1. 生成朴素锯齿
2. 在跳变点应用polyBLEP
3. 缩放到[-1, 1]
DPW通过差分操作抑制高频:
1. x(n) = 2f/f_s · n (mod 1) - 1 // 朴素锯齿
2. y(n) = x(n)² // 抛物变换
3. z(n) = y(n) - y(n-1) // 差分
4. 输出 = c·z(n) // 缩放
其中c = f_s/(4f)用于振幅补偿。
优点:
Z变换是分析离散系统的核心工具:
X(z) = Σx[n]z^(-n)
基本性质:
系统传递函数:
H(z) = Y(z)/X(z) = (b₀ + b₁z^(-1) + ... + b_Mz^(-M))/(1 + a₁z^(-1) + ... + a_Nz^(-N))
FIR(有限冲激响应):
y[n] = Σb_k·x[n-k]
特点:
IIR(无限冲激响应):
y[n] = Σb_k·x[n-k] - Σa_k·y[n-k]
特点:
将模拟滤波器转换为数字滤波器:
s = (2/T)·(1 - z^(-1))/(1 + z^(-1))
频率弯曲(预畸变):
ω_a = (2/T)·tan(ω_d·T/2)
实例:模拟RC低通到数字
H_a(s) = 1/(1 + sRC)
→ H_d(z) = (1 + z^(-1))/(1/K + 1 + (1/K - 1)z^(-1))
其中K = RC·f_s
Butterworth低通设计:
1. 确定规格:f_c, f_s, 衰减
2. 计算阶数:N = log(ε)/log(f_s/f_c)
3. 放置极点:s_k = e^(jπ(2k+N-1)/(2N))
4. 双线性变换到z域
状态变量滤波器(SVF):
HP = input - LP - BP·Q
BP = HP·f + BP_z1
LP = BP·f + LP_z1
优点:同时输出低通、带通、高通。
1960s-1970s:模拟黄金时代
1980s:数字革命
1990s-2000s:虚拟模拟
混合架构趋势:
数字控制 + 模拟信号路径
├── 数字振荡器(无限复音)
├── 模拟滤波器(温暖音色)
└── 数字效果器(灵活处理)
模块化复兴:
云端合成:
本章快速回顾了声音合成的基础知识,为深入学习现代数字合成技术奠定基础。
x(t) = a₀/2 + Σ[aₙcos(nω₀t) + bₙsin(nω₀t)]f_s > 2f_maxSNR ≈ 6.02N + 1.76 dBBLIT(t) = sin(Mπt/T) / (M·sin(πt/T))s = (2/T)·(1 - z^(-1))/(1 + z^(-1))f = f₀ · 2^(V_cv/V_oct)练习1.1 一个440Hz的锯齿波,其前5个谐波的频率和相对振幅是多少?
练习1.2 在44.1kHz采样率下,最高可以无混叠地表示多少Hz的正弦波?如果要合成一个10kHz的方波,至少需要包含几个谐波?
练习1.3 一个ADSR包络的Attack=10ms, Decay=20ms, Sustain=0.7, Release=50ms。如果按键持续100ms,描述包络的完整时间演化。
练习1.4 推导polyBLEP算法中,为什么使用t² + 2t + 1和-t² + 2t - 1这两个多项式可以近似BLEP函数?
练习1.5 设计一个2极点Butterworth低通滤波器,截止频率1kHz,采样率48kHz。给出差分方程系数。
练习1.6 比较DPW和polyBLEP生成锯齿波的计算复杂度。在什么情况下选择哪种算法?
练习1.7 【开放题】如果要设计一个现代软件合成器,你会如何平衡音质、CPU效率和灵活性?列出你的设计决策和理由。
错误:直接生成方波或锯齿波
// 错误示例
float naive_saw(float phase) {
return 2.0f * phase - 1.0f; // 包含无限谐波!
}
正确做法:使用带限技术
// 正确示例
float bandlimited_saw(float phase, float freq, float sr) {
// 使用polyBLEP或DPW
return dpw_saw(phase, freq, sr);
}
错误:使用float累加相位
phase += freq / samplerate; // 累积误差!
正确做法:使用定点或双精度
// 使用归一化频率和模1运算
phase = fmod(phase + freq/sr, 1.0);
// 或使用定点算术
uint32_t phase_inc = (uint32_t)((freq/sr) * 4294967296.0);
错误:直接使用高Q值
// Q=100 在某些频率可能不稳定
filter.setQ(100);
正确做法:限制Q值范围,检查极点位置
Q = clamp(Q, 0.5f, 20.0f);
// 确保极点在单位圆内
错误:瞬时开始/停止
output = envelope * oscillator; // envelope从0跳到1
正确做法:最小Attack/Release时间
min_attack = 0.5ms; // 防止点击
min_release = 2ms;
错误:忽略DC分量
// PWM方波会产生DC
output = pwm_square(phase, pulsewidth);
正确做法:使用高通滤波器或DC阻断
// 简单的DC阻断器
dc_blocker = output - previous_output * 0.995f;
| 返回目录 | 下一章:FM合成原理 |