数字化:采样、量化与信噪比

前几篇讲的都是”连续世界”的声波。计算机里没有连续函数,只有一串数字。把声波变成数字要经过两步:采样(每隔固定时间取一个值)和量化(把连续值四舍五入到有限等级)。这一篇把这两步的数学完全展开,并推导出数字音频最重要的公式之一:量化信噪比 ≈ 6.02N + 1.76 dB


1. 采样:把连续变成离散

1.1 采样过程

设采样率为 fsf_s(每秒取多少个点),采样间隔为:

Ts=1fsT_s = \frac{1}{f_s}

连续信号 x(t)x(t) 变成离散序列:

x[n]=x(nTs),n=0,1,2,x[n] = x(nT_s), \qquad n = 0, 1, 2, \dots

采样与重建

图里:

  • ① 是原始连续波形;
  • ② 是每隔固定间隔取的点(圆点);
  • ③ 是用平滑曲线把这些点”重建”出来的波形。

关键问题是:③ 和 ① 一定一样吗?

1.2 反例:采样点不够多

如果两个不同频率的正弦波恰好都在采样点上取值相同,重建时就会分不清谁是谁。比如每秒采 10 个点,3 Hz 和 7 Hz 的正弦波在某些采样时刻可能完全重合(7 Hz 是 fs3f_s - 3 Hz,采样后会”伪装”成 3 Hz)。

这就是混叠(aliasing):高频信号被错误地重建为低频。


2. 采样定理:fs2fmaxf_s \ge 2f_{\max}

2.1 直觉版本

一个周期内至少要采两个点,才能区分”波峰”和”波谷”。所以采样率必须至少是最高频率的两倍:

fs2fmaxf_s \ge 2 f_{\max}

fs/2f_s / 2奈奎斯特频率(Nyquist frequency):

fNyquist=fs2f_{\text{Nyquist}} = \frac{f_s}{2}

2.2 频域版本(严格推导)

要严格证明,需要傅里叶变换(系列第 5 篇)。这里给出推导思路:

采样可以看成原信号 x(t)x(t) 乘以一个”梳状脉冲串” nδ(tnTs)\sum_n \delta(t-nT_s)。时域相乘 = 频域卷积。脉冲串的频谱是一串间距为 fsf_s 的冲击,所以采样后信号的频谱是原频谱以 fsf_s 为周期无限复制

Xs(f)=1Tsk=X(fkfs)X_s(f) = \frac{1}{T_s}\sum_{k=-\infty}^{\infty} X(f - kf_s)

如果原信号最高频率 fmax<fs/2f_{\max} < f_s/2,这些副本互不重叠,我们用一个理想低通滤波器(截止 fs/2f_s/2)就能取出中间的副本,完全恢复原信号。

如果 fmax>fs/2f_{\max} > f_s/2,副本重叠,高频能量”折叠”进低频区,混叠发生。折叠后的伪频率:

falias=fkfs,k 取使结果最小的整数f_{\text{alias}} = \left| f - k f_s \right|, \qquad k \text{ 取使结果最小的整数}

2.3 抗混叠滤波器

真实录音时,先经过模拟低通滤波器把高于 fs/2f_s/2 的成分滤掉,再采样。这个滤波器叫抗混叠滤波器。44.1 kHz 采样率对应 22.05 kHz 截止,刚好覆盖 20 kHz 听觉上限。


3. 量化:把连续值”阶梯化”

3.1 为什么需要量化

采样得到的值是任意实数,计算机只能存有限位数的整数(如 16 bit 能表示 216=655362^{16}=65536 个值)。把连续值映射到最近等级的过程叫量化

3.2 量化阶梯

设满量程为 VV,位深 NN,等级数为 2N2^N,量化步长为:

q=V2Nq = \frac{V}{2^N}

量化阶梯

图里橙色阶梯是量化后的结果,蓝色虚线是原始波形。可以清楚看到:

  • 原始波形是光滑曲线;
  • 量化后变成台阶;
  • 台阶和曲线之间的差就是量化误差,范围约为 [q/2,q/2][-q/2, q/2]

3.3 量化误差 = 噪声

量化误差在每个样本上近似随机、均匀分布在 [q/2,q/2][-q/2, q/2]。它听起来像”嘶嘶”的底噪,所以也叫量化噪声


4. 量化信噪比:6.02N + 1.76 dB 的推导

4.1 信号功率

假设信号是满量程正弦波,振幅 V/2V/2,RMS 为:

Srms=V/22=V22S_{\text{rms}} = \frac{V/2}{\sqrt{2}} = \frac{V}{2\sqrt{2}}

信号功率(平方):

PS=(V22)2=V28P_S = \left(\frac{V}{2\sqrt{2}}\right)^2 = \frac{V^2}{8}

