引言:耳朵的"盲区"
把一个100MB的WAV文件压缩成5MB的MP3,声音听起来几乎一模一样。这听起来像是魔法,但它的本质是数学对人类感知的精确计算。音频压缩的核心问题不是"如何把数据变小",而是"人类到底能听到什么"。
答案令人惊讶:你听到的,远比你想象的少。人类听觉系统存在大量"漏洞"——某些频率的声音会被其他声音掩盖,某些时间段的信息会被忽略,某些细节根本不会被大脑处理。音频编解码器的全部艺术,就在于精确找到这些漏洞并加以利用。
这篇文章将带你深入心理声学的核心原理,看看MP3、AAC、Opus这些编解码器是如何"欺骗"你的耳朵的。
一、听阈曲线:沉默的定义
绝对听阈与 Fletcher-Munson 曲线
1933年,贝尔实验室的 Harvey Fletcher 和 Wilden Munson 进行了一项听起来简单但影响深远的实验:让人在不同频率下听纯音,记录他们能听到的最小音量。结果绘制出的曲线,至今仍是音频工程的基石。
graph LR
A[20Hz] -->|高阈值| B[需要很大音量才能听到]
C[2000-5000Hz] -->|最低阈值| D[耳朵最敏感的区域]
E[20000Hz] -->|高阈值| F[接近听觉极限]
这条曲线揭示了一个关键事实:人类耳朵对中频(约2-5kHz)最敏感,对低频和高频则迟钝得多。在20Hz的低频段,一个声音需要比在3000Hz处响10000倍才能被察觉。
这意味着什么?如果一段音频在低频或高频段的量化噪声低于听阈,这些噪声可以被直接忽略。MP3编解码器在每个频段都会计算听阈曲线,将低于阈值的声音视为"不存在"。
为什么会有听阈?
听阈的存在源于耳蜗的物理结构。耳蜗内部约有15000个毛细胞,它们负责将机械振动转化为神经信号。但这些毛细胞的分布并不均匀——对应中频的区域毛细胞最密集、最敏感,而对应低频和高频的区域则相对稀疏。
这种非均匀分布是进化的产物。人类的语言频率主要集中在500Hz到3000Hz之间,对这一频段保持高灵敏度对生存至关重要。而对20Hz的次声波保持敏感则意义不大——毕竟史前人类很少需要听到大象的脚步声来逃避捕食者。
听阈曲线的存在为音频压缩提供了第一个"免费午餐":低于阈值的信息,丢弃即可。
二、频率掩蔽:大鱼吃小鱼的听觉世界
同时掩蔽效应
如果说听阈曲线为音频压缩提供了"静态"的优化空间,那么频率掩蔽则打开了"动态"优化的大门。
想象你在安静的房间里听到蚊子嗡嗡叫——声音虽小但清晰可辨。现在打开一台大功率风扇,蚊子的声音突然消失了。蚊子还在飞,但你的耳朵已经"听不见"它了。这就是频率掩蔽。
graph TB
subgraph 掩蔽效应示意
A[掩蔽音 1000Hz 80dB] --> B[产生掩蔽阈值曲线]
B --> C[附近频率的声音被掩盖]
C --> D[即使这些声音客观存在]
D --> E[人耳也感知不到]
end
精确地说,当一个强音(掩蔽音)存在时,它会在周围频率范围内产生一个"掩蔽阈值"。任何低于这个阈值的弱音(被掩蔽音)都将被听觉系统忽略。掩蔽阈值曲线像一个从掩蔽音频率向两侧延伸的山坡——掩蔽音越强,山坡越宽越高;距离掩蔽音越近,掩蔽效果越强。
掩蔽曲线的数学描述
掩蔽效应并非对称的。一个掩蔽音对其高频侧的掩蔽能力比低频侧更强。这可以用公式近似描述:
对于掩蔽音频率 $f_m$ 和声压级 $L_m$,掩蔽阈值 $L_t(f)$ 在高频侧的衰减斜率约为每Bark频段-10到-15dB,而在低频侧约为-25到-35dB。
这个非对称性解释了为什么"轰鸣"的低音(如贝斯)不会完全掩盖高音旋律,但一个强力的中频人声却可以掩盖大量背景细节。
Bark 尺度:临界频带的度量
在讨论掩蔽效应时,频率的单位不是赫兹,而是Bark。Bark尺度将人耳的频率分辨率划分为24个"临界频带"(Critical Band),每个频带内的声音会被耳朵"打包"处理。
这意味着掩蔽效应主要发生在临界频带内部——一个频带内的强音可以掩蔽同频带内的弱音,但对其他频带的影响有限。MP3、AAC、Opus等编解码器都会将频谱划分为近似临界频带的子带,在每个子带内独立应用掩蔽模型。
| 临界频带 | 频率范围 (Hz) | 带宽 (Hz) |
|---|---|---|
| 1 | 0-100 | 100 |
| 6 | 510-630 | 120 |
| 12 | 1720-2000 | 280 |
| 18 | 3700-4400 | 700 |
| 24 | 15500-22050 | 6550 |
注意高频段临界频带的带宽远大于低频段——这正是人耳频率分辨率在高频下降的体现。
三、时间掩蔽:声音的时间旅行
前向掩蔽与后向掩蔽
频率掩蔽发生在同一时刻,但听觉系统在时间维度上同样存在"盲区"。
后向掩蔽(前掩蔽):一个强音出现后,它会在随后约50-200毫秒内产生掩蔽效应。这很容易理解——强音过后,听觉系统需要时间"恢复",期间对弱音的敏感度下降。
前向掩蔽(后掩蔽):这听起来违反直觉——一个强音可以掩蔽在它之前出现的弱音,持续时间可达10-30毫秒。神经科学解释认为,这是因为弱音产生的神经信号在传向大脑的途中被强音的更强信号"覆盖"或"干扰"了。
gantt
title 时间掩蔽效应示意
dateFormat X
axisFormat %s ms
section 前向掩蔽区
弱音被后续强音掩盖 :crit, -30, 0
section 强音
掩蔽音 (80dB) :active, 0, 100
section 后向掩蔽区
弱音被强音掩盖 :crit, 100, 200
对编码的意义
时间掩蔽效应为音频编码提供了优化瞬态信号的机会。当检测到一个强烈的瞬态(如鼓点击打),编码器可以在瞬态前后降低比特分配——因为这一区域的声音会被掩蔽。但这也带来了风险:如果降低太多,可能导致预回声问题。
预回声发生在瞬态之前:由于编码器使用较长的变换窗口(如MP3的1152样本),瞬态的量化噪声被"涂抹"到整个窗口。如果瞬态前本来是静音或极弱的背景声,这些噪声就会变得可闻,听起来像瞬态前有一个模糊的"预响"。
解决预回声的方法包括:
- 窗口切换:检测到瞬态时切换到更短的变换窗口,减少噪声涂抹范围
- 时域噪声整形(TNS):在频域控制噪声的时域分布
- 长窗口预测:Opus使用多帧预测来减少瞬态帧的比特需求
四、MDCT:从时域到频域的魔法
为什么需要变换?
原始音频是时域信号——振幅随时间变化的波形。但心理声学模型工作在频域——它告诉我们哪些频率的声音可以丢弃。因此,音频编解码器的第一步是将时域信号变换到频域。
最常用的变换是改进离散余弦变换(MDCT)。它是离散余弦变换(DCT)的一个变体,专门设计用于音频编码。
MDCT 的特殊性
MDCT 与普通 DCT 的关键区别在于重叠窗口。每个MDCT块使用前一帧的后半部分和当前帧的前半部分,形成50%的重叠。这带来两个好处:
- 减少块效应:重叠使帧边界平滑过渡,避免不连续性导致的可闻伪影
- 更好的频率分辨率:窗口长度加倍,频率分辨率提高
graph LR
subgraph MDCT重叠窗口
A[帧N-1后半] --> C[帧N的MDCT窗口]
B[帧N前半] --> C
D[帧N后半] --> E[帧N+1的MDCT窗口]
B --> E
end
低重叠窗口:Opus 的创新
传统编解码器(MP3、AAC、Vorbis)使用50%重叠窗口,这意味着一个20ms的帧需要额外的20ms前视(lookahead),总延迟至少40ms。
Opus 为了实现超低延迟(最低5ms),采用了低重叠窗口——仅2.5ms的重叠。这大大减少了算法延迟,但也带来了代价:频谱泄漏增加,对强谐波信号的处理变差。
Opus 的解决方案包括:
- 预加重滤波:衰减低频,减少高频泄漏
- 感知预滤波/后滤波:使用pitch周期增强谐波结构
- 传播旋转:将量化噪声从窄带分布扩展到更宽范围
五、量化与比特分配:如何丢弃"不重要"的信息
量化的本质
变换到频域后,得到的是一组频谱系数。这些系数是浮点数,无法直接高效编码。量化就是将这些浮点数映射为整数——这个过程必然引入误差(量化噪声)。
关键问题:如何分配有限的比特,使量化噪声不可闻?
心理声学比特分配
心理声学模型为每个频带计算一个掩蔽阈值。比特分配的目标是确保每个频带的量化噪声低于其掩蔽阈值。
实际操作中,编解码器计算每个频带的信号掩蔽比(SMR):
$$SMR = \frac{\text{信号能量}}{\text{掩蔽阈值}}$$SMR越高的频带需要越多比特。一个经验公式是:
$$\text{所需比特} \propto \log_2(SMR)$$MP3 的显式比特分配
MP3(以及AAC)使用显式比特分配:编码器计算每个频带的比特分配,并将分配信息编码到比特流中。解码器读取这些信息,按照指示解码。这种方式灵活但开销较大——比特分配信息本身占用比特。
Opus 的隐式比特分配
Opus 采用了一种创新方法:隐式比特分配。编码器确定总比特数后,编码器和解码器运行完全相同的比特分配函数。这意味着:
- 不需要传输比特分配信息
- 编码器必须提前确定总比特数
- 实现精确的CBR(恒定比特率)
Opus 使用一系列预定义的静态分配曲线,根据总比特率在曲线间插值。这些曲线本身已经近似了典型音频的心理声学需求。
六、Opus 架构:两种编码器的联姻
SILK + CELT 的混合模式
Opus 的独特之处在于它结合了两种完全不同的编码技术:
SILK:源自Skype的语音编码器,基于线性预测(LPC)。擅长处理语音信号,在中低比特率下效率极高。工作在8/12/16kHz采样率。
CELT:源自Xiph.Org的变换编码器,基于MDCT。擅长处理音乐和高比特率语音。工作在48kHz采样率。
graph TB
subgraph Opus编码流程
A[输入音频 48kHz] --> B{模式选择}
B -->|语音 低码率| C[SILK编码器<br/>8/12/16kHz]
B -->|音乐 高码率| D[CELT编码器<br/>48kHz]
B -->|宽带语音| E[混合模式<br/>SILK处理低频<br/>CELT处理高频]
C --> F[比特流复用]
D --> F
E --> F
F --> G[输出Opus帧]
end
混合模式的工作原理
在混合模式下,音频被分为两个频段:
- 低频(0-8kHz):由SILK编码,利用语音的短时平稳特性
- 高频(8-20kHz):由CELT编码,利用变换编码的频域特性
为什么这样设计?语音信号的主要能量集中在4kHz以下,使用专门优化的语音编码器效率更高。而高频部分通常包含较少信息,使用变换编码可以灵活处理。
无缝模式切换
Opus 可以在SILK、CELT、混合模式之间无缝切换,不产生可闻间断。这通过在比特流中嵌入冗余帧实现——切换时,前一帧和当前帧的重叠区域使用两种编码器的输出进行混合。
七、立体声编码:从双声道到单声道的艺术
为什么立体声不等于两倍单声道?
立体声录音的两个声道通常高度相关。左声道和右声道的差异信息远少于总和信息。如果独立编码两个声道,会浪费大量比特编码冗余数据。
三种立体声模式
Opus 支持三种立体声编码模式:
中侧立体声(Mid-Side, MS):
$$M = \frac{L+R}{2}, \quad S = \frac{L-R}{2}$$Mid信号包含两个声道的共同信息(通常能量较大),Side信号包含差异信息(通常能量较小)。由于Side信号较小,可以使用较少比特编码。
双单声道(Dual Stereo): 当左右声道相关性很低时,独立编码两个声道效率更高。编码器会自动检测这种情况并切换模式。
强度立体声(Intensity Stereo): 在高频段,人类对声源定位的精度下降。强度立体声只编码一个声道(通常是Mid),并传输声像位置信息。解码器根据位置信息重建左右声道的能量分布。
graph LR
A[立体声输入] --> B{声道相关性分析}
B -->|高相关性| C[MS立体声<br/>编码Mid+Side]
B -->|低相关性| D[双单声道<br/>独立编码L+R]
B -->|高频段低定位需求| E[强度立体声<br/>仅编码能量+位置]
八、带宽扩展:如何"猜出"缺失的高频
问题:低比特率下的高频缺失
在极低比特率下(如24kbps),编码器可能无法分配足够比特给高频段。直接丢弃这些频段会导致声音"发闷"——高频细节丢失,如同用厚毯子盖住扬声器。
SBR:频带复制
HE-AAC(High Efficiency AAC)采用了**频带复制(Spectral Band Replication, SBR)**技术:只编码低频段,高频段通过复制低频段并适当整形来重建。这种方法在语音编码中效果显著——人声的高频谐波结构与低频高度相关。
Opus 的频谱折叠
Opus 使用更简单的方法:频谱折叠。当一个频带没有分配到任何比特时,解码器使用低频段的归一化频谱系数填充该频带。这种方法比SBR简单得多,没有额外延迟,而且可以逐帧改变——非常灵活。
虽然效果不如精细的SBR,但在极低延迟和低复杂度约束下,频谱折叠是一个优雅的折中方案。
九、延迟的物理极限:为什么实时通信如此困难
算法延迟的构成
音频编解码器的总延迟由以下部分组成:
| 延迟来源 | MP3 | AAC-LD | Opus |
|---|---|---|---|
| 帧大小 | 26ms | 20ms | 2.5-60ms可选 |
| 前视 | 26ms | 20ms | 2.5ms |
| 编解码处理 | ~5ms | ~5ms | ~2ms |
| 传输缓冲 | 变化 | 变化 | 变化 |
| 最小总延迟 | ~57ms | ~45ms | ~5ms |
为什么低延迟这么难?
低延迟编码面临几个根本挑战:
频率分辨率下降:帧越短,频谱分辨率越低。一个5ms帧只有240个样本(48kHz采样),频率分辨率约为200Hz。而20ms帧有960个样本,分辨率可达50Hz。频率分辨率低意味着无法精确定位和处理窄带信号。
预测效率下降:长帧可以利用帧间的相关性进行预测编码(如MP3的比特池)。短帧几乎没有帧间预测的空间。
瞬时冲击响应差:短窗口虽然对瞬态响应好,但对平稳信号的编码效率低。Opus 的解决方案是提供多种帧大小(2.5/5/10/20/40/60ms),让编码器根据信号特性选择。
Opus 的超低延迟设计
Opus 达到5ms超低延迟的关键设计:
- 2.5ms低重叠窗口:打破传统50%重叠的限制
- 无帧间预测依赖:每帧可独立解码,适合丢包恢复
- 隐式比特分配:避免迭代编码带来的延迟
- 简化的带宽扩展:频谱折叠不需要前视
十、从 MP3 到 Opus:心理声学模型的演进
MP3 (1991):开创者
MP3 使用相对简单的心理声学模型:
- 基于FFT计算频谱和掩蔽阈值
- 每帧计算全局掩蔽阈值
- 使用比特池平滑比特率波动
MP3 的心理声学模型相对粗糙,但作为第一个实用化的感知音频编码器,它开创了整个领域。
AAC (1997):改进者
AAC 在MP3基础上改进:
- 更精细的频带划分(更接近临界频带)
- 更准确的掩蔽模型
- 时域噪声整形(TNS)减少预回声
- 长期预测(LTP)提高编码效率
AAC 的心理声学模型比MP3更精确,在相同比特率下质量更好。
Opus (2012):集大成者
Opus 将心理声学知识直接"硬化"到格式设计中:
- 频带划分直接对应临界频带
- 比特分配曲线预先编码心理声学最优分配
- 传播旋转减少鸟鸣伪影(高频稀疏量化噪声)
- 崩溃预防(Collapse Prevention)填充静音空洞
Opus 的创新在于它不再传输心理声学参数——这些参数已经"嵌入"格式本身。解码器可以独立做出正确的比特分配决策。
结语:感知编码的哲学
心理声学模型的成功揭示了一个深刻的道理:我们感知的世界,是大脑对物理世界的重构,而非忠实记录。耳蜗接收到的信号已经经过物理过滤,大脑的处理又进一步"剪裁"信息。音频编解码器所做的,只是找到这些被忽略的信息并将其安全删除。
这带来一个有趣的问题:如果有一天我们完全理解了人类感知,编码器能否达到"无损感知编码"——在保持感知不变的前提下,将音频压缩到极限?
理论上,答案是肯定的。感知编码的理论极限由人类听觉的信息容量决定。根据心理声学研究,这个容量大约在每秒几百千比特——远低于CD音质的1411kbps。这意味着当前的音频编码技术还有很大的提升空间。
但实践的困难在于:人类的感知系统极其复杂,个体差异巨大,还受环境、情绪、注意力等因素影响。完美的心理声学模型可能永远不会存在——但这并不妨碍我们不断逼近它。
从MP3到Opus,三十年的演进让我们看到了数学与感知的奇妙交汇。每一次技术进步,都是对人类听觉更深理解的证明。而这场探索,远未结束。
参考资料与延伸阅读
-
Fletcher, H., & Munson, W. A. (1933). “Loudness, its definition, measurement and calculation.” Journal of the Acoustical Society of America.
-
Moore, B. C. J. (2012). An Introduction to the Psychology of Hearing (6th ed.). Brill.
-
Valin, J.-M., et al. (2013). “High-Quality, Low-Delay Music Coding in the Opus Codec.” AES 135th Convention.
-
Johnston, J. D. (1988). “Transform coding of audio signals using perceptual noise criteria.” IEEE Journal on Selected Areas in Communications.
-
ISO/IEC 11172-3 (1993). “Coding of moving pictures and associated audio for digital storage media at up to about 1,5 Mbit/s - Part 3: Audio.”
-
Valin, J.-M., et al. (2012). “Definition of the Opus Audio Codec.” RFC 6716, IETF.