3. PCM 编解码原理:从模拟到数字的第一道关口

各位好,欢迎来到第三章。今天聊的是音频数字化的基石——PCM。说白了,就是把连续的声音信号,变成一串离散的数字。你手机里录的每一段语音,CD 上的每一首歌,底层都是 PCM。

我在刚入行时,总觉得 PCM 太简单了,不就是采样、量化、编码三步走嘛。直到有一次做语音采集系统,发现回放的声音总有“沙沙”声,排查了三天,最后发现是量化位数没选对。嗯,从那以后我再也不敢小看 PCM 了。

3.1 脉冲编码调制(PCM)流程

PCM 的全称是 Pulse Code Modulation,中文叫脉冲编码调制。它的核心流程就三步:采样、量化、编码。我习惯用一个比喻来理解:

  • 采样:像用高速相机拍连续运动,每隔固定时间拍一张“快照”。
  • 量化:把每张“快照”的精确位置,近似到最近的刻度线上。
  • 编码:把刻度线的编号,写成二进制数字。

下面这张图,是我自己画的标准 PCM 流程,你一看就明白:

PCM 编解码完整流程 模拟信号输入 连续时间/连续幅度 采样 fs ≥ 2f_max 量化 N bit 精度 编码 二进制 PCM 码流 数字传输 / 存储 数模转换 重建模拟信号 解码 PCM 码流 → 样点值 重建滤波 低通平滑 模拟信号输出 连续波形 编码端(ADC) 解码端(DAC)

关键点:采样决定频率范围,量化决定动态范围,编码决定数据格式。三者缺一不可。

3.2 量化噪声与信噪比

量化这一步,说白了就是“近似”。你把连续的幅度值,硬塞到有限的几个台阶上,必然会有误差。这个误差,就是量化噪声。

我举个例子。假设你用 8 位量化,只有 256 个台阶。一个真实电压是 1.234V,但离它最近的台阶是 1.23V,差了 0.004V。这个差值,就是量化误差。所有样点的误差加起来,就是量化噪声。

量化噪声的功率,有一个经典公式:

量化噪声功率 = Δ² / 12

其中 Δ = 满量程范围 / 2^N
N = 量化位数

信噪比(SNR)的计算,我习惯用这个简化公式:

SNR (dB) ≈ 6.02 × N + 1.76

你想想看,每增加 1 位,信噪比提升约 6 dB。这就是为什么 16 位音频的理论 SNR 是 98 dB,而 8 位只有 50 dB 左右。

我的经验:做语音通信时,8 位 PCM 勉强够用,但背景噪声会很明显。做音乐录音,至少 16 位起步,24 位更安全。我曾经在一个项目里为了省带宽用了 8 位,结果客户反馈“声音像从罐头里传出来的”,后来乖乖改回 16 位。

3.3 A律 / μ律压扩技术

这里有个问题。人耳对小声更敏感,对大声相对迟钝。如果用均匀量化,小声的 SNR 会非常差,大声的 SNR 又过剩。说白了,就是资源分配不合理。

压扩技术就是来解决这个问题的。它的思路很简单:对小信号放大,对大信号压缩,让量化台阶在低幅度区域更密,高幅度区域更疏。

两种主流标准:

参数 A律(A-Law) μ律(μ-Law)
主要使用地区 欧洲、中国、国际 北美、日本
压缩参数 A = 87.6 μ = 255
有效位数 13 位折合 8 位 14 位折合 8 位
小信号 SNR 约 38 dB 约 40 dB
ITU 标准 G.711 (A-law) G.711 (μ-law)

两种压扩的数学表达式,我直接贴出来:

// A律压扩(A=87.6)
if |x| ≤ 1/A:
    F(x) = A·|x| / (1 + ln A)
else:
    F(x) = (1 + ln(A·|x|)) / (1 + ln A)

// μ律压扩(μ=255)
F(x) = ln(1 + μ·|x|) / ln(1 + μ)

注意:A律和μ律不兼容。如果你用A律编码,解码端也必须用A律,否则声音会严重失真。我在做跨国语音网关项目时,就踩过这个坑——中美两端用了不同的压扩标准,结果通话全是“机器人声”。

3.4 线性PCM与非线性PCM对比

线性 PCM,就是均匀量化。每个量化台阶一样大。非线性 PCM,就是用了压扩技术,量化台阶不均匀。

我整理了一个对比表,方便你快速理解:

对比维度 线性 PCM 非线性 PCM
量化方式 均匀量化 非均匀量化(压扩)
小信号质量 差(量化噪声明显) 好(台阶更密)
大信号质量 好 略差(台阶更疏)
动态范围 受限于位数 等效扩展约 30 dB
典型应用 WAV、AIFF、CD G.711 电话语音
数据率(8kHz 8bit) 64 kbps 64 kbps(但质量更好)

你可能会问:既然非线性 PCM 小信号质量更好,为什么还要用线性 PCM?

原因很简单。线性 PCM 处理起来简单,没有压扩/扩张的额外计算,而且对于高位数(16 位以上),均匀量化的 SNR 已经足够好,非线性带来的收益就不明显了。但在电话语音这种低带宽场景,8 位非线性 PCM 的效果,能接近 12-13 位线性 PCM 的水平。这就是它至今仍在全球电话网中服役的原因。

一句话总结:线性 PCM 是“公平对待每个信号”,非线性 PCM 是“优待小信号,牺牲大信号”。选哪个,看你的带宽和场景。