1. Codec 基础与音频链路

各位好,我是老周。做音频系统调试这些年,我最大的感触就是——Codec 是音频链路里最容易被低估的器件。很多人觉得它就是个 DAC/ADC,焊上去就能出声。但真正出问题的时候,比如底噪、爆音、时钟失锁,你才会发现,不懂 Codec 内部结构,根本无从下手。

这一章,咱们先把地基打牢。我会从芯片内部框图讲起,带你理清模拟域和数字域的边界,再把 I2S/PCM/TDM 这些总线协议掰开揉碎,最后聊聊主时钟和采样率的关系。嗯,这些都是后面排查杂音的“内功”。

1.1 Codec 芯片内部框图

先看一张典型的 Codec 内部结构。我习惯把它分成三大块:数字接口、数字信号处理(DSP)、模拟前端。

核心要点:Codec 的本质是一个“模拟↔数字”的双向桥梁。数字域负责协议解析和滤波,模拟域负责信号调理和转换。

典型 Codec 芯片内部框图 数字接口 I2S / PCM / TDM I²C / SPI 控制 MCLK / BCLK / LRCLK DSP 处理 数字滤波 / EQ 降噪 / AGC 混音 / 增益 模拟前端 ADC / DAC PGA / 运放 耳机功放 / 线路输出 时钟管理 PLL / 分频 / 时钟树 电源管理 LDO / 电荷泵 / 参考电压 ⚠ 调试重点 数字域:协议时序、时钟 模拟域:电源纹波、耦合 模拟 I/O MIC IN / LINE IN / HP OUT

这张图我建议你存下来。每次调试遇到问题,先问自己:问题出在哪个域?是数字接口没通,还是 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 的电容到地,把高频噪声滤掉。