如何使用MATLAB对S参数进行后处理
作者 : 赵晨星、MathWorks
本文将通过6个案例来说明如何使用MATLAB对S参数进行后处理。
1. 读写 Touchstone格式文件及矩阵转换
S参数有VNA测量得到的,也有仿真得到的,但是都基本遵循了Touchstone的文件规范。对于标准的Touchstone文件,MATLAB可以通过sparameters函数和rfwrite函数进行读写。例如,对于一个名为“default.s2p"的S参数,将它读入后分别显示S参数的频率响应和圆图曲线。并且随后我们使用原S参数文件的所有数据和频点导出一个新的S2P文件并且重命名。
S50 = sparameters('default.s2p'); rfplot(S50) circuitdata=nport('default.s2p') %将该S参数变成一个2端口元件 smithplot(circuitdata) data = S50.Parameters; freq = S50.Frequencies; rfwrite(data, freq, 'defaultnew.s2p') %利用原S参数数据和频率点,写出一个新的Touchstone格式的S2P文件
S参数的矩阵变换也很常见,Y,T及Z矩阵等形式都是可以直接用MATLAB相关函数进行变换的,还是之前的那个S参数,如果我们想得到它的Y矩阵,那么如下一行命令就可以了:
y_params=s2y(data,50)
2. 单端S参数和差分S参数
我们拿如图所示的一对高速背板的差分线S参数为例,已经测得其单端S4P文件,利用下述代码就可以得到差分S参数了。
filename = 'default.s4p'; backplane = sparameters(filename); %读入S4P文件 data = backplane.Parameters; %S矩阵数据读取定义 freq = backplane.Frequencies; %频点读取定义 z0 = backplane.Impedance; %特征阻抗读取定义 diffdata = s2sdd(data); %使用s2sdd函数提取差分S参数 diffz0 = 2*z0;
该s2sdd函数将端口1和3设定为差分端口1,把端口2和4定义为差分端口2.
diffsparams = sparameters(diffdata,freq,diffz0)
rfwrite(diffdata, freq, 'diffspara.s2p'). %写出新的S2P文件
当然,如果需要混合模和共模的S参数的话,同样有s2scd,s2sdc,s2scc这些对应的函数供您选择。如果您想从一个多端口的单端S参数中提取差分S参数的话,结合snp2smp这个函数,也同样可以实现。比如想从S16P中提取某一对差分对的差分参数,可以如下操作:

filename = 'default.s16p'; backplane = sparameters(filename) freq = backplane.Frequencies; n2m = [1 16 2 15]; %差分端口设定 z0 = backplane.Impedance; first4portdata = snp2smp(backplane.Parameters,z0,n2m,z0); first4portsparams = sparameters(first4portdata,freq,z0) diffdata = s2sdd(first4portdata) %提取这一对的差分S参数 rfwrite(diffdata, freq, 'diffspara.s2p') %导出新的S参数
MATLAB也提供了s_params = smm2s(s_dd,s_dc,s_cd,s_cc)这个函数可以帮助您从差分,共模及混合模S参数再转回到单端的S参数。
3. Rational Fit和无源性
在信号完整性领域我们经常会用到rational fit和无源性的问题,下述代码中对一个两端口S参数先做rational fit,然后检查拟合数据的无源性并画出相应频率点上该矩阵的特征值曲线,如果发现有违背无源性的点,可以使用makepassive进行修正。
S = sparameters('passive.s2p'); %读入S参数 fit = rationalfit(S); %对S参数进行拟合 figure passivity(fit) %绘制拟合结果的特征值曲线 pfit = makepassive(fit,S) %修正无源性 figure passivity(pfit) %绘制修正后的特征值曲线
进行过修正的S参数可以被导出,这样就可以将这个S参数用在其他的仿真链路中了。对于因果性和互易性的判断,目前MATLAB没有专门的函数进行直接调用,大家可以使用MATLAB的矩阵运算相关函数进行代码的编写,或者去MATLAB Community中去找到MATLAB爱好者开发并共享出来的代码来进行调用。
4. Cascading
将多个S参数进行级联,最快捷的方法是在Simulink中使用RF Blockset里面的S-Parameter这个模块进行级联了,当然在MATLAB中您也可以实现S参数的级联,以两个2端口网络为例:
ckt1 = read(rfckt.amplifier,'default.s2p'); %读入第一个S参数,并将其设置为电路1 ckt2 = read(rfckt.passive,'passive.s2p'); %读入第二个S参数,并将其设置为电路2 freq = [2e9 2.1e9]; %由于两个S参数频率不同,设置统一频率范围 analyze(ckt1,freq); %对电路1进行扫频分析 analyze(ckt2,freq); %对电路2进行扫频分析 sparams_2p_1 = ckt1.AnalyzedResult.S_Parameters;%将进行统一扫频后的电路1的S参数定义为部件1 sparams_2p_2 = ckt2.AnalyzedResult.S_Parameters; %将进行统一扫频后的电路2的S参数定义为部件2 sparams_cascaded_2p = cascadesparams(sparams_2p_1,sparams_2p_2) %使用cascadesparams函数将部件1和部件2进行级联 S=sparameters(sparams_cascaded_2p,freq) %级联后的S参数生成 rfplot(S)%绘制S参数曲线
相对来说用代码实现的方法是稍显复杂的,需要将S参数读入以后使用cascadesparams这个函数来进行级联,然后再生成新的S参数。同样用这个函数也可以进行多个端口的S参数级联,具体的实例可以通过查看cascadesparams这个函数的帮助文档。
5. De-embedding
去嵌是S参数后处理另一个常用的场景,比如从测量得S参数中去除夹具的S参数等情形都会用到。RF Toolbox中有一个名为“De-Embedding S-Parameters”的示例,我们就以这个示例来说明MATLAB的去嵌功能。本例中的原始S参数数据是一个双极型晶体管及键合金丝加键合区的S参数,为了得到BJT的S参数,先对金丝和焊盘分别进行等效。将键合线等效为1 nH串联电感,键合区等效为一个到地的100 fF并联电容, 然后我们将从原始的S参数中去嵌得到BJT(DUT)的S参数。
S_measuredBJT = sparameters('samplebjt2.s2p'); %读入原始的S2P文件 freq = S_measuredBJT.Frequencies; %定义扫频点为原始S参数相同的频点 leftpad = circuit('left'); %将左边的等效电路部分设置为电路left add(leftpad,[1 2],inductor(1e-9)) %在left这个电路中添加串联电感并定义节点 add(leftpad,[2 3],capacitor(100e-15)) %在left这个电路中添加并联电容并定义节点 setports(leftpad,[1 3],[2 3]) %根据相应的节点设置端口 S_leftpad = sparameters(leftpad,freq); %得到左边等效电路的S参数 rightpad = circuit('right'); %将右边的等效电路部分设置为电路right add(rightpad,[1 3],capacitor(100e-15)) %在right这个电路中添加并联电容并定义节点 add(rightpad,[1 2],inductor(1e-9)) %在right这个电路中添加串联电感并定义节点 setports(rightpad,[1 3],[2 3]) %根据相应的节点设置端口 S_rightpad = sparameters(rightpad,freq); %得到右边等效电路的S参数 S_DUT = deembedsparams(S_measuredBJT,S_leftpad,S_rightpad); %使用deembedsparams函数进行去嵌,函数约束项按左右顺序 h1 = rfplot(S_measuredBJT,2,1,'-r'); h2 = rfplot(S_DUT,2,1); legend([h1,h2],{'Measured S_{21}','De-Embedded S_{21}'}) legend show
6. TDR
前面我们都在讨论S参数的频域相关操作,对于信号完整性这样的应用场景,我们常会关注时域特性比如TDR,TDT等等。接着前面那个将单端S参数转换为差分S参数的例子,我们来看看在MATLAB中如何计算TDR和TDT的。
单端S参数转成差分S参数代码部分,前面已经有解析
filename = 'default.s4p'; backplane = sparameters(filename); data = backplane.Parameters; freq = backplane.Frequencies; z0 = backplane.Impedance; diffdata = s2sdd(data); diffsparams = sparameters(diffdata,freq,2*z0); TDR计算部分 s11 = rfparam(diffsparams,1,1); %从上述得到的差分S参数中提取S11 Vin = 1; %设置输入阶跃信号激励的电压 tdrfreqdata = Vin*(s11+1)/2; %由S11计算前向TDR tdrfit = rationalfit(freq,tdrfreqdata,'NPoles'%将频域数据进行rational拟合 Ts = 5e-12; % 设置采样时间Ts N = 5000; % 设置采样个数 Trise = 5e-11; %设置阶跃信号的上升时间 [Vtdr,tdrT] = stepresp(tdrfit,Ts,N,Trise); %使用stepresp函数得到阶跃响应 figure %数据显示部分 plot(tdrT*1e9,Vtdr,'r','LineWidth',2) ylabel('Differential TDR (V)') xlabel('Time (ns)') legend('Calculated TDR') ylim([0.46 0.55]) TDT计算部分 delayfactor = 0.98; %设定延时 s21 = rfparam(diffsparams,2,1); %从上述得到的差分S参数中提取S21 tdtfreqdata = Vin*s21/2; %由S21计算前向TDT tdtfit = rationalfit(freq,tdtfreqdata,'DelayFactor',delayfactor); %将频域数据进行rational拟合 Ts = 5e-12; %设置采样时间Ts N = 5000; %设置采样个数 Trise = 5e-11; %设置阶跃信号的上升时间 [tdt,tdtT] = stepresp(tdtfit,Ts,N,Trise);%用stepresp函数得到阶跃响应 Figure %数据显示部分 plot(tdtT(1:N)*1e9,tdt(1:N),'r','LineWidth',2) ylabel('Differential TDT (V)') xlabel('Time (ns)') legend('Calculated TDT','Location','best')
通过上述代码我们可以看到,首先通过S参数计算得到前向反射电压和输出电压可以得到频域数据,然后分别拟合出它们的rational model,再使用一个阶跃信号去激励这个rational model就可以得到TDR和TDT了。这种方法得到的TDR的精度,受到rational拟合的tolerance,信号的上升时间等因素的影响较大,大家可自行在此代码基础上进行优化。
结束语
虽然用一个系列三篇文章跟大家介绍了MATLAB and Simulink在射频方向的应用,但其实该系列中涉及到的内容只是MATLAB and Simulink相关功能的冰山一角。我们每年两个版本的更新都会带来很多的新功能,期待和大家一起去发掘MATLAB and Simulink在RF这个领域里的更多应用。
了解更多 (Learn More)
2022 年发布