引言:耳朵的"盲区"

把一个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%的重叠。这带来两个好处:

  1. 减少块效应:重叠使帧边界平滑过渡,避免不连续性导致的可闻伪影
  2. 更好的频率分辨率:窗口长度加倍,频率分辨率提高
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超低延迟的关键设计:

  1. 2.5ms低重叠窗口:打破传统50%重叠的限制
  2. 无帧间预测依赖:每帧可独立解码,适合丢包恢复
  3. 隐式比特分配:避免迭代编码带来的延迟
  4. 简化的带宽扩展:频谱折叠不需要前视

十、从 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,三十年的演进让我们看到了数学与感知的奇妙交汇。每一次技术进步,都是对人类听觉更深理解的证明。而这场探索,远未结束。


参考资料与延伸阅读

  1. Fletcher, H., & Munson, W. A. (1933). “Loudness, its definition, measurement and calculation.” Journal of the Acoustical Society of America.

  2. Moore, B. C. J. (2012). An Introduction to the Psychology of Hearing (6th ed.). Brill.

  3. Valin, J.-M., et al. (2013). “High-Quality, Low-Delay Music Coding in the Opus Codec.” AES 135th Convention.

  4. Johnston, J. D. (1988). “Transform coding of audio signals using perceptual noise criteria.” IEEE Journal on Selected Areas in Communications.

  5. 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.”

  6. Valin, J.-M., et al. (2012). “Definition of the Opus Audio Codec.” RFC 6716, IETF.