3. PCM 编解码原理:从模拟到数字的第一道关口
各位好,欢迎来到第三章。今天聊的是音频数字化的基石——PCM。说白了,就是把连续的声音信号,变成一串离散的数字。你手机里录的每一段语音,CD 上的每一首歌,底层都是 PCM。
我在刚入行时,总觉得 PCM 太简单了,不就是采样、量化、编码三步走嘛。直到有一次做语音采集系统,发现回放的声音总有“沙沙”声,排查了三天,最后发现是量化位数没选对。嗯,从那以后我再也不敢小看 PCM 了。
3.1 脉冲编码调制(PCM)流程
PCM 的全称是 Pulse Code Modulation,中文叫脉冲编码调制。它的核心流程就三步:采样、量化、编码。我习惯用一个比喻来理解:
- 采样:像用高速相机拍连续运动,每隔固定时间拍一张“快照”。
- 量化:把每张“快照”的精确位置,近似到最近的刻度线上。
- 编码:把刻度线的编号,写成二进制数字。
下面这张图,是我自己画的标准 PCM 流程,你一看就明白:
关键点:采样决定频率范围,量化决定动态范围,编码决定数据格式。三者缺一不可。
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 是“优待小信号,牺牲大信号”。选哪个,看你的带宽和场景。