1. Codec 基础与音频链路
各位好,我是老周。做音频系统调试这些年,我最大的感触就是——Codec 是音频链路里最容易被低估的器件。很多人觉得它就是个 DAC/ADC,焊上去就能出声。但真正出问题的时候,比如底噪、爆音、时钟失锁,你才会发现,不懂 Codec 内部结构,根本无从下手。
这一章,咱们先把地基打牢。我会从芯片内部框图讲起,带你理清模拟域和数字域的边界,再把 I2S/PCM/TDM 这些总线协议掰开揉碎,最后聊聊主时钟和采样率的关系。嗯,这些都是后面排查杂音的“内功”。
1.1 Codec 芯片内部框图
先看一张典型的 Codec 内部结构。我习惯把它分成三大块:数字接口、数字信号处理(DSP)、模拟前端。
核心要点:Codec 的本质是一个“模拟↔数字”的双向桥梁。数字域负责协议解析和滤波,模拟域负责信号调理和转换。
这张图我建议你存下来。每次调试遇到问题,先问自己:问题出在哪个域?是数字接口没通,还是 DSP 滤波参数配错了,或者是模拟前端供电不干净?
1.2 模拟域与数字域的划分
说白了,数字域处理的是 0 和 1,靠时钟同步,抗干扰能力强。模拟域处理的是连续电压/电流,对噪声极其敏感。这两个域在 Codec 内部有清晰的物理边界——通常就是 ADC/DAC 的转换节点。
| 对比项 | 数字域 | 模拟域 |
|---|---|---|
| 信号形式 | 二进制码流 | 连续电压/电流 |
| 时钟依赖 | 强(必须同步) | 弱(但转换需要时钟) |
| 噪声敏感度 | 低(有噪声容限) | 高(微伏级噪声即可闻) |
| 调试手段 | 逻辑分析仪、寄存器回读 | 示波器、频谱分析仪 |
| 典型问题 | 时序违规、位偏移 | 电源纹波、地弹、串扰 |
我的经验:有一次客户反馈耳机有“滋滋”声,我花了三天查数字滤波参数,最后发现是模拟电源上有个 100mV 的开关噪声。从那以后,我排查杂音的第一步永远是——先看模拟电源纹波。
1.3 I2S / PCM / TDM 总线协议
这三个协议是 Codec 和 SoC 之间的“对话语言”。我见过太多工程师把 I2S 和 PCM 搞混,导致音频数据错位。
1.3.1 I2S(Inter-IC Sound)
I2S 是最常见的音频总线。它用三根线:BCLK(位时钟)、LRCLK(帧时钟,也叫 WS)、SD(数据线)。
- BCLK:每个 bit 一个脉冲,频率 = 采样率 × 位深 × 通道数。
- LRCLK:左右声道切换,频率 = 采样率。
- 数据格式:MSB 对齐,LRCLK 低电平传左声道,高电平传右声道。
// I2S 时序示例(48kHz, 16bit, 立体声)
// BCLK = 48k × 16 × 2 = 1.536 MHz
// LRCLK = 48 kHz
// 数据在 BCLK 下降沿变化,上升沿采样
1.3.2 PCM(Pulse Code Modulation)
PCM 和 I2S 很像,但有一个关键区别:PCM 的帧同步信号是一个短脉冲,而不是 I2S 的 50% 占空比方波。PCM 常用于多通道时分复用。
| 特性 | I2S | PCM |
|---|---|---|
| 帧同步信号 | 50% 占空比方波 | 短脉冲(通常 1 BCLK 宽度) |
| 数据对齐 | MSB 对齐,延迟 1 BCLK | MSB 对齐,无延迟 |
| 典型应用 | 立体声音频 | 多通道(如 8 通道麦克风阵列) |
1.3.3 TDM(Time Division Multiplexing)
TDM 本质上是 PCM 的扩展。它在一个帧内塞入多个通道的数据。比如 8 通道 TDM,一个 LRCLK 周期内依次传输 8 个声道的采样值。
⚠ 避坑指南:我曾经在一个项目中,TDM 的 slot 宽度配错了。Codec 配置的是 32-bit slot,但 SoC 发的是 24-bit 数据,导致每个通道都偏移了 8 个 bit。出来的声音就像“机器人说话”。排查了整整两天,最后用逻辑分析仪抓波形才发现。
1.4 主时钟与采样率关系
Codec 需要三个时钟:MCLK(主时钟)、BCLK(位时钟)、LRCLK(帧时钟)。它们之间必须满足严格的倍数关系。
最常见的 MCLK 频率是:
- 256 × fs:比如 48kHz 采样率,MCLK = 12.288 MHz
- 384 × fs:48kHz 时 MCLK = 18.432 MHz
- 512 × fs:48kHz 时 MCLK = 24.576 MHz
为什么会有这些倍数?因为 Codec 内部的 PLL 和 Σ-Δ 调制器需要整数倍时钟来保证性能。你想想看,如果 MCLK 不是 fs 的整数倍,ADC/DAC 的转换精度就会下降,底噪和失真都会恶化。
| 采样率 fs | MCLK (256×fs) | MCLK (384×fs) | MCLK (512×fs) |
|---|---|---|---|
| 8 kHz | 2.048 MHz | 3.072 MHz | 4.096 MHz |
| 16 kHz | 4.096 MHz | 6.144 MHz | 8.192 MHz |
| 44.1 kHz | 11.2896 MHz | 16.9344 MHz | 22.5792 MHz |
| 48 kHz | 12.288 MHz | 18.432 MHz | 24.576 MHz |
| 96 kHz | 24.576 MHz | 36.864 MHz | 49.152 MHz |
调试口诀:MCLK 必须是 fs 的整数倍,BCLK 必须是 MCLK 的整数分频。如果出现杂音,先拿示波器量这三个时钟的频率对不对。
嗯,这里还要提一个容易忽略的点:MCLK 的抖动。有些 SoC 的时钟输出本身就不干净,或者 PCB 走线太长导致信号质量下降。我遇到过一例,MCLK 上叠加了 200mV 的谐波,结果 DAC 输出信噪比直接掉了 15dB。解决办法很简单——在 MCLK 引脚附近加一个 22pF 的电容到地,把高频噪声滤掉。