音频Codec原理:PCM采样与量化、时域与频域变换、心理声学模型、AAC与MP3核心差异

各位好,我是老周。今天咱们聊聊音频Codec的底层原理。说实话,很多做音视频开发的同学,调了几年Codec,却连PCM怎么变成比特流都说不清楚。这章我就把这块硬骨头啃一啃,用我这些年踩过的坑,帮你把基础打牢。

1. PCM采样与量化:数字音频的起点

PCM,全称脉冲编码调制。说白了,就是把连续的声波变成离散的数字点。你想想看,声波是连续的,但计算机只能处理0和1,怎么办?只能每隔一小段时间取一个点,再把这个点的幅度值用二进制表示出来。

核心公式:

采样率 × 位深 × 声道数 = 比特率(未压缩)

例如:44100 × 16 × 2 = 1411200 bps ≈ 1.41 Mbps

采样率决定了你能记录多高的频率。根据奈奎斯特定理,采样率必须大于信号最高频率的两倍。CD用44.1kHz,就是因为人耳上限约20kHz,留点余量。量化位深决定了动态范围。16bit能表示65536个等级,理论动态范围约96dB。24bit能达到144dB。

我在项目中遇到过一个坑:某次做语音采集,用了8bit量化,结果背景噪声全被放大了。后来换成16bit,信噪比立刻改善。所以啊,量化位深不是摆设,它直接决定了你的底噪水平。

参数 常见值 适用场景 我的建议
采样率 8kHz / 16kHz 语音通话 语音用16kHz起步
采样率 44.1kHz / 48kHz 音乐、广播 音乐用44.1kHz
采样率 96kHz / 192kHz 高保真录音 除非混音,否则没必要
位深 16bit CD、流媒体 通用标准
位深 24bit 录音、混音 后期处理留余量

实战技巧:做音频采集时,我习惯用24bit/48kHz录制原始素材,最后再降采样到16bit/44.1kHz发布。这样后期处理有足够的动态余量,不会出现削波。

2. 时域与频域变换:从波形到频谱

时域信号,就是咱们看到的波形图,横轴是时间,纵轴是幅度。但人耳对频率更敏感,所以编码时需要把时域信号转到频域。这里的关键工具就是傅里叶变换。

实际Codec里用的不是标准FFT,而是MDCT(改进型离散余弦变换)。为什么?因为MDCT能解决块边界效应。我刚开始做音频编码时,直接用FFT分块处理,结果块与块之间出现咔咔声,后来换成MDCT才搞定。

MDCT的特点:

  • 50%重叠分帧,消除块边界
  • 时域混叠抵消(TDAC)技术
  • 能量集中度高,利于压缩

你想想看,一段音乐信号,时域上看密密麻麻,但转到频域后,你会发现大部分能量集中在少数几个频率上。这就是压缩的基础——把不重要的频率成分丢掉,只保留人耳敏感的部分。

// 伪代码:MDCT变换流程
function MDCT(input_frame) {
    // 1. 加窗(正弦窗或KBD窗)
    windowed = input_frame * window_function
    
    // 2. 50%重叠
    overlap = previous_windowed + windowed
    
    // 3. 执行MDCT变换
    spectrum = mdct_transform(overlap)
    
    return spectrum
}

3. 心理声学模型:人耳的弱点就是压缩的机会

心理声学模型,说白了就是研究人耳听不见什么。人耳不是完美的,它有各种掩蔽效应。你想想看,在一个嘈杂的酒吧里,别人小声说话你根本听不见,这就是掩蔽。

心理声学模型的核心机制:

  • 绝对听阈:人耳对不同频率的敏感度不同,2kHz-4kHz最敏感,低频和高频不敏感
  • 频域掩蔽:一个强信号会掩盖附近频率的弱信号
  • 时域掩蔽:强信号前后一段时间内的弱信号也会被掩盖

我曾经踩过的坑:做低码率编码时,为了省比特,把高频全部砍掉。结果音乐听起来像蒙了一层布。后来才明白,心理声学模型不是简单砍高频,而是根据掩蔽阈值动态分配比特。该保的保,该丢的丢。

心理声学模型的工作流程是这样的:先把音频信号分成若干子带,计算每个子带的掩蔽阈值。然后对比实际信号能量和掩蔽阈值,低于阈值的部分直接丢弃,高于阈值的部分分配更多比特。这样就能在保证听感的前提下,大幅降低码率。

4. AAC与MP3核心差异:新老两代的较量

MP3诞生于90年代初,AAC是90年代末的产物。两者都基于心理声学模型,但AAC在很多方面做了改进。我当年从MP3切换到AAC时,第一感觉就是同样码率下,AAC的声音干净多了。

对比维度 MP3 AAC 我的评价
滤波器组 混合滤波器组(32子带+MDCT) 纯MDCT(1024/960点) AAC更简洁高效
窗函数 固定窗 正弦窗/KBD窗可选 AAC更灵活
子带数量 32个等宽子带 1024个频线(可分组) AAC频率分辨率更高
立体声编码 MS/强度立体声 MS/强度/参数立体声 AAC效率更高
采样率支持 32/44.1/48kHz 8-96kHz AAC覆盖更广
典型码率 128-320kbps 64-320kbps AAC低码率优势明显

核心差异详解:

第一,滤波器组不同。MP3用了32子带的多相滤波器加MDCT的混合结构,而AAC直接用纯MDCT。这意味着AAC的频率分辨率更高,能更精细地控制每个频率成分的量化噪声。

第二,窗函数更灵活。AAC支持正弦窗和KBD窗两种,可以根据信号特性动态切换。MP3只有一种固定窗,遇到瞬态信号时容易产生预回声。

第三,立体声编码更高效。AAC除了支持MP3的MS立体声和强度立体声外,还增加了参数立体声。在低码率下,参数立体声能大幅节省比特。

选型建议:如果码率充裕(256kbps以上),MP3和AAC差距不大。但码率低于128kbps时,AAC明显优于MP3。我个人习惯:流媒体用AAC 128kbps,本地收藏用AAC 256kbps或无损。

5. 知识体系总览

下面这张图,我把本章的核心知识点串起来了。你对照着看,思路会更清晰。

音频Codec原理知识体系 音频Codec原理 PCM采样与量化 时域与频域变换 心理声学模型 AAC vs MP3 采样率 量化位深 MDCT变换 掩蔽阈值计算 滤波器组差异 核心逻辑 PCM采集原始音频 → MDCT变换到频域 → 心理声学模型计算掩蔽阈值 → 根据阈值分配比特 → 量化编码 → 输出压缩比特流

嗯,这张图把本章的知识体系串起来了。从PCM采集开始,经过时频变换,再到心理声学模型指导量化,最后落到AAC和MP3的具体实现上。你把这个流程吃透了,后面调Codec参数时就知道该动哪里了。

本章要点回顾:

  • PCM采样率和位深决定了原始音频质量,选型时根据场景权衡
  • MDCT是时频变换的核心工具,解决了块边界问题
  • 心理声学模型利用人耳掩蔽效应,在保证听感的前提下压缩数据
  • AAC在滤波器组、窗函数、立体声编码等方面全面优于MP3