4.2 量化噪声功率

量化误差均匀分布在 [q/2,q/2][-q/2, q/2]。均匀分布的方差是:

Var=(ba)212=q212\text{Var} = \frac{(b-a)^2}{12} = \frac{q^2}{12}

所以噪声功率:

PN=q212=112(V2N)2P_N = \frac{q^2}{12} = \frac{1}{12}\left(\frac{V}{2^N}\right)^2

4.3 信噪比

信噪比(SNR)定义为信号功率与噪声功率之比:

SNR=PSPN=V2/8V2/(1222N)=1222N8=1.522N\text{SNR} = \frac{P_S}{P_N} = \frac{V^2/8}{V^2/(12 \cdot 2^{2N})} = \frac{12 \cdot 2^{2N}}{8} = 1.5 \cdot 2^{2N}

转成分贝:

SNRdB=10log10(1.522N)=10log101.5+20Nlog102\text{SNR}_{\text{dB}} = 10\log_{10}(1.5 \cdot 2^{2N}) = 10\log_{10}1.5 + 20N\log_{10}2

代入数值:

10log101.51.76,20log1026.0210\log_{10}1.5 \approx 1.76, \qquad 20\log_{10}2 \approx 6.02

得到最终公式:

SNRdB6.02N+1.76\boxed{\text{SNR}_{\text{dB}} \approx 6.02N + 1.76}

这个公式的意义:

  • 每增加 1 bit,动态范围提高约 6 dB;
  • 16 bit → 约 96 dB;
  • 24 bit → 约 145 dB;
  • 32 bit float → 动态范围远超实际需要。

5. 实际数字音频参数

格式采样率位深动态范围用途
电话8 kHz8 bit~50 dB语音
广播32 kHz12–16 bit~96 dB早期广播
CD44.1 kHz16 bit~96 dB音乐发行
DVD/高清48 kHz24 bit~145 dB电影、游戏
高解析96/192 kHz24 bit~145 dB录音棚母带

浏览器 AudioContext 内部通常按 44.1 或 48 kHz、浮点 32 bit 处理,动态范围足够,所以浏览器端基本不用担心量化噪声,混叠反而更值得注意


6. 与可视化的关系

6.1 播放器从哪里拿到数字

播放器用 AnalyserNode 从播放中的音频实时取一段采样(默认 1024 点),这段数据就是本篇讲的 x[n]x[n]。FFT(下一篇)再把它变成频谱。

6.2 噪声门与底噪

量化噪声虽然小(16 bit 约 −96 dBFS),但经过 RMS 计算后静音段仍会有微弱底噪。播放器的噪声门:

E=max(0, Eθ)E' = \max(0,\ E - \theta)

本质上是把”低于底噪阈值”的能量清零,防止地形在静音时乱动。

6.3 采样率对频谱分辨率的影响

FFT 的每个 bin 频率间隔:

Δf=fsN\Delta f = \frac{f_s}{N}

fs=44100f_s = 44100N=1024N = 1024 时,Δf43\Delta f \approx 43 Hz。这个分辨率由采样率和 FFT 长度共同决定,与量化无关。


7. 小结

  1. 采样:每隔 Ts=1/fsT_s = 1/f_s 取一个点;
  2. 采样定理:fs2fmaxf_s \ge 2f_{\max},否则混叠;
  3. 混叠本质是频谱复制后重叠,伪频率 falias=fkfsf_{\text{alias}} = |f - kf_s|
  4. 量化:连续值映射到 2N2^N 个等级,步长 q=V/2Nq = V/2^N
  5. 量化噪声功率 q2/12q^2/12,正弦波信噪比 6.02N+1.766.02N + 1.76 dB;
  6. 16 bit ≈ 96 dB,24 bit ≈ 145 dB。

下一篇《频域入门与 DFT》终于进入频域:为什么任意信号能分解成正弦波、内积和正交性、以及 DFT 公式的逐步推导和手算例子。

8. 深入专题:量化误差、抖动、过采样与常见误区

量化看起来只是”四舍五入”,但里面的细节足以影响专业音频质量。这一节讲量化误差长什么样、抖动(dither)和过采样(oversampling)为什么有用,并用手算例子加深理解。

8.1 量化误差逐点演示

量化误差曲线

图里:

  • 蓝色虚线是原始正弦;
  • 橙色阶梯是量化结果;
  • 红色折线是两者之差(放大显示)。

可以观察到:

  • 误差始终在 [q/2,q/2][-q/2, q/2] 内;
  • 误差方向”随机”交替,近似均匀分布;
  • 信号变化慢时误差变化也慢(阶梯平坦段)。

