CST中S参数读取

文摘   2024-09-07 01:41   丹麦  

如果要读取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以展示所有选中的数据曲线%这段代码将忽略导出文件中,除了第一列频率,第二列实部和第三列虚部以外的所有内容。%这段代码以"#"为分割符,将整个文件切割,并对每个切割部分进行读取。%版本:V1clcclearformat 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 endend
% 关闭文件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参数顺序存储了。

电磁小技
微波电磁技术中,富有乐趣的小技巧。