3、HDMI音频时钟恢复:TMDS时钟与音频时钟的关系、CTS/N值计算、音频时钟抖动

各位同学,咱们今天聊一个硬核话题——HDMI音频时钟恢复。

说实话,我早年做HDMI驱动时,被这个时钟问题折腾得不轻。画面出来了,声音却断断续续,或者干脆没声。查了半天,发现是时钟恢复没做好。嗯,今天就把这块掰开揉碎了讲清楚。

3.1 TMDS时钟与音频时钟的关系

先问一个问题:HDMI传输视频时,用的是TMDS时钟。那音频时钟从哪来?

答案很简单——音频时钟是从TMDS时钟派生出来的。但怎么派生,这里面有讲究。

HDMI规范里定义了三种音频时钟模式:

  • HDMI 1.3及之前:使用CTS/N值计算,音频时钟 = TMDS时钟 × CTS / (128 × N)
  • HDMI 1.4及之后:增加了HBR(高比特率)模式,N值范围扩大
  • HDMI 2.0:支持32通道音频,时钟精度要求更高

我个人习惯把TMDS时钟比作「母钟」,音频时钟是「子钟」。子钟必须跟母钟保持同步,否则就会出现音频丢帧或爆音。

核心公式:

音频采样率 = TMDS时钟频率 × CTS / (128 × N)

其中CTS是时钟计时值,N是音频时钟恢复分频器值。

举个例子,我调试过一个4K@60Hz的HDMI输出,TMDS时钟是594MHz。如果音频是48kHz采样,那么N值通常取6144,CTS算出来是250000。你算算看:594000000 × 250000 / (128 × 6144) = 48000。正好对上。

3.2 CTS/N值计算

CTS和N值怎么算?很多同学觉得这是硬件的事,软件不用管。错!

我在项目中遇到过,硬件工程师给的N值不对,导致音频时钟偏差了0.1%。人耳对这个偏差非常敏感,听久了会头晕。

CTS/N值的计算步骤如下:

  1. 确定TMDS时钟频率(从EDID或寄存器读取)
  2. 确定音频采样率(32kHz、44.1kHz、48kHz等)
  3. 查HDMI规范表,找到对应的N值
  4. 计算CTS = TMDS时钟 × 128 × N / 音频采样率

这里我贴一张常用的N值表:

音频采样率 N值(HDMI 1.3+) N值(HDMI 2.0)
32 kHz 4096 4096
44.1 kHz 6272 6272
48 kHz 6144 6144
88.2 kHz 12544 12544
96 kHz 12288 12288
176.4 kHz 25088 25088
192 kHz 24576 24576

实战技巧:我建议在驱动初始化时,先读取接收端的EDID,确认它支持哪些采样率。然后根据TMDS时钟动态计算CTS。不要写死CTS值,不同分辨率下TMDS时钟不一样。

代码实现上,Linux内核的drm_hdmi_audio_infoframe结构体里就有CTS和N字段。你写驱动时,要确保这两个值正确填充到音频信息帧中。

/* Linux内核中设置CTS/N的示例 */
struct hdmi_audio_infoframe frame;
hdmi_audio_infoframe_init(&frame);
frame.cts = cts_value;
frame.n = n_value;
/* 然后通过DRM或ALSA接口发送 */

3.3 音频时钟抖动

时钟抖动,说白了就是时钟边沿的不确定性。音频时钟抖动大了,声音会变「毛糙」,高频细节丢失。

为什么会抖动?原因有三:

  • PLL锁相环噪声:从TMDS时钟恢复音频时钟时,PLL的相位噪声会传递
  • 数据包间隔抖动:HDMI音频数据包不是均匀到达的,有间隔变化
  • 电源噪声:这个我深有体会,有一次板子上的DC-DC纹波太大,音频时钟抖动直接超标

我曾经在一个项目里,音频输出总是有「嘶嘶」声。用示波器量音频时钟,发现抖动达到了200ps RMS。而HDMI规范要求音频时钟抖动要小于40ps RMS。差了5倍!

避坑指南:我曾经在调试时忽略了PCB布局对时钟的影响。TMDS时钟线和音频时钟线走得太近,串扰导致抖动增大。后来把两条线隔开,加了个地线隔离,抖动立刻降下来了。

怎么测量音频时钟抖动?我推荐两种方法:

  1. 示波器法:用高精度示波器(至少1GHz带宽)测量时钟边沿的周期抖动
  2. 软件法:通过HDMI接收端的寄存器读取时钟恢复状态,有些芯片会报告抖动估算值

降低抖动的方法,我总结了几条:

  • 使用低噪声的PLL芯片,比如TI的LMK系列
  • 在PCB上给时钟线做包地处理
  • 电源加LC滤波,尤其是给PLL供电的引脚
  • 软件上可以调整N值,让CTS更接近整数,减少PLL的锁定误差

嗯,最后说一句。时钟恢复这件事,硬件和软件要配合好。硬件负责提供干净的时钟源,软件负责算对CTS/N值。哪边出问题,音频都会翻车。

下一章咱们讲音频数据包的打包和解包,那又是另一个坑了。