引言
数字音频的一切都建立在两个动作之上:在时间轴上离散化(采样),在幅度轴上离散化(量化)。前者由采样率描述,后者由位深描述。这两个参数一旦确定,整条链路的质量上限就被锁死——后续任何处理都无法突破它。
工程师对这两个概念通常"知道",但很少算清楚。比如:为什么 44.1 kHz 能覆盖 20 kHz 的听觉上限,却还需要 96 kHz?为什么 16 bit 的 96 dB 动态范围在加了抖动之后反而"变差"了却更好听?为什么把一个 44.1 kHz 文件"转成"96 kHz 不会增加任何信息?这些问题的答案都在采样与量化的数学里。
本文从采样定理出发,逐层拆解混叠、抗混叠滤波、量化噪声、抖动、过采样、采样率转换与位深转换,最后给出可实测的指标与验证方法。目标是让读者在看到一个采样率/位深组合时,能立刻说出它的带宽、动态范围、数据量与适用场景。
目录
- 采样定理与奈奎斯特频率
- 混叠:现象、成因与听感
- 抗混叠滤波器的工程实现
- 量化:位深与信噪比公式
- 抖动与噪声整形
- 过采样与 ΔΣ 调制
- 采样率转换(SRC)
- 位深转换与增益结构
- 实测指标:SNR、THD+N 与动态范围
1. 采样定理与奈奎斯特频率
采样定理(Nyquist–Shannon)指出:若信号带宽限制在 f_max 以内,则以高于 2 × f_max 的速率采样可以完全重建原信号。2 × f_max 称为奈奎斯特率,fs / 2 称为奈奎斯特频率。
fs = 44100 Hz → 奈奎斯特频率 = 22050 Hz
fs = 48000 Hz → 奈奎斯特频率 = 24000 Hz
fs = 96000 Hz → 奈奎斯特频率 = 48000 Hz
定理的前提是"带宽限制",这是最容易被忽略的部分。现实中麦克风信号、合成器输出、失真效果器的输出都不是带限的,必须主动施加带限,也就是抗混叠滤波。没有这一步,定理不成立。
1.1 重建不是"连点成线"
时域上,重建是用 sinc 函数对样本做加权求和:
x(t) = Σ x[n] · sinc((t - nT) / T), T = 1/fs
DAC 内部的零阶保持(zero-order hold)只是 sinc 插值的粗糙近似,它会在高频产生 sinc 衰减(在奈奎斯特频率处约 -3.9 dB)。这就是为什么高质量 DAC 会在数字域先做"半带补偿"滤波,把 sinc 滚降补回来。
1.2 采样率与带宽的对应
| 采样率 | 奈奎斯特频率 | 典型用途 |
|---|---|---|
| 8000 Hz | 4000 Hz | 传统电话(窄带语音) |
| 16000 Hz | 8000 Hz | 宽带语音(VoIP、Opus 常用) |
| 22050 Hz | 11025 Hz | 低码率音乐 |
| 44100 Hz | 22050 Hz | CD、消费音乐 |
| 48000 Hz | 24000 Hz | 视频、专业音频、Web Audio |
| 96000 Hz | 48000 Hz | 高分辨率录音、非线性处理 |
选 48 kHz 而不是 44.1 kHz 的一个现实理由是它与 24/25/30 fps 视频帧率的关系更"整":一帧 30 fps 对应 1600 个样本,一帧 25 fps 对应 1920 个样本。44.1 kHz 除不尽,视频同步时要处理余数。
2. 混叠:现象、成因与听感
**混叠(Aliasing)**是指高于奈奎斯特频率的成分被"折叠"到低频,成为无法与原信号区分的虚假频率。
若 fs = 48000,输入含 20000 Hz:
20000 < 24000,正常保留
若 fs = 48000,输入含 30000 Hz:
折叠后频率 = |30000 - 48000| = 18000 Hz(可听!)
若 fs = 48000,输入含 50000 Hz:
折叠后频率 = |50000 - 48000| = 2000 Hz(完全错误的低频)
2.1 混叠为什么难听
真实音乐信号的谐波结构是有序的:基频 440 Hz 的乐音,谐波在 880、1320、1760 Hz……混叠产生的频率与原始谐波没有整数倍关系,因此听起来是"金属味"“沙沙声"或"鸟叫”,与信号本身不协调。更糟的是它不可逆:一旦折叠进来,任何滤波都无法把它与真实信号分离。
2.2 混叠的典型来源
- 降采样不做低通:最常见的来源。把 96 kHz 素材直接抽成 48 kHz,24
48 kHz 的成分全部折回 024 kHz。 - 非线性处理:失真、削波、波形整形(waveshaping)会产生无穷多的高次谐波,超出奈奎斯特频率的部分立即折回。这是"数字失真听起来刺耳"的根本原因。
- 合成器的锯齿波/方波:理想的锯齿波含无限谐波,直接采样必然混叠。工程上要么用带限波形(BLIT、PolyBLEP),要么大幅过采样。
- ADC 前端滤波不足:模拟抗混叠滤波器滚降不够陡,高频噪声折回。
# 演示混叠:把 30 kHz 正弦以 48 kHz 采样,听感等效于 18 kHz
import numpy as np
fs = 48000
t = np.arange(fs) / fs
x = np.sin(2 * np.pi * 30000 * t) # 30 kHz 输入
# 采样后(离散序列)其表观频率:
alias = abs(30000 - round(30000 / fs) * fs) # = 18000 Hz
print(alias) # 18000.0
2.3 用扫频听混叠
验证一个链路是否抗混叠,最直接的方法是喂一个 20 Hz~20 kHz 的对数扫频,在频谱图上观察是否出现"折返"的镜像轨迹。若在 15 kHz 以上看到一条向下走的谱线,就是混叠的典型特征。
3. 抗混叠滤波器的工程实现
抗混叠滤波器必须在采样前(ADC 侧)或降采样前(SRC 侧)把 fs/2 以上的能量压到量化噪声以下。
3.1 模拟前端的现实约束
理想抗混叠滤波器是"砖墙"(在 fs/2 处瞬间从通带跳到阻带),但模拟滤波器做不到。一阶 RC 只有 6 dB/oct,要实现 24 bit 级别的衰减(-144 dB)需要极陡的滚降,电路上不可行。现实做法是留出过渡带:
通带:0 ~ 0.45·fs(20 kHz @ 44.1 kHz)
过渡带:0.45·fs ~ 0.5·fs
阻带:> 0.5·fs,衰减 > 90 dB
过渡带越窄,滤波器阶数越高。44.1 kHz 的过渡带只有约 2 kHz,用 FIR 实现需要数百抽头。
3.2 数字侧:过采样是标准解
现代 ADC 几乎都采用过采样 + 数字抽取:模拟前端先以 64×~256× 采样(例如 2.8 MHz),模拟抗混叠滤波器只需在 1.4 MHz 处滚降,非常容易实现;然后在数字域用陡峭的 FIR 抽取到目标采样率,数字滤波器的过渡带可以是"相对宽"的,因为绝对带宽被过采样率放大了。
模拟输入 → 模拟低通(1.4 MHz)→ ADC @ 2.8 MHz
→ 数字抽取 FIR(64:1)→ PCM @ 44.1 kHz
这样模拟滤波器的压力被转移到数字域,而数字 FIR 可以做到任意陡。
3.3 FIR 与 IIR 的取舍
| 特性 | FIR | IIR |
|---|---|---|
| 相位 | 可线性相位 | 非线性相位 |
| 阶数 | 高(数百抽头) | 低(4~8 阶) |
| 稳定性 | 无条件稳定 | 需关注极点 |
| 延迟 | 与阶数成正比 | 很小 |
| 算力 | 高(除非用 FFT) | 低 |
抗混叠场景通常用 FIR:线性相位保证瞬态不失真,且系数可以离线设计。IIR 用于对延迟敏感、对相位不敏感的场景(如实时参数均衡)。滤波器设计的数学细节见 audio-dsp-filters 。
4. 量化:位深与信噪比公式
量化把连续幅度映射到有限个离散电平。N bit 有 2^N 个电平,量化步长:
Δ = 满量程 / 2^N
对满量程归一化到 ±1 的信号,量化误差在 [-Δ/2, +Δ/2] 内近似均匀分布,其功率为 Δ²/12。由此得到经典的 SNR 公式:
SNR(dB) = 6.02 × N + 1.76
| 位深 | 理论 SNR | 电平数 | 典型场景 |
|---|---|---|---|
| 8 bit | 49.9 dB | 256 | 电话、复古采样器 |
| 16 bit | 98.1 dB | 65536 | CD、消费分发 |
| 24 bit | 146.2 dB | 16.7M | 录音、母带 |
| 32 bit float | ~152 dB(24 bit 有效尾数) | — | 处理管线 |
4.1 为什么 24 bit 是"有效 20 bit"
146 dB 是理论值,实际受限于模拟前端。即使是最好的 ADC,模拟前端的本底噪声也就在 -120 dBFS 左右,对应约 20 bit 的有效精度。24 bit 的意义在于留出增益余量:录到 -18 dBFS 时仍然保留约 126 dB 的动态范围,远超任何模拟前端的本底。
4.2 32 bit float 的真实精度
IEEE 754 单精度有 24 bit 尾数,所以它在归一化到 ±1 时和 24 bit 定点精度相当。真正的优势是指数范围:可以表示到 10^38 而不溢出,小信号也不丢精度。这就是混音总线必须用 float 的原因——累加 100 路信号时定点早就溢出,float 毫无压力。
4.3 量化噪声不是"白噪声"
上述公式假设量化误差是均匀分布的白噪声,这要求信号足够复杂(跨越多个量化电平)。当信号很小时(例如淡出到 -80 dBFS 的正弦),量化误差变成与信号相关的周期性失真,听感上是"粗糙的嗡声"而不是"嘶声"。这正是抖动要解决的问题。
5. 抖动与噪声整形
**抖动(Dither)**是在量化前加入极小幅度的随机噪声,让量化误差去相关,从而把"与信号相关的失真"转成"与信号无关的恒定噪声底"。感知上,稳定的低电平噪声远比随信号变化的失真更可接受。
def quantize_with_dither(x, bits, dither_amp=1.0):
"""x: 归一化到 [-1, 1] 的浮点数组;bits: 目标位深"""
q = 2 ** (bits - 1)
# TPDF dither(三角分布,两个均匀分布之和)
d = (np.random.uniform(-1, 1, x.shape) + np.random.uniform(-1, 1, x.shape))
d = d * (dither_amp / q) # 幅度约为 1 LSB
return np.clip(np.round((x + d) * q), -q, q - 1) / q
抖动幅度的选择很讲究:太小不起作用,太大会抬高噪声底。标准做法是 TPDF(Triangular Probability Density Function)dither,峰峰值 2 LSB,它能让量化误差的一阶、二阶统计量都与信号无关,代价是噪声底抬高约 4.8 dB。
5.1 噪声整形(Noise Shaping)
噪声整形把量化误差通过一个反馈滤波器重新分布:牺牲某个频段的噪声底,换取另一个频段的降低。因为人耳在 2~4 kHz 最敏感、在高频不敏感,所以典型的整形曲线是"把噪声推到 15 kHz 以上"。
误差反馈结构:
e[n] = quant(x[n] - Σ h[k]·e[n-k])
y[n] = x[n] - Σ h[k]·e[n-k] + e[n]
一阶噪声整形能把噪声底在低频降低约 9 dB/oct,二阶约 15 dB/oct。代价是高频噪声大幅上升,所以噪声整形通常与过采样配合:过采样把量化噪声摊到更宽的频带,整形再把剩下的噪声推到超声频段,最后用数字低通滤掉。
5.2 抖动的工程结论
- 降位深时必加抖动:24 bit → 16 bit 不加抖动会引入与信号相关的失真。
- 升位深时不需要:16 bit → 24 bit 只是补零,没有新的量化发生。
- 中间处理不要反复抖动:每次抖动都会抬高噪声底,应在链路末端一次性完成。
6. 过采样与 ΔΣ 调制
过采样(Oversampling)以高于奈奎斯特率的速率采样,带来的收益有三:
- 抗混叠更容易:过渡带被放大,模拟滤波器可以做得很简单。
- 量化噪声被摊薄:量化噪声总功率不变,但分布在更宽的频带上,
0 ~ fs/2内的噪声功率下降。过采样率OSR带来的 SNR 增益为:
SNR 增益 = 10·log10(OSR) dB (每 4 倍过采样 +6 dB,即 1 bit)
- 配合噪声整形收益翻倍:一阶整形的增益为
10·log10(OSR³/π²),二阶更高。这就是 ΔΣ(Delta-Sigma)调制器的基础。
6.1 ΔΣ 调制器
ΔΣ ADC 的核心是一个积分器 + 1 bit 量化器 + 反馈环。它用极高的过采样率(64×~256×)换取 1 bit 量化下的高精度:
输入 ──▶ Σ ──▶ 积分器 ──▶ 1bit 量化 ──▶ 输出(1 bit 流)
▲ │
└──────── 反馈(DAC)◀─────────┘
1 bit 量化器天然线性(两点之间没有"中间点"误差),整个调制器的精度靠噪声整形与过采样获得。之后用一个数字抽取滤波器把 1 bit 流降到 24 bit/48 kHz 的多 bit PCM。
6.2 过采样在 DSP 中的另一用途
非线性处理(失真、波形整形、压缩器)会产生大量超出奈奎斯特频率的谐波。在这些处理前后各加 4×~8× 过采样(前升后降),可以把混叠压到听阈以下。这是插件中"oversampling 2x/4x/8x"开关的真实含义,代价是 CPU 占用按倍数增长。
7. 采样率转换(SRC)
采样率转换分两类:整数倍(同步) 与 任意比(异步,ASRC)。
7.1 整数倍转换
升采样:插入 L-1 个零 → 低通滤波 → 得到 L 倍采样率。降采样:低通滤波 → 每 M 个取一个。低通滤波器的实现是多相分解(polyphase),把长 FIR 拆成 L 个子滤波器,只在需要的相位上计算,算力降低 L 倍。
原始 48 kHz → 上采样 ×2(96 kHz)→ 下采样 ×3(32 kHz)
等效比 = 2/3,需要 L=2, M=3 的多相滤波器组
7.2 异步转换
44.1 kHz ↔ 48 kHz 的比值是 147:160,是整数比但很大,直接多相分解需要 160 相。工程上更常用基于 FFT 的重采样(对整段信号做频域补零/截断)或带插值核的任意比重采样(如 libsamplerate 的 sinc 插值、SoX 的 rate 效果)。
# sox 的高质量重采样(very high quality, 允许混叠 > 20 kHz)
sox in.wav -r 48000 out.wav rate -v 48000
# ffmpeg 的重采样(默认 swr,可指定滤波长度)
ffmpeg -i in.wav -af "aresample=48000:filter_size=64" out.wav
7.3 SRC 的质量指标
评估 SRC 要看三项:通带纹波(应 < 0.1 dB)、阻带衰减(应 > 100 dB)、群延迟(线性相位时应恒定)。SoX 的 rate -v 在 44.1→48 kHz 上可达约 145 dB 阻带衰减,代价是约 20 ms 的延迟与可观算力。
关键结论:升采样不增加信息。把 44.1 kHz 转成 96 kHz 只是把 22.05 kHz 以上的部分填成零,不会恢复任何被抗混叠滤波器砍掉的成分。
8. 位深转换与增益结构
位深转换的方向决定处理方式:
| 转换 | 操作 | 是否加抖动 |
|---|---|---|
| 16 → 24 bit | 左移 8 位(补零) | 否 |
| 24 → 16 bit | 舍入到 16 bit | 是 |
| float → 16 bit | 限幅 + 舍入 | 是 |
| 24 → float | 直接映射 | 否 |
8.1 增益结构
位深决定动态范围,但真正决定"用掉多少动态范围"的是增益结构。经验规则:
录音峰值:-18 dBFS(留 18 dB 余量给意外瞬态)
混音总线峰值:-6 dBFS
最终母带真峰值:-1 dBTP
如果录音峰值只有 -40 dBFS,那么 16 bit 的 98 dB 动态范围实际只用到 58 dB,等效于 9~10 bit。反过来,如果录音峰值贴着 0 dBFS,任何后续增益提升都会削波。余量不是浪费,而是必要的工作空间。
8.2 定点与浮点的接口
设备边界上经常需要定点↔浮点转换,转换时要注意满量程定义:16 bit 有符号整数的满量程是 ±32767(不是 32768),除以 32768 会得到略微超过 ±1.0 的值,直接送进某些 DSP 可能溢出。标准做法是除以 32768 并把 +1.0 视为可接受的边界值,或显式限幅到 [-1.0, 1.0)。
// 16 bit 整数 → float
inline float s16_to_f32(int16_t v) { return v * (1.0f / 32768.0f); }
// float → 16 bit 整数(带限幅)
inline int16_t f32_to_s16(float v) {
float c = std::clamp(v, -1.0f, 1.0f);
return (int16_t)std::lrintf(c * 32767.0f);
}
9. 实测指标:SNR、THD+N 与动态范围
理论公式之外,还要能实测验证。
9.1 SNR 与 THD+N
SNR 用满量程正弦测:信号功率与"去掉信号后的残余"功率之比。THD+N 则包含谐波失真与噪声,测法是给正弦,用陷波器滤掉基频,测剩余能量。
# 生成 1 kHz 满量程正弦
ffmpeg -f lavfi -i "sine=frequency=1000:sample_rate=48000:duration=10" \
-af "volume=-1dB" -c:a pcm_s24le ref.wav
# 测 THD+N:sox 的 stat 给出 RMS 与峰值
sox ref.wav -n stat 2>&1 | grep -E "RMS|Maximum"
9.2 动态范围与噪声底
动态范围 = 最大不失真电平 − 噪声底。对 16 bit 系统,若噪声底在 -93 dBFS,动态范围就是 93 dB,接近理论值 98 dB 减去抖动抬高的 4.8 dB。
9.3 用 null test 验证 SRC
把 48 kHz 信号升到 96 kHz 再降回 48 kHz,与原信号反相相加。理想情况下残差应当接近噪声底:
ffmpeg -i in48.wav -ar 96000 tmp96.wav
ffmpeg -i tmp96.wav -ar 48000 back48.wav
ffmpeg -i in48.wav -i back48.wav -filter_complex \
"[0:a][1:a]amix=inputs=2:weights=1 -1,volumedetect" -f null -
若残差的 max_volume 高于约 -90 dB,说明 SRC 的阻带衰减不足或存在群延迟失配。更系统的质量评估方法(PESQ、ViSQOL、MUSHRA)见 audio-quality-testing
。
权衡取舍
| 决策点 | 选择 A | 选择 B | 建议 |
|---|---|---|---|
| 采样率 | 48 kHz | 96/192 kHz | 48 kHz 覆盖听阈,96 kHz 仅在有大量非线性处理时必要 |
| 位深 | 16 bit 分发 | 24 bit 采集 | 采集 24 bit,分发 16 bit(加抖动) |
| 抗混叠 | 模拟陡滤波 | 过采样+数字抽取 | 一律过采样,模拟前端只做粗滤 |
| 抖动 | 加(保真) | 不加(低噪声底) | 降位深必加;中间链路不加 |
| SRC | 高质量离线 | 快速实时 | 离线用 rate -v,实时用短 FIR |
| 定点/浮点 | 定点(省电) | 浮点(易写) | 嵌入式定点,桌面浮点 |
需要强调的一个反直觉结论:过采样不提升"保真度",它只是让抗混叠与非线性处理的实现更容易。真正决定质量的是原始采样率与位深,以及模拟前端的本底噪声。
常见坑清单
- 降采样前不滤波:直接抽取导致高频折回,听感是"沙沙"或"鸟叫"。必须先低通再抽取。
- 失真效果器不过采样:削波产生的高次谐波折回,是"数字失真刺耳"的主因。加 4× 过采样即可显著改善。
- 降位深不加抖动:低电平信号出现与信号相关的周期性失真,淡出时尤其明显。
- 反复抖动:每降一次位深加一次抖动,噪声底被逐次抬高,应在链路末端一次性完成。
- 误以为升采样能提升音质:44.1→96 kHz 只是补零,不会恢复被砍掉的 22.05 kHz 以上成分。
- 满量程定义不一致:16 bit 除以 32768 还是 32767 会导致 ±1 LSB 的偏差与溢出,需在接口处统一。
- 浮点直接截断到定点:float 超过 ±1.0 的值直接转换会回绕(wrap)成反相的大信号,必须先限幅。
- 噪声整形用在高采样率却不过采样:高频噪声推到超声频段但采样率不足,会折回可听频段。
- 用理论 SNR 评估实际设备:模拟前端本底噪声通常只有 -120 dBFS,理论值无法达到。
- 忽略群延迟失配:SRC 前后的延迟不同会导致 null test 残差偏大,需要对齐后再比较。
小结
采样与量化是数字音频的两个基本约束。采样率决定可用带宽,位深决定动态范围,抗混叠滤波保证采样定理的前提成立,抖动保证低位深下的失真被转成可接受的噪声。这四个环节共同决定了链路的质量天花板。
工程上最值得记住的三条:降采样必先滤波、降位深必加抖动、非线性处理必过采样。违反其中任何一条,都会产生可听且不可逆的失真。
继续深入建议先读 audio-spectral-analysis-fft 掌握频域分析手段,用它来验证本文提到的混叠与量化噪声;再读 audio-dsp-filters 理解抗混叠滤波器的系数设计;需要落地到浏览器时,audio-web-audio-api 会说明 Web Audio 在采样率与重采样上的具体行为。
继续阅读
探索更多技术文章
浏览归档,发现更多关于系统设计、工具链和工程实践的内容。