在射频测试应用中,在某些场景下,需要读取矢网生成的S2P文件进行指标稳定统计。本文以射频开关为例,对多次测试的射频通道S2P文件进行处理,获取多次测量的每个频点的最大值和最小值,进行差值运算后,画图显示稳定性结果。
clc;close all;clear all;
s11_checked = 1; %plot s11 vswr
s12_checked = 1; %plot s12 mlog
s21_checked = 1; %plot s21 mlog
s22_checked = 1; %plot s22 vswr
vswr_threshold = 2; %vswr threshold
mlog_threshold = -3; %mlog threshold
directoryName = uigetdir('*.*','选择文件夹');
suffixName = '*.s2p'; %文件名后缀
fullFiles = dir([directoryName,'\',suffixName]); %获取所有文件
fileNames = {fullFiles.name}; %获取所有文件名
首先是加载的需要处理的文件。这里我们对S11、S12、S21和S22都进行处理。
循环打开每个S2P文件,将第1个S2P的S11计算的驻波值和第2个S2P的S11计算的驻波值进行求差,获取第一次切换的偏差。依次类推,计算完所有的偏差,并每个频点偏差的最大值和最小值保存在变量里。
最后计算每个频点的偏差的最大值和最小值之差,即时该参数的稳定度,将结果画图显示。
s11_err_matrix = []; %creat a empty matrix to save fault information
s12_err_matrix = []; %creat a empty matrix to save fault information
s21_err_matrix = []; %creat a empty matrix to save fault information
s22_err_matrix = []; %creat a empty matrix to save fault information
if(s11_checked == 1)
figure;
fileFullName = [directoryName,'\',cell2mat(fileNames(1,1))]; %当前文件名
result = sparameters(fileFullName);
s11_3 = result.Parameters(1,1,:); %3-dimensional
s11 = reshape(s11_3,1,size(s11_3,3)); %2-dimensional
s11_vswr_first = (1+abs(s11))./(1-abs(s11)); %calculate s11 vswr
for i=2:size(fullFiles,1)
fileFullName = [directoryName,'\',cell2mat(fileNames(1,i))]; %µ±Ç°ÎļþÃû
result = sparameters(fileFullName);
s11_3 = result.Parameters(1,1,:); %3-dimensional
s11 = reshape(s11_3,1,size(s11_3,3)); %2-dimensional
s11_vswr_err = (1+abs(s11))./(1-abs(s11)) - s11_vswr_first; %calculate s11 vswr
if(i == 2) %2~N的最大、最小值
max_err_s11_vswr = s11_vswr_err;
min_err_s11_vswr = s11_vswr_err;
else
% 第一次以后的差值和第一次的比较
for k=1:size(s11_vswr_err,2)
if(s11_vswr_err(1,k) > max_err_s11_vswr(1,k))
max_err_s11_vswr(1,k) = s11_vswr_err(1,k);
else
max_err_s11_vswr(1,k) = max_err_s11_vswr(1,k);
end
if(s11_vswr_err(1,k) > min_err_s11_vswr(1,k))
min_err_s11_vswr(1,k) = min_err_s11_vswr(1,k);
else
min_err_s11_vswr(1,k) = s11_vswr_err(1,k);
end
end
end
end
%计算插值
err_vswr = max_err_s11_vswr - min_err_s11_vswr;
%画图
plot(result.Frequencies/1000000000,err_vswr,'color',[rand rand rand]); %plot figure
xlabel('GHz')
title('S11-VSWR');
end
同理,再计算S21.S22的插损、相位和驻波的偏差。
if(s12_checked == 1)
figure;
fileFullName = [directoryName,'\',cell2mat(fileNames(1,1))];
result = sparameters(fileFullName);
s12_3 = result.Parameters(1,2,:); %3-dimensional
s12 = reshape(s12_3,1,size(s12_3,3));
s12_mlog_first = 20*log10(abs(s12)); %calculate s12 mlog
for i=2:size(fullFiles,1)
fileFullName = [directoryName,'\',cell2mat(fileNames(1,i))];
result = sparameters(fileFullName);
s12_3 = result.Parameters(1,2,:); %3-dimensional
s12 = reshape(s12_3,1,size(s12_3,3));
s12_mlog_err = 20*log10(abs(s12)) - s12_mlog_first; %calculate s12 mlog
if(i == 2)
max_err_s12_mlog = s12_mlog_err;
min_err_s12_mlog = s12_mlog_err;
else
for k=1:size(s12_mlog_err,2)
if(s12_mlog_err(1,k) > max_err_s12_mlog(1,k))
max_err_s12_mlog(1,k) = s12_mlog_err(1,k);
else
max_err_s12_mlog(1,k) = max_err_s12_mlog(1,k);
end
if(s12_mlog_err(1,k) > min_err_s12_mlog(1,k))
min_err_s12_mlog(1,k) = min_err_s12_mlog(1,k);
else
min_err_s12_mlog(1,k) = s12_mlog_err(1,k);
end
end
end
end
err_mlog = max_err_s12_mlog - min_err_s12_mlog;
plot(result.Frequencies/1000000000,err_mlog,'color',[rand rand rand]); %plot figure
xlabel('GHz');
ylabel('dB');
title('S12-MLOG');
end
% S21 插损稳定性
if(s21_checked == 1)
figure;
fileFullName = [directoryName,'\',cell2mat(fileNames(1,1))];
result = sparameters(fileFullName);
s21_3 = result.Parameters(2,1,:); %3-dimensional
s21 = reshape(s21_3,1,size(s21_3,3));
s21_mlog_first = 20*log10(abs(s21)); %calculate s12 mlog
for i=2:size(fullFiles,1)
fileFullName = [directoryName,'\',cell2mat(fileNames(1,i))];
result = sparameters(fileFullName);
s21_3 = result.Parameters(2,1,:); %3-dimensional
s21 = reshape(s21_3,1,size(s21_3,3));
s21_mlog_err = 20*log10(abs(s21))-s21_mlog_first; %calculate s12 mlog
if(i == 2)
max_err_s21_mlog = s21_mlog_err;
min_err_s21_mlog = s21_mlog_err;
else
for k=1:size(s21_mlog_err,2)
if(s21_mlog_err(1,k) > max_err_s21_mlog(1,k))
max_err_s21_mlog(1,k) = s21_mlog_err(1,k);
else
max_err_s21_mlog(1,k) = max_err_s21_mlog(1,k);
end
if(s21_mlog_err(1,k) > min_err_s21_mlog(1,k))
min_err_s21_mlog(1,k) = min_err_s21_mlog(1,k);
else
min_err_s21_mlog(1,k) = s21_mlog_err(1,k);
end
end
end
end
err_mlog = max_err_s21_mlog - min_err_s21_mlog;
plot(result.Frequencies/1000000000,err_mlog,'color',[rand rand rand]); %plot figure
xlabel('GHz');
ylabel('dB');
title('S21-MLOG');
end
if(s21_checked == 1)
figure;
fileFullName = [directoryName,'\',cell2mat(fileNames(1,1))]; %µ±Ç°ÎļþÃû
result = sparameters(fileFullName);
s21_3 = result.Parameters(2,1,:); %3-dimensional
s21 = reshape(s21_3,1,size(s21_3,3));
s21_phase_first = angle(s21); %calculate s12 mlog
for i=2:size(fullFiles,1)
fileFullName = [directoryName,'\',cell2mat(fileNames(1,i))];
result = sparameters(fileFullName);
s21_3 = result.Parameters(2,1,:); %3-dimensional
s21 = reshape(s21_3,1,size(s21_3,3));
s21_phase_err = (angle(s21)-s21_phase_first).*180./pi;
for j = 1:size(s21_phase_err,2)
if(s21_phase_err(1,j)>180)
s21_phase_err(1,j) = s21_phase_err(1,j) - 360;
elseif(s21_phase_err(1,i)<-180)
s21_phase_err(1,j) = s21_phase_err(1,j) + 360;
else
s21_phase_err(1,j) = s21_phase_err(1,j);
end
end
if(i == 2) %»ñÈ¡×îСֵ
max_err_s21_phase = s21_phase_err;
min_err_s21_phase = s21_phase_err;
else
% µÚÒ»´ÎÒÔºóµÄ²îÖµºÍµÚÒ»´ÎµÄ±È½Ï
for k=1:size(s21_phase_err,2)
if(s21_phase_err(1,k) > max_err_s21_phase(1,k))
max_err_s21_phase(1,k) = s21_phase_err(1,k);
else
max_err_s21_phase(1,k) = max_err_s21_phase(1,k);
end
if(s21_phase_err(1,k) > min_err_s21_phase(1,k))
min_err_s21_phase(1,k) = min_err_s21_phase(1,k);
else
min_err_s21_phase(1,k) = s21_phase_err(1,k);
end
end
end
end
err_phase = max_err_s21_phase - min_err_s21_phase;
for j = 1:size(err_phase,2)
if(err_phase(1,j)>180)
err_phase(1,j) = err_phase(1,j) - 360;
elseif(err_phase(1,i)<-180)
err_phase(1,j) = err_phase(1,j) + 360;
else
err_phase(1,j) = err_phase(1,j);
end
end
plot(result.Frequencies/1000000000,err_phase,'color',[rand rand rand]); %plot figure
xlabel('GHz')
title('S21-Phase');
end
if(s22_checked == 1)
figure;
fileFullName = [directoryName,'\',cell2mat(fileNames(1,1))];
result = sparameters(fileFullName);
s22_3 = result.Parameters(2,2,:); %3-dimensional
s22 = reshape(s22_3,1,size(s22_3,3)); %2-dimensional
s22_vswr_first = (1+abs(s22))./(1-abs(s22)); %calculate s11 vswr
for i=2:size(fullFiles,1)
fileFullName = [directoryName,'\',cell2mat(fileNames(1,i))];
result = sparameters(fileFullName);
s22_3 = result.Parameters(2,2,:); %3-dimensional
s22 = reshape(s22_3,1,size(s22_3,3)); %2-dimensional
s22_vswr_err = (1+abs(s22))./(1-abs(s22)) - s22_vswr_first; %calculate s11 vswr
if(i == 2)
max_err_s22_vswr = s22_vswr_err;
min_err_s22_vswr = s22_vswr_err;
else
for k=1:size(s22_vswr_err,2)
if(s22_vswr_err(1,k) > max_err_s22_vswr(1,k))
max_err_s22_vswr(1,k) = s22_vswr_err(1,k);
else
max_err_s22_vswr(1,k) = max_err_s22_vswr(1,k);
end
if(s22_vswr_err(1,k) > min_err_s22_vswr(1,k))
min_err_s22_vswr(1,k) = min_err_s22_vswr(1,k);
else
min_err_s22_vswr(1,k) = s22_vswr_err(1,k);
end
end
end
end
err_vswr = max_err_s22_vswr - min_err_s22_vswr;
plot(result.Frequencies/1000000000,err_vswr,'color',[rand rand rand]); %plot figure
xlabel('GHz')
title('S22-VSWR');
end
运行结果:
1)选择S2P文件所在的文件夹;
2)稳定性结果: