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芯片,内部包含:
- ADC/DAC转换器:模拟和数字之间的桥梁
- 采样率转换器(SRC):处理不同采样率之间的转换
- 数字信号处理器(DSP):做滤波、增益控制、混音等
- 编解码引擎:硬件加速的编码/解码模块
- 控制接口:I2C/SPI,用于配置寄存器
- 音频接口:I2S/TDM,用于传输音频数据
核心观点:Codec芯片不是简单的"模拟转数字",它是一个完整的音频处理子系统。我调试过的Codec芯片,有的内部有十几个数字滤波器,还有的集成了硬件AAC编码器。
下面这张图展示了Codec芯片在音频系统中的位置和作用:
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芯片内部的数据流是怎么走的。