2. S参数的测量与提取方法:VNA原理、校准、去嵌入

做通道仿真这么多年,我始终觉得一句话特别在理——"测不准,什么都白搭"。S参数是我们分析通道的"原材料",原料要是掺了杂质,后面均衡算法再花哨也是白费功夫。这一章我们就来聊聊S参数到底是怎么测出来的,以及怎么确保测出来的数据是可信的。

说白了,S参数的测量就三步:用VNA测原始数据 → 校准消除系统误差 → 去嵌入剥离夹具效应。下面这张图一目了然:

S参数测量与提取完整流程 VNA测量系统 信号源 + 接收机 + S参数测试集 原始S参数(含系统误差) 方向性 / 源匹配 / 负载匹配 / 跟踪 / 隔离 校准(SOLT / TRL) 将参考面移至DUT端口 → 误差项移除 去嵌入(2x-Thru / 自动) 剥离夹具 / 探针 / 走线寄生效应 纯净DUT S参数 测量关键指标 • 频率范围:DC ~ 67GHz+ • IF带宽:1kHz ~ 10MHz • 动态范围:>100dB • 迹线噪声:<0.01dB rms • 校准残余误差:<-40dB

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。原理很简单:

  1. 先做一个直通结构(Thru),它的走线和夹具完全一样,只是把DUT短路掉(直通)。
  2. 测出这个直通结构的S参数,它代表夹具本身的特性。
  3. 假设夹具是对称的,将直通S参数从数学上"开方",得到单边夹具的特性。
  4. 从总测量结果中扣除夹具的影响,得到纯净的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参数才能真实反映通道的特性。后续做均衡设计和通道仿真时,数据才靠得住。