8.2 量化噪声与抖动(dithering)

问题:量化误差其实不是完全随机的——它对低频信号有相关性。一个缓慢变化的信号,误差会在某些采样点”卡”在同一台阶,形成可听的低频失真,甚至让微弱信号变成”咔哒”声。

解决办法是抖动(dither):在量化前加一点微小的随机噪声:

y[n]=x[n]+d[n],d[n]均匀分布 [q/2,q/2]y[n] = x[n] + d[n], \qquad d[n] \sim \text{均匀分布 } [-q/2, q/2]

抖动把量化误差”去相关”,让它变成真正的白噪声,听起来是均匀的”嘶嘶”,而不是失真的”嗡嗡”。代价是底噪稍微升高,但听感大幅改善。

更高级的做法是噪声整形(noise shaping):把量化误差反馈回去,把噪声推到人耳不敏感的高频段,让 16 bit 的实际听感接近 20 bit。

8.3 过采样(oversampling)为什么有用

过采样:用远高于奈奎斯特的频率采样(如 96 kHz、192 kHz),再在数字域降回目标采样率。

好处:

  1. 抗混叠更简单:模拟滤波器不需要在 20 kHz 处急剧截止,数字滤波器可以做到;
  2. 量化噪声被摊薄:同样位深,过采样后噪声分布到更宽的频带,听频带内噪声密度降低;
  3. 数字处理更干净:非线性处理(如限幅、失真)会产生高频谐波,过采样给它们留出空间,避免混叠回听频带。

播放器内部一般固定 44.1/48 kHz,但专业音频处理(均衡、压缩)常用 4× 或 8× 过采样。

8.4 8-bit 手算例子

设满量程 V=256V = 256(8 bit 等级 0–255),信号采样值:

x=[0.4,1.7,3.2,5.1,6.8,5.4,3.1,1.2]x = [0.4, 1.7, 3.2, 5.1, 6.8, 5.4, 3.1, 1.2]

量化步长 q=1q = 1(每个整数一个等级),四舍五入:

原始量化误差
0.40−0.4
1.72+0.3
3.23−0.2
5.15−0.1
6.87+0.2
5.45−0.4
3.13−0.1
1.21−0.2

误差都落在 [0.5,0.5]=[q/2,q/2][-0.5, 0.5] = [-q/2, q/2]。误差平方和:

0.16+0.09+0.04+0.01+0.04+0.16+0.01+0.04=0.550.16+0.09+0.04+0.01+0.04+0.16+0.01+0.04 = 0.55

平均误差功率 0.55/80.06880.55/8 \approx 0.0688,接近理论值 q2/12=1/120.0833q^2/12 = 1/12 \approx 0.0833(样本少所以有偏差)。这就是”量化噪声功率 q2/12q^2/12“的来源。

8.5 常见误区

误区一:“采样率越高越好,24 bit 一定比 16 bit 好听”

高采样率/高位深只提供潜力。如果原始录音本身有噪声、压缩过狠,或者回放设备平庸,高参数听不出来。而且高采样率文件更大。

误区二:“混叠只在录音时发生,播放端不用担心”

播放端做数字处理(变速、失真、均衡)同样会产生高于奈奎斯特的分量,处理后再输出就会混叠。所以专业插件都做内部过采样。

误区三:“16 bit 的 -96 dB 底噪听不见”

在安静环境下、用高保真设备、播放微弱的结尾渐弱时,-96 dB 的量化底噪是可以感知的。这也是为什么录音用 24 bit。

误区四:“把音量调小就不会削波”

削波发生在信号链内部:如果内部某个节点(如混音总线)已经超过 0 dBFS,后面把主音量调小并不能修复已经被削掉的波形。

误区五:“FFT 的 bin 频率是连续的”

FFT 只能给出离散 bin 上的频率,bin 之间没有信息(除非做插值或更多点)。分辨率 Δf=fs/N\Delta f = f_s/N

8.6 扩展练习

  1. 用 8 个采样值手算 4-bit 量化的误差,验证误差范围。
  2. 为什么抖动能让量化误差”更随机”?用误差相关性的角度解释。
  3. 48 kHz 采样、32 点 FFT,相邻 bin 间隔是多少 Hz?
  4. 过采样 4 倍后,同一 16 bit 系统的听频带内噪声密度下降多少 dB?

练习

  1. 采样率 48 kHz,奈奎斯特频率是多少?能无混叠录制的最高频率是多少?
  2. 16 bit 量化步长是满量程的多少分之一?
  3. PN=q2/12P_N = q^2/12PS=V2/8P_S = V^2/8 重新推导 6.02N + 1.76。
  4. 为什么 32 bit 浮点格式的动态范围远超 24 bit 整数?