4. 音频编解码概述:有损压缩与无损压缩、时域编码与频域编码、Codec芯片的作用

各位好,我是老周。今天咱们聊聊音频编解码的核心概念。说实话,这章内容看起来有点理论,但它是后面所有实战的基础。你想想看,一个Codec芯片里跑的那些算法,到底在干什么?说白了,就是在做压缩和解压缩。

音频压缩这件事,我入行时也觉得挺简单的——不就是把数据变小吗?后来踩了不少坑才明白,这里面门道深着呢。咱们今天就把有损/无损、时域/频域、还有Codec芯片到底干了啥,一次性说清楚。

4.1 为什么要压缩?

先算一笔账。一张CD音质的音频,采样率44.1kHz,量化精度16bit,双声道。一秒的数据量是多少?

44,100 × 16 × 2 = 1,411,200 bps ≈ 1.41 Mbps

一首4分钟的歌,就是约42MB。你手机里存1000首歌,那就是42GB。这还只是CD音质。如果是24bit/192kHz的高清音频,数据量直接翻好几倍。

所以,不压缩不行。但压缩不是随便砍数据,得讲究方法。

4.2 无损压缩 vs 有损压缩

这是音频压缩里最基础的分水岭。我当年面试新人,第一个问题就是:无损和有损的区别是什么?

对比项 无损压缩 有损压缩
原理 去除冗余信息,保留全部原始数据 去除人耳不敏感的信息,丢弃部分数据
解码后 与原始数据完全一致 与原始数据有差异,但听感上尽量接近
压缩比 通常2:1 ~ 3:1 通常10:1 ~ 20:1,甚至更高
典型格式 FLAC, ALAC, APE, WAV (未压缩) MP3, AAC, OGG, WMA
适用场景 音乐存档、专业制作、无损播放 流媒体、网络传输、便携设备

关键点:无损压缩是可逆的,有损压缩是不可逆的。你拿一个MP3转成FLAC,文件变大了,但音质不会变好——丢失的信息已经回不来了。

我记得有一次,一个客户非说他们的播放器支持"无损MP3"。我当场就笑了——MP3本身就是有损格式,哪来的无损MP3?后来发现是他们的产品文案写错了。嗯,这种坑在行业里其实不少见。

4.2.1 无损压缩怎么做到的?

无损压缩的核心思路是:找到数据中的冗余,用更短的方式表示它。

举个例子,一段静音片段,原始数据是连续的0。无损压缩会记录成"连续1000个0",而不是存1000个0。这就是游程编码的思想。

更高级的,比如FLAC,用了线性预测。它根据前面的采样值预测下一个值,然后只存预测误差。如果预测准,误差就很小,需要的比特数就少。

小技巧:我在做嵌入式Codec驱动时,经常用FLAC做测试。因为它解码后和原始数据完全一致,方便验证硬件通路有没有问题。如果FLAC解码后和原始WAV对不上,那肯定是驱动或硬件有bug。

4.2.2 有损压缩的"损"在哪里?

有损压缩利用了心理声学模型。说白了,就是人耳有些声音听不见,或者容易被其他声音掩盖。把这些声音去掉,人耳感觉不到。

具体来说,有损压缩会做这几件事:

  • 去除听阈以下的声音:人耳听不到20Hz以下和20kHz以上的频率
  • 利用掩蔽效应:一个响的声音会掩盖旁边弱的声音
  • 量化噪声整形:把量化噪声推到人耳不敏感的频率区域

我曾经调试过一个蓝牙音箱的AAC编码器,发现高频细节总是丢失。查了半天,原来是编码器的心理声学模型参数配错了,把一些本该保留的谐波给砍掉了。调了参数之后,听感明显好了很多。

4.3 时域编码 vs 频域编码

这是编码方法的另一个维度。无损压缩通常用时域方法,有损压缩通常用频域方法。但也不是绝对的。

4.3.1 时域编码

时域编码直接在时间轴上处理音频采样值。常见的时域编码方法有:

  • 差分脉冲编码调制(DPCM):只存相邻采样值的差值
  • 自适应差分脉冲编码调制(ADPCM):根据信号动态调整量化步长
  • 线性预测编码(LPC):用过去的采样值预测当前值

时域编码的优点是计算简单,延迟低。缺点是对复杂信号的压缩效率不高。

注意:ADPCM在语音通信里用得很多,比如G.722。但用在音乐上效果一般。我做过一个项目,客户非要用ADPCM压缩音乐,结果音质惨不忍睹。后来换成AAC,问题就解决了。

4.3.2 频域编码

频域编码先把时域信号变换到频域,再对频域数据进行压缩。核心工具是:

  • 离散傅里叶变换(DFT):把时域信号分解成不同频率的正弦波
  • 改进型离散余弦变换(MDCT):MP3、AAC等主流编码器用的变换
  • 子带编码:把频带分成多个子带,分别处理

频域编码的优点是压缩效率高,能利用心理声学模型。缺点是计算量大,延迟高。

你想想看,为什么MP3能压到1/10的大小?就是因为它把信号变换到频域后,把那些不重要的频率分量直接扔掉了。

4.4 Codec芯片到底在干什么?

好了,前面讲了那么多理论,现在说说Codec芯片。很多人以为Codec芯片就是个DAC加ADC,其实没那么简单。

一个典型的音频Codec芯片,内部包含:

  1. ADC/DAC转换器:模拟和数字之间的桥梁
  2. 采样率转换器(SRC):处理不同采样率之间的转换
  3. 数字信号处理器(DSP):做滤波、增益控制、混音等
  4. 编解码引擎:硬件加速的编码/解码模块
  5. 控制接口:I2C/SPI,用于配置寄存器
  6. 音频接口:I2S/TDM,用于传输音频数据

核心观点:Codec芯片不是简单的"模拟转数字",它是一个完整的音频处理子系统。我调试过的Codec芯片,有的内部有十几个数字滤波器,还有的集成了硬件AAC编码器。

下面这张图展示了Codec芯片在音频系统中的位置和作用:

音频Codec芯片功能框图 模拟输入 麦克风/线路输入 ADC 模数转换 数字处理 滤波/增益/混音 采样率转换 编解码引擎 DAC 数模转换 模拟输出 耳机/喇叭 控制接口 (I2C/SPI) 音频接口 (I2S/TDM) 说明: 1. 模拟信号经ADC转换为数字信号,进入数字处理模块 2. 数字处理模块完成滤波、增益控制、采样率转换、编解码等操作 3. 处理后的数字信号经DAC还原为模拟信号输出 4. 控制接口配置芯片参数,音频接口传输音频数据

4.5 实际项目中的Codec选型

选Codec芯片,我一般看这几个维度:

维度 考虑因素 我的经验
音频性能 信噪比、THD+N、动态范围 消费类产品SNR>95dB就够,专业设备要>110dB
采样率支持 最高支持到多少kHz 现在主流都支持192kHz,但实际用48kHz或96kHz居多
接口类型 I2S、TDM、PDM 多声道场景用TDM,单声道用I2S
功耗 工作电流、待机电流 电池设备要选低功耗的,我踩过功耗超标的坑
内置DSP 是否需要硬件滤波、DRC等 有DSP的芯片贵一些,但能省掉外部DSP芯片

避坑指南:我曾经在一个项目里选了某款Codec芯片,看datasheet参数很漂亮。结果实际测试时发现,它的ADC在低温环境下性能严重下降。后来换了一款工业级的芯片才解决问题。所以,选型时一定要看工作温度范围和实际测试数据,不能只看datasheet。

4.6 小结

这一章我们聊了音频编解码的核心概念。无损压缩保留全部信息,有损压缩利用人耳特性砍掉不敏感的信息。时域编码简单直接,频域编码效率更高。Codec芯片是音频系统的核心,它集成了ADC/DAC、数字处理、编解码引擎等功能。

这些概念看起来有点抽象,但后面讲到具体的Codec驱动开发和调试时,你会发现它们无处不在。比如配置编码器参数时,你要知道什么是有损压缩的参数;调试音频通路时,你要知道Codec芯片内部的数据流是怎么走的。