采样合成技术代表了电子音乐制作的一次根本性革命。与振荡器产生的合成波形不同,采样技术直接捕获真实世界的声音,将其数字化存储,并通过各种算法进行回放和处理。这种方法不仅能够完美再现传统乐器的音色,还开启了声音设计的全新维度。
从1970年代末期Fairlight CMI的问世,到1980年代Akai S系列和E-MU Emulator的普及,再到今天无处不在的软件采样器,采样技术已经成为现代音乐制作不可或缺的工具。本章将深入探讨采样合成的数学原理、关键算法和实际应用技巧。
脉冲编码调制(PCM)是数字音频的基础。连续时间信号x(t)通过采样变为离散时间信号x[n]:
x[n] = x(nT_s)
其中T_s = 1/f_s是采样周期,f_s是采样率。
采样过程在数学上等价于与冲激串的乘积:
x_s(t) = x(t) · Σ δ(t - nT_s)
在频域中,这导致原始频谱的周期性重复:
X_s(f) = (1/T_s) · Σ X(f - kf_s)
采样定理规定,为了完美重建带限信号,采样率必须至少是信号最高频率分量的两倍:
f_s ≥ 2·f_max
当f_s < 2·f_max时,会产生混叠(aliasing),高频分量会折叠到低频区域:
混叠频率:f_alias = |f - k·f_s|
其中k是使f_alias落在[0, f_s/2]区间的整数。
量化将连续幅度值映射到有限的离散电平。对于B位量化器:
理论信噪比(SNR):
SNR(dB) = 6.02B + 1.76 + 10log₁₀(σ_x²/σ_full²)
对于满幅正弦波,简化为:
SNR(dB) ≈ 6.02B + 1.76
这意味着每增加1位,SNR提高约6dB。
理想的抗混叠滤波器具有砖墙型频率响应:
H(f) = { 1, |f| < f_c
{ 0, |f| ≥ f_c
其中f_c = f_s/2是奈奎斯特频率。
实际中使用高阶巴特沃斯或切比雪夫滤波器,设计参数包括:
过采样技术通过提高初始采样率放宽滤波器要求:
过采样因子 M = f_s_high / f_s_target
采样循环通过在特定点重复播放一段音频来延长持续时间。设循环起点为L_start,终点为L_end,循环长度为:
L_length = L_end - L_start + 1
播放位置计算:
position(t) = { t, t < L_end
{ L_start + (t-L_end) % L_length, t ≥ L_end
为避免循环点的咔嗒声,需要在零交叉点设置循环:
零交叉检测:x[n-1] · x[n] < 0 且 |x[n]| < threshold
改进的算法考虑斜率匹配:
slope_start = x[L_start] - x[L_start-1]
slope_end = x[L_end+1] - x[L_end]
match_quality = 1 - |slope_start - slope_end| / max(|slope_start|, |slope_end|)
交叉淡化使用两个互补的包络函数平滑过渡:
等功率交叉淡化(保持恒定响度):
fade_out(t) = cos(πt/2T)
fade_in(t) = sin(πt/2T)
其中T是淡化时长,t ∈ [0, T]。
输出信号:
y(t) = x_end(t) · fade_out(t) + x_start(t) · fade_in(t)
高级循环技术包括:
R(τ) = Σ x[n] · x[n+τ]
最佳循环长度 = argmax(R(τ)) for τ ∈ [min_length, max_length]
FFT_error = ||FFT(x[L_end-N:L_end]) - FFT(x[L_start:L_start+N])||
L_adjusted = round(L_length/period) · period
多采样使用不同音高的录音覆盖键盘范围。音高转换比率:
r = 2^((note - root_key)/12)
回放速率:
playback_rate = original_rate · r
为保持音质,通常限制转换范围:
|note - root_key| ≤ 6 半音
速度到振幅的映射通常使用非线性曲线:
线性映射:
amplitude = velocity / 127
指数映射(更自然):
amplitude = (e^(α·velocity/127) - 1) / (e^α - 1)
其中α控制曲线形状(典型值:2-4)。
分段映射:
amplitude = { a₁·velocity + b₁, velocity ∈ [0, v₁]
{ a₂·velocity + b₂, velocity ∈ [v₁, v₂]
{ a₃·velocity + b₃, velocity ∈ [v₂, 127]
速度层切换策略:
sample = { sample_pp, velocity ∈ [0, 42]
{ sample_mf, velocity ∈ [43, 85]
{ sample_ff, velocity ∈ [86, 127]
crossfade_range = 10
weight₁ = max(0, min(1, (threshold - velocity + crossfade_range) / (2·crossfade_range)))
weight₂ = 1 - weight₁
output = sample₁ · weight₁ + sample₂ · weight₂
高级速度响应技术:
cutoff_freq = base_cutoff · (1 + β·velocity/127)
resonance = base_res · (1 + γ·velocity/127)
attack_time = base_attack / (1 + δ·velocity/127)
decay_time = base_decay / (1 + ε·velocity/127)
spectrum_output = spectrum_soft · (1 - velocity/127) + spectrum_hard · (velocity/127)
采样率转换需要在离散采样点之间估算连续信号值。
线性插值(计算简单但质量有限):
y(t) = x[n] + (x[n+1] - x[n]) · (t - n)
其中n = floor(t),小数部分μ = t - n。
三次插值(Cubic Interpolation):
y(t) = a₃μ³ + a₂μ² + a₁μ + a₀
其中:
a₃ = x[n+2] - x[n+1] - a₀ + a₁
a₂ = x[n-1] - x[n] - a₁
a₁ = (x[n+1] - x[n-1]) / 2
a₀ = x[n]
Hermite插值(保证连续导数):
y(t) = h₀₀(μ)·x[n] + h₁₀(μ)·m₀ + h₀₁(μ)·x[n+1] + h₁₁(μ)·m₁
基函数:
h₀₀(t) = 2t³ - 3t² + 1
h₁₀(t) = t³ - 2t² + t
h₀₁(t) = -2t³ + 3t²
h₁₁(t) = t³ - t²
斜率:
m₀ = (x[n+1] - x[n-1]) / 2
m₁ = (x[n+2] - x[n]) / 2
理想的带限插值使用sinc函数:
x(t) = Σ x[n] · sinc((t - n)π)
其中:sinc(x) = sin(x) / x
窗函数sinc插值(实用版本):
x(t) = Σ x[n] · sinc((t - n)π) · w(t - n)
常用窗函数:
多相实现将插值滤波器分解为P个子滤波器:
H(z) = Σ z^(-k) · E_k(z^P)
每个多相分支:
E_k(z) = Σ h[nP + k] · z^(-n)
计算复杂度从O(N·R)降至O(N),其中R是重采样比率。
实时变调的多相实现:
phase_increment = original_rate / target_rate
phase_accumulator += phase_increment
integer_part = floor(phase_accumulator)
fractional_part = phase_accumulator - integer_part
output = interpolate(buffer[integer_part:integer_part+order], fractional_part)
PSOLA变调(保持共振峰):
新周期 = 原周期 / pitch_factor
重叠相加:output[n] = Σ window[k] · segment[k][n - position[k]]
粒子变调:
grain_size = 2048 # 样本
hop_size = grain_size / 4
pitch_shift = 2^(semitones/12)
for each grain:
read_position += hop_size / pitch_shift
write_position += hop_size
apply_window(grain)
overlap_add(output, grain, write_position)
Fairlight CMI (1979) 开创性特征:
采样规格:
Page R序列器:
模式字符串:C3-E3-G3-C4-G3-E3
速度控制:1-8(相对于主时钟)
滑音时间:0-99
谐波合成(Page 4):
谐波幅度:fundamental = 100%
2nd = 50%
3rd = 33%
...
32nd = 3%
相位关系:可调整每个谐波的初始相位
MPC60 (1988) 架构:
采样引擎:
12位线性PCM(后续16位)
采样率:40 kHz(MPC60),44.1 kHz(MPC3000)
内存:750KB(可扩展至1.5MB)
独特的量化引擎:
swing = 50% + (swing_amount - 50%) · sin(2π·note_position/16)
实际触发时间 = 理论时间 · (1 + swing/100)
速度层管理:
4个速度区域,非线性映射
layer_volume = base_volume · (velocity/127)^curve_exp
curve_exp范围:0.5(对数)到 2.0(指数)
E-MU独特的Z-plane滤波器:
H(z) = (b₀ + b₁z^(-1) + b₂z^(-2)) / (1 + a₁z^(-1) + a₂z^(-2))
动态滤波器调制:
cutoff(t) = base_cutoff · 2^(mod_amount·envelope(t))
resonance(t) = base_res + res_mod·lfo(t)
E-MU的变形滤波器(Morphing Filter):
filter_output = filter_A · (1 - morph) + filter_B · morph
morph = 0.5 + 0.5·sin(2π·lfo_rate·t)
Kontakt架构特点:
脚本处理(KSP):
on note
if ($EVENT_VELOCITY > 100)
change_vol($EVENT_ID, -3000) // -3dB
change_cutoff($EVENT_ID, 50%)
end if
end on
区域映射系统:
<group>
key_low=36 key_high=47
velocity_low=0 velocity_high=63
sample="piano_soft_C2.wav"
pitch_keycenter=36
</group>
循环与淡化的高级控制:
loop_mode = {forward, backward, ping-pong}
loop_crossfade_time = 50ms
loop_tune = ±100 cents
release_trigger = true
采样合成技术通过数字化捕获和处理真实声音,彻底改变了电子音乐制作。本章涵盖的关键概念包括:
练习4.1:计算采样参数 一个音频信号包含最高15 kHz的频率分量,使用16位量化。 a) 最小采样率应该是多少? b) 理论信噪比是多少? c) 1分钟立体声音频的存储空间是多少?
提示:应用奈奎斯特定理和SNR公式
练习4.2:音高转换计算 原始采样的根音是C3(MIDI音符60),采样率44.1 kHz。要播放G3(MIDI音符67): a) 计算回放速率比 b) 新的有效采样率是多少? c) 如果原始时长是2秒,新时长是多少?
提示:使用音高转换公式r = 2^(Δnote/12)
练习4.3:交叉淡化包络 设计一个100ms的等功率交叉淡化,采样率48 kHz: a) 需要多少个采样点? b) 在t=50ms时,fade_out和fade_in的值是多少? c) 验证功率守恒:fade_out² + fade_in² = ?
提示:使用cos/sin包络函数
练习4.4:循环点优化算法 设计一个自动寻找最佳循环点的算法。给定音频段x[n],长度N,希望找到循环起点L_start和终点L_end,使得:
写出算法伪代码和评价函数。
提示:结合时域和频域特征
练习4.5:多相滤波器设计 设计一个4倍过采样的多相滤波器组,用于高质量采样率转换: a) 原始滤波器需要多少阶? b) 每个多相分支的阶数是多少? c) 计算复杂度如何变化?
提示:考虑线性相位FIR滤波器
练习4.6:速度层混合策略 设计一个3层速度采样系统(pp, mf, ff),实现平滑过渡: a) 设计速度到层的映射函数 b) 计算交叉淡化区域的混合权重 c) 如何补偿不同层的响度差异?
提示:考虑心理声学响度感知
练习4.7:实时变调算法比较 比较三种变调算法(线性插值、PSOLA、相位声码器)在将音频提高5半音时的特性: a) 各自的优缺点是什么? b) 计算复杂度如何? c) 什么情况下选择哪种算法?
提示:考虑音质、延迟和共振峰保持
错误:直接降采样而不滤波
// 错误做法
output[n] = input[n * 2] // 2倍降采样,会产生混叠
正确:先低通滤波再降采样
filtered = lowpass(input, fs/4) // 截止在新奈奎斯特频率
output[n] = filtered[n * 2]
错误:在任意点设置循环 正确:
错误:使用简单采样点丢弃/重复
// 错误:产生假频
if (ratio > 1) output[n] = input[n], input[n] // 重复
正确:使用插值
fractional_index = n * ratio
integer_part = floor(fractional_index)
fraction = fractional_index - integer_part
output[n] = interpolate(input, integer_part, fraction)
错误:循环长度不是基频周期的整数倍 症状:循环时音高漂移或颤动 解决:自相关分析找到周期性循环长度
错误:速度层之间硬切换
if velocity < 64: play(soft_sample)
else: play(loud_sample)
正确:交叉淡化区域
if 54 < velocity < 74:
mix = (velocity - 54) / 20
output = soft * (1-mix) + loud * mix
错误:加载所有采样到RAM 正确:
症状:高频哨声、金属声 解决: