2. S参数的测量与提取方法:VNA原理、校准、去嵌入
做通道仿真这么多年,我始终觉得一句话特别在理——"测不准,什么都白搭"。S参数是我们分析通道的"原材料",原料要是掺了杂质,后面均衡算法再花哨也是白费功夫。这一章我们就来聊聊S参数到底是怎么测出来的,以及怎么确保测出来的数据是可信的。
说白了,S参数的测量就三步:用VNA测原始数据 → 校准消除系统误差 → 去嵌入剥离夹具效应。下面这张图一目了然:
2.1 VNA到底怎么测出S参数的?
矢量网络分析仪,简称VNA,是测量S参数的专用工具。它内部其实就三样东西:一个信号源、一组接收机、还有定向耦合器组成的S参数测试集。
原理并不复杂。信号源发射一个已知幅度和相位的正弦波,入射到DUT上。定向耦合器把入射波和反射波分开,接收机分别测出它们的幅度和相位。然后VNA算一下反射波与入射波的比值,就是S11或S22;再测测传输端的输出波与入射波的比值,就是S21或S12。
举个例子,测一条微带线的插损(S21)——VNA从端口1打一个信号进去,在端口2接收。接收机比较两个信号的幅度差和相位差,直接读出S21的dB值和相位角。就这么简单。
核心要点:VNA测的是比值,不是值。它测的是b波(反射/传输)与a波(入射)的复比值。正因为是比值测量,VNA对信号源功率的精度并不敏感,但对接收机的线性度和动态范围要求极高。
我自己做SI这么多年,VNA可以说是最趁手的工具之一。但很多人容易忽略一个细节——VNA测的是频域数据,一次扫频几百到几万个频点,每个频点都要等接收机稳定下来再读数。IF带宽设得太宽,噪底高;设得太窄,扫得慢。我个人习惯在保证动态范围的前提下,把IF带宽放到1~3kHz,既快又准。
2.2 校准——没有这一步,数据就是废的
VNA直接测出来的数据,其实是有"水份"的。仪器内部的定向耦合器方向性有限,接头会有反射,电缆会带来幅度和相位误差……这些系统误差如果不消除,测出来的S参数跟真实的差了十万八千里。
校准的本质,就是通过测量已知标准件,把系统误差项提取出来,然后在数学上把它们扣除掉。常用的校准方法有两种:
| 对比项 | SOLT校准 | TRL校准 |
|---|---|---|
| 所需标准件 | 短路器、开路器、负载、直通 | 直通、反射器、传输线 |
| 适用频段 | DC ~ 毫米波 | 高频(尤其>10GHz)更优 |
| 校准精度 | 一般(依赖标准件质量) | 更高(对标准件要求低) |
| 操作复杂度 | 简单,适合新手 | 稍复杂,需要传输线结构 |
| 适用场景 | 同轴连接器、波导 | 片上测量、共面波导 |
我的建议:新手先用SOLT校准上手,步骤少,容易理解。等做到高频或片上测量时,再换成TRL。我建议在公司里备一套高质量的校准件,这东西别省,便宜货会让你后面花10倍的时间去排查问题。
我记得有一次在客户现场,对方说测出来的插损在20GHz以后振荡得很厉害。我过去一看,校准件上有个小小的划痕……换了一套校准件重新校准,数据马上就干净了。校准件就是VNA的"标尺",标尺不准,量什么都白扯。
校准之后,VNA的参考面就移到了DUT的端口处。但这时候测出来的S参数,仍然包含了从参考面到DUT之间那段走线或夹具的影响。接下来就得靠去嵌入来解决了。
2.3 去嵌入——把夹具的"外衣"脱掉
在实际测试中,DUT很少能直接连到VNA的端口上。中间往往有一堆东西:测试夹具、探针、PCB走线、连接器……这些"寄生"结构会引入额外的插损、反射和相位偏移。去嵌入的目的,就是把这些寄生效应从测量结果中剥离掉,只留下DUT本身的S参数。
最常用的去嵌入方法是2x-Thru。原理很简单:
- 先做一个直通结构(Thru),它的走线和夹具完全一样,只是把DUT短路掉(直通)。
- 测出这个直通结构的S参数,它代表夹具本身的特性。
- 假设夹具是对称的,将直通S参数从数学上"开方",得到单边夹具的特性。
- 从总测量结果中扣除夹具的影响,得到纯净的DUT S参数。
下面这个Python代码展示了2x-Thru去嵌入的核心逻辑:
import numpy as np
def s2t(s):
"""将2x2 S参数矩阵转换为T参数"""
t = np.zeros_like(s, dtype=complex)
t[0,0] = -np.linalg.det(s) / s[1,0]
t[0,1] = s[0,0] / s[1,0]
t[1,0] = -s[1,1] / s[1,0]
t[1,1] = 1 / s[1,0]
return t
def t2s(t):
"""将T参数转回S参数"""
s = np.zeros_like(t, dtype=complex)
s[0,0] = t[0,1] / t[1,1]
s[0,1] = np.linalg.det(t) / t[1,1]
s[1,0] = 1 / t[1,1]
s[1,1] = -t[1,0] / t[1,1]
return s
def deembed_2x_thru(s_meas, s_thru):
"""
2x-Thru去嵌入
s_meas: 测得的DUT+夹具 S参数 (2x2)
s_thru: 直通结构的 S参数 (2x2)
"""
t_meas = s2t(s_meas)
t_thru = s2t(s_thru)
# 假设夹具对称,提取半边夹具
t_fixture = np.linalg.matrix_power(t_thru, 0.5)
t_fixture_inv = np.linalg.inv(t_fixture)
# 去嵌入:T_dut = inv(T_fixture) @ T_meas @ inv(T_fixture)
t_dut = t_fixture_inv @ t_meas @ t_fixture_inv
return t2s(t_dut)
# 使用示例(数据为示意)
s_meas = np.array([[[0.1+0.1j, 0.8-0.2j],
[0.8-0.2j, 0.1+0.1j]]])
s_thru = np.array([[[0.02+0.01j, 0.95-0.05j],
[0.95-0.05j, 0.02+0.01j]]])
s_dut = deembed_2x_thru(s_meas, s_thru)
print("去嵌入后的S21:", s_dut[0,1])
⚠️ 曾经踩过的坑:我在一个40Gbps背板项目中,用了2x-Thru去嵌入,结果S21高频段出现了异常谐振。查了半天,发现是直通结构的走线阻抗跟DUT的参考阻抗没对齐——直通结构的特征阻抗是48Ω,而DUT参考阻抗是50Ω。去嵌入时两套阻抗打架,高频段就"共振"了。后来我把直通结构的阻抗校准到50Ω,问题立刻消失。切记:直通结构必须与DUT阻抗一致!
除了2x-Thru,还有自动去嵌入算法。这类方法不需要显式的直通结构,而是通过测量多个不同长度的走线结构,用优化算法自动提取夹具参数。优点是省去了设计直通结构的麻烦,缺点是需要更多的测量次数和更复杂的数学处理。
| 去嵌入方法 | 优点 | 缺点 | 适用场景 |
|---|---|---|---|
| 2x-Thru | 原理直观,操作简单 | 需要专用直通结构,假设对称 | PCB测试、封装测试 |
| 自动去嵌入 | 无需直通结构,灵活 | 算法复杂,测量次数多 | 片上测量、非对称夹具 |
| TRL去嵌入 | 精度最高,不依赖标准件 | 结构设计要求高 | 高频片上去嵌入 |
2.4 过来人给你几个建议
说了这么多原理和方法,最后分享几个实操中容易忽略的点:
- 校准前先热机。 VNA开机后至少要等30分钟,等内部温度稳定了再校准。我曾经因为着急,开机10分钟就校准,结果中午温度升高后,数据全飘了。
- 校准件要定期检验。 校准件用久了,接头会有磨损、氧化。我建议每半年用"校准件验证套件"检查一次,发现问题及时更换。
- 去嵌入之前先看时域。 我个人习惯在做去嵌入之前,先看TDR曲线。如果夹具上有阻抗不连续点,先去解决物理问题,别指望算法能"救"回来。
- 交叉验证 如果用2x-Thru去嵌入,可以做一个"直通验证"——测一条已知的直通线,去嵌入后理想S21应该是0dB,实际偏差在±0.05dB以内算合格。
一个小技巧:校准完成后,别急着测DUT。先测一个"验证件"(比如一个已知的衰减器或直通),看看测出来的结果跟标称值差多少。这一步花不了2分钟,但能帮你发现校准是否有效。我每次都会做这个" sanity check ",已经帮我挡了好几次数据灾难。
掌握这些测量和提取方法,你测出来的S参数才能真实反映通道的特性。后续做均衡设计和通道仿真时,数据才靠得住。