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本身的抖动完全在规格内。

说白了,去嵌的目的就三个:

  1. 还原真实:得到DUT本身的性能,而不是“DUT+夹具”的混合体。
  2. 精准建模:为仿真提供准确的模型,避免把夹具的寄生效应带入系统设计。
  3. 故障定位:快速判断问题是出在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 一个完整的去嵌流程

我在实际项目中,通常按以下步骤操作:

  1. 测量总S参数:把DUT装在夹具上,用VNA测出S_total。
  2. 获取夹具模型:通过TRL校准、仿真或单独测量,得到夹具的S参数(S_fixture_left和S_fixture_right)。
  3. 转换到T域:把S_total、S_fixture_left、S_fixture_right都转换成T参数。
  4. 执行去嵌:T_DUT = T_left^(-1) * T_total * T_right^(-1)。
  5. 转回S域:把T_DUT转换回S_DUT,这就是DUT的真实S参数。

关键点:去嵌的精度,完全取决于夹具模型的准确性。如果夹具模型不准,去嵌后的结果可能比不去嵌还差。我曾经见过有人用仿真模型代替实测夹具参数,结果去嵌后出现了负损耗——这明显是错的。

3.4 知识体系图:去嵌的核心逻辑

下面这张图,是我自己总结的去嵌知识体系。你看一眼,就能明白整个逻辑链条。

去嵌核心知识体系 为什么需要去嵌? 还原DUT真实性能 精准建模与仿真 故障定位与排查 数学基础:T参数与级联 S参数 → T参数转换 矩阵级联与求逆 T参数 → S参数还原 T_DUT = T_left⁻¹ × T_total × T_right⁻¹ ⚠ 夹具模型精度决定去嵌质量

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