如果要读取CST中的S参数,一个简单的方法是选中1D reasult下的S-parameter,然后点击Post-Processing选项卡,在Export下选中TOUCHSTONE。这样就导出了一个SNP文件。这个文件无论是ADS还是matlab都可以读取。
这里面有一些选项,可以自己选选看,会发生什么。
对应matlab,其数据读取也很简单。先是加载这个对象,然后导出data,就可以。
S = sparameters('S.s4p');
data = S.Parameters;
frequency = S.Frequencies;
这样的data数据是个三维矩阵。前两维是S参数的矩阵,第三维是频率。
还有一种方法,是在导出的时候,选择ACSII,也就是导出txt文档。这个情况下,数据会稍微难读,因为它的数据是以“#”号分割,顺序排列的。好处是,你可以在1Dresults界面下,选择你要导出的数据。更灵活一点。
这种情况下,批量读取的代码就稍微复杂点。我和chatgpt拉扯了一通。
%功能说明:这段代码读取由CST的S参数导出文件,结果为complexMatrix
%具体为1D数据界面下展示,并由Post-Processing工具栏下的Export导出为ASCII(txt)格式的数据
%在1D数据界面下需要取消No.of Curves以展示所有选中的数据曲线
%这段代码将忽略导出文件中,除了第一列频率,第二列实部和第三列虚部以外的所有内容。
%这段代码以"#"为分割符,将整个文件切割,并对每个切割部分进行读取。
%版本:V1
clc
clear
format long g
% 获取S参数文件
filename = 'S1.txt';
% 打开文件
fid = fopen(filename, 'r');
% 使用动态数据结构来存储复数和频率
complexCell = {}; % 使用 cell 来动态存储每个参数的复数数据
frequencyVector = []; % 存储频率数据
% 初始化临时变量
currentParamIndex = 0;
% 逐行读取数据
while ~feof(fid)
line = fgetl(fid); % 读取一行
if contains(line, 'Frequency') && contains(line, '[Re]')
currentParamIndex = currentParamIndex + 1; % 更新参数索引
complexCell{currentParamIndex} = [];
elseif ~startsWith(line, '#') && ~isempty(line)
data = str2double(strsplit(line, '\t')); % 分割行数据
frequency = data(1);
realPart = data(2);
imagPart = data(3);
complexCell{currentParamIndex}(end+1) = realPart + 1i * imagPart; % 存储复数数据
if currentParamIndex == 1 % 只在处理第一组数据时记录频率
frequencyVector(end+1) = frequency;
end
end
end
% 关闭文件
fclose(fid);
% 确定最小的行数(频率点数)
minFreqCount = min(cellfun(@numel, complexCell));
% 根据最小的行数调整频率向量和复数矩阵
frequencyVector = frequencyVector(1:minFreqCount);
complexMatrix = zeros(minFreqCount, numel(complexCell)); % 初始化复数矩阵
% 填充复数矩阵
for k = 1:numel(complexCell)
complexMatrix(:, k) = complexCell{k}(1:minFreqCount);
end
这样会把数据读取进complexMatrix文件,它的第一维随频率变化,第二维就是S参数顺序存储了。