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值的计算步骤如下:
- 确定TMDS时钟频率(从EDID或寄存器读取)
- 确定音频采样率(32kHz、44.1kHz、48kHz等)
- 查HDMI规范表,找到对应的N值
- 计算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时钟线和音频时钟线走得太近,串扰导致抖动增大。后来把两条线隔开,加了个地线隔离,抖动立刻降下来了。
怎么测量音频时钟抖动?我推荐两种方法:
- 示波器法:用高精度示波器(至少1GHz带宽)测量时钟边沿的周期抖动
- 软件法:通过HDMI接收端的寄存器读取时钟恢复状态,有些芯片会报告抖动估算值
降低抖动的方法,我总结了几条:
- 使用低噪声的PLL芯片,比如TI的LMK系列
- 在PCB上给时钟线做包地处理
- 电源加LC滤波,尤其是给PLL供电的引脚
- 软件上可以调整N值,让CTS更接近整数,减少PLL的锁定误差
嗯,最后说一句。时钟恢复这件事,硬件和软件要配合好。硬件负责提供干净的时钟源,软件负责算对CTS/N值。哪边出问题,音频都会翻车。
下一章咱们讲音频数据包的打包和解包,那又是另一个坑了。