数字音频基础:采样率、位深与量化噪声

采样率与位深决定了数字音频的质量上限。本文从奈奎斯特定理出发,讲清混叠的成因与听感、抗混叠滤波器的工程实现、量化噪声的 6.02N 公式、抖动与噪声整形如何把失真转成噪声、过采样与 ΔΣ 调制、采样率转换的多相滤波实现,以及 SNR、THD+N、动态范围的实测方法。

引言

数字音频的一切都建立在两个动作之上:在时间轴上离散化(采样),在幅度轴上离散化(量化)。前者由采样率描述,后者由位深描述。这两个参数一旦确定,整条链路的质量上限就被锁死——后续任何处理都无法突破它。

工程师对这两个概念通常"知道",但很少算清楚。比如:为什么 44.1 kHz 能覆盖 20 kHz 的听觉上限,却还需要 96 kHz?为什么 16 bit 的 96 dB 动态范围在加了抖动之后反而"变差"了却更好听?为什么把一个 44.1 kHz 文件"转成"96 kHz 不会增加任何信息?这些问题的答案都在采样与量化的数学里。

本文从采样定理出发,逐层拆解混叠、抗混叠滤波、量化噪声、抖动、过采样、采样率转换与位深转换,最后给出可实测的指标与验证方法。目标是让读者在看到一个采样率/位深组合时,能立刻说出它的带宽、动态范围、数据量与适用场景。

目录

  1. 采样定理与奈奎斯特频率
  2. 混叠:现象、成因与听感
  3. 抗混叠滤波器的工程实现
  4. 量化:位深与信噪比公式
  5. 抖动与噪声整形
  6. 过采样与 ΔΣ 调制
  7. 采样率转换(SRC)
  8. 位深转换与增益结构
  9. 实测指标: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 Hz4000 Hz传统电话(窄带语音)
16000 Hz8000 Hz宽带语音(VoIP、Opus 常用)
22050 Hz11025 Hz低码率音乐
44100 Hz22050 HzCD、消费音乐
48000 Hz24000 Hz视频、专业音频、Web Audio
96000 Hz48000 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,2448 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 的取舍

特性FIRIIR
相位可线性相位非线性相位
阶数高(数百抽头)低(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 bit49.9 dB256电话、复古采样器
16 bit98.1 dB65536CD、消费分发
24 bit146.2 dB16.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)以高于奈奎斯特率的速率采样,带来的收益有三:

  1. 抗混叠更容易:过渡带被放大,模拟滤波器可以做得很简单。
  2. 量化噪声被摊薄:量化噪声总功率不变,但分布在更宽的频带上,0 ~ fs/2 内的噪声功率下降。过采样率 OSR 带来的 SNR 增益为:
SNR 增益 = 10·log10(OSR)  dB   (每 4 倍过采样 +6 dB,即 1 bit)
  1. 配合噪声整形收益翻倍:一阶整形的增益为 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 kHz96/192 kHz48 kHz 覆盖听阈,96 kHz 仅在有大量非线性处理时必要
位深16 bit 分发24 bit 采集采集 24 bit,分发 16 bit(加抖动)
抗混叠模拟陡滤波过采样+数字抽取一律过采样,模拟前端只做粗滤
抖动加(保真)不加(低噪声底)降位深必加;中间链路不加
SRC高质量离线快速实时离线用 rate -v,实时用短 FIR
定点/浮点定点(省电)浮点(易写)嵌入式定点,桌面浮点

需要强调的一个反直觉结论:过采样不提升"保真度",它只是让抗混叠与非线性处理的实现更容易。真正决定质量的是原始采样率与位深,以及模拟前端的本底噪声。

常见坑清单

  1. 降采样前不滤波:直接抽取导致高频折回,听感是"沙沙"或"鸟叫"。必须先低通再抽取。
  2. 失真效果器不过采样:削波产生的高次谐波折回,是"数字失真刺耳"的主因。加 4× 过采样即可显著改善。
  3. 降位深不加抖动:低电平信号出现与信号相关的周期性失真,淡出时尤其明显。
  4. 反复抖动:每降一次位深加一次抖动,噪声底被逐次抬高,应在链路末端一次性完成。
  5. 误以为升采样能提升音质:44.1→96 kHz 只是补零,不会恢复被砍掉的 22.05 kHz 以上成分。
  6. 满量程定义不一致:16 bit 除以 32768 还是 32767 会导致 ±1 LSB 的偏差与溢出,需在接口处统一。
  7. 浮点直接截断到定点:float 超过 ±1.0 的值直接转换会回绕(wrap)成反相的大信号,必须先限幅。
  8. 噪声整形用在高采样率却不过采样:高频噪声推到超声频段但采样率不足,会折回可听频段。
  9. 用理论 SNR 评估实际设备:模拟前端本底噪声通常只有 -120 dBFS,理论值无法达到。
  10. 忽略群延迟失配:SRC 前后的延迟不同会导致 null test 残差偏大,需要对齐后再比较。

小结

采样与量化是数字音频的两个基本约束。采样率决定可用带宽,位深决定动态范围,抗混叠滤波保证采样定理的前提成立,抖动保证低位深下的失真被转成可接受的噪声。这四个环节共同决定了链路的质量天花板。

工程上最值得记住的三条:降采样必先滤波、降位深必加抖动、非线性处理必过采样。违反其中任何一条,都会产生可听且不可逆的失真。

继续深入建议先读 audio-spectral-analysis-fft 掌握频域分析手段,用它来验证本文提到的混叠与量化噪声;再读 audio-dsp-filters 理解抗混叠滤波器的系数设计;需要落地到浏览器时,audio-web-audio-api 会说明 Web Audio 在采样率与重采样上的具体行为。

继续阅读

探索更多技术文章

浏览归档,发现更多关于系统设计、工具链和工程实践的内容。

全部文章 返回首页

「音频工程」更多文章

  1. 音视频同步与时间码
  2. 音频硬件接口与驱动栈
  3. 响度标准化与交付规范