3、去嵌原理:什么是去嵌、为什么需要去嵌、去嵌的数学基础(T参数与级联)
3.1 什么是去嵌?说白了就是“剥洋葱”
各位好,我是老张。今天咱们聊聊去嵌。这个词听起来挺玄乎,其实道理很简单。
你想想看,我们做高速互连测试时,手里拿到的S参数,真的是DUT(待测器件)本身的吗?
不是的。你测到的,是DUT加上测试夹具、线缆、连接器、探针……这一大串东西的总和。就像你剥洋葱,外面裹了好几层皮,你真正想看的,是里面那个芯。
去嵌,就是把外面这些“皮”剥掉,还原出DUT的真实特性。
我在项目中遇到过好几次这样的情况:明明DUT设计得不错,但测出来的眼图就是打不开。后来一查,发现是测试夹具的损耗太大,把信号都吃掉了。去嵌之后,DUT本身的性能其实很好。嗯,这个坑我踩过,所以印象特别深。
核心定义:去嵌(De-embedding)是一种数学处理技术,通过已知的夹具或线缆模型,从总测量结果中“扣除”这些寄生效应,还原DUT的真实S参数。
3.2 为什么需要去嵌?—— 不剥皮,你看到的全是假象
我经常跟团队里的年轻人说:不去嵌的测试,等于白测。
为什么?我给你列几个真实场景:
- 场景一:你测一个10Gbps的通道,结果回损超标。你以为是PCB走线有问题,结果去嵌后发现,是SMA连接器的寄生电容在搞鬼。冤枉了PCB,你说亏不亏?
- 场景二:Retimer芯片的评估板上,走线长度可能就有2-3英寸。这2-3英寸的损耗,在28Gbps时可能达到1-2dB。如果不扣掉,你评估出来的芯片性能,其实是“芯片+走线”的混合体。
- 场景三:我曾经帮一个客户做SerDes链路分析。他们测出来的抖动很大,怀疑是电源噪声。我建议先做去嵌,结果发现抖动主要来自测试线缆的串扰。去掉线缆影响后,DUT本身的抖动完全在规格内。
说白了,去嵌的目的就三个:
- 还原真实:得到DUT本身的性能,而不是“DUT+夹具”的混合体。
- 精准建模:为仿真提供准确的模型,避免把夹具的寄生效应带入系统设计。
- 故障定位:快速判断问题是出在DUT上,还是出在测试夹具上。
注意:去嵌不是万能的。如果夹具本身设计很差(比如阻抗不连续、谐振严重),去嵌后的结果可能也不准确。我的建议是:先优化夹具设计,再谈去嵌。
3.3 去嵌的数学基础:T参数与级联
好,现在咱们来点硬核的。去嵌的数学基础,说白了就是T参数和级联。
3.3.1 为什么不用S参数直接做级联?
你可能会问:我们平时用的都是S参数,为什么去嵌要用T参数?
原因很简单:S参数不适合做级联运算。
S参数描述的是端口之间的反射和传输关系。当你把两个二端口网络级联时,S参数的计算公式非常复杂,涉及到矩阵的逆运算。而T参数(传输参数)天生就是为了级联而生的。
我个人习惯把T参数理解为“传递函数”。它直接告诉你:信号从端口1进去,经过网络后,从端口2出来时变成了什么样子。
3.3.2 T参数的定义
对于二端口网络,T参数的定义如下:
[ b1 ] [ T11 T12 ] [ a2 ]
[ a1 ] = [ T21 T22 ] [ b2 ]
其中:
- a1、a2:端口1和端口2的入射波
- b1、b2:端口1和端口2的反射波
你看,T参数把输出端口的波(a2、b2)映射到了输入端口的波(a1、b1)。这种“从左到右”的传递关系,让级联变得非常直观。
3.3.3 S参数与T参数的转换
在实际工作中,我们测到的是S参数,但做去嵌时需要T参数。所以,转换公式必须掌握。
从S参数到T参数的转换公式(假设参考阻抗Z0相同):
T11 = (1 - S22) / S21
T12 = -S11 / S21
T21 = S22 / S21
T22 = (1 - S11) / S21
反过来,从T参数到S参数:
S11 = T12 / T22
S12 = (T11 * T22 - T12 * T21) / T22
S21 = 1 / T22
S22 = -T21 / T22
小技巧:我在写脚本时,通常直接用Python的scikit-rf库来做转换,省得自己手算。但理解原理很重要,万一哪天库用不了,你还能手算。
3.3.4 级联的核心思想
假设我们有三个二端口网络级联:
- 网络A:左侧夹具(T_A)
- 网络B:DUT(T_DUT)
- 网络C:右侧夹具(T_C)
总的T参数就是:
T_total = T_A * T_DUT * T_C
就这么简单。矩阵乘法,从左到右依次乘。
那么,去嵌就是反过来:
T_DUT = T_A^(-1) * T_total * T_C^(-1)
你看,只要我们知道夹具的T参数(T_A和T_C),就能从总测量结果中“扣掉”它们,得到DUT的真实T参数,再转换回S参数。
3.3.5 一个完整的去嵌流程
我在实际项目中,通常按以下步骤操作:
- 测量总S参数:把DUT装在夹具上,用VNA测出S_total。
- 获取夹具模型:通过TRL校准、仿真或单独测量,得到夹具的S参数(S_fixture_left和S_fixture_right)。
- 转换到T域:把S_total、S_fixture_left、S_fixture_right都转换成T参数。
- 执行去嵌:T_DUT = T_left^(-1) * T_total * T_right^(-1)。
- 转回S域:把T_DUT转换回S_DUT,这就是DUT的真实S参数。
关键点:去嵌的精度,完全取决于夹具模型的准确性。如果夹具模型不准,去嵌后的结果可能比不去嵌还差。我曾经见过有人用仿真模型代替实测夹具参数,结果去嵌后出现了负损耗——这明显是错的。
3.4 知识体系图:去嵌的核心逻辑
下面这张图,是我自己总结的去嵌知识体系。你看一眼,就能明白整个逻辑链条。
3.5 一个简单的去嵌示例(Python伪代码)
最后,我给大家一个去嵌的Python伪代码。你在实际项目中可以直接套用这个框架。
import numpy as np
import skrf as rf
# 1. 读取S参数文件
total_net = rf.Network('total.s2p') # 总测量结果
left_fix = rf.Network('left_fixture.s2p') # 左侧夹具
right_fix = rf.Network('right_fixture.s2p')# 右侧夹具
# 2. 转换为T参数
total_t = total_net.t
left_t = left_fix.t
right_t = right_fix.t
# 3. 去嵌:T_DUT = T_left^(-1) * T_total * T_right^(-1)
left_t_inv = np.linalg.inv(left_t)
right_t_inv = np.linalg.inv(right_t)
dut_t = left_t_inv @ total_t @ right_t_inv
# 4. 将T参数转换回S参数
dut_net = rf.Network(s=dut_t, frequency=total_net.frequency)
dut_net.write_touchstone('dut_deembedded.s2p')
print("去嵌完成!结果已保存到 dut_deembedded.s2p")
我的经验:去嵌后的S参数,一定要检查物理合理性。比如S21的幅度不能大于0dB(除非有源器件),S11的相位应该平滑变化。如果出现异常,先检查夹具模型,别急着怀疑算法。
好了,关于去嵌的原理,咱们就聊到这儿。记住一句话:去嵌不是锦上添花,而是高速测试的必修课。 下次你拿到一份测试报告,先问问自己:去嵌了吗?
公众号:蓝海资料掘金营,微信deep3321