资讯详情

资讯详情

CST方向图数据导出MATLAB重绘:从解析到绘图全攻略

简介面向电磁仿真与天线设计工程师该压缩包集中解决CST方向图数据在MATLAB中难以灵活处理与可视化的问题。在电磁仿真中方向图是评估天线辐射性能的重要依据但CST导出的原始数据往往需要二次加工才能直观呈现。资源将CST Studio Suite导出的方向图数据转换为MATLAB可读格式并提供可直接运行的m脚本与配套工程模型帮助用户完成三维方向图绘制、二维截面对比、方向图复制与复用以及不同设计方案的辐射特性分析。压缩包共11个文件以6张结果对比图片、2个MATLAB程序文件、2个数据说明文本和1个CST工程模型为主整体仅314KB轻量实用。目前已有1303人学习使用。通过配套脚本与模型读者可快速查看方向图对比效果省去数据格式转换的繁琐步骤也可根据自身天线模型修改脚本参数灵活调整视角、颜色与归一化设置适合需要评估天线性能、优化馈电网络或进行仿真实训的工程师与师生。 做天线仿真这么多年我越来越觉得最花时间的不是建模和求解而是仿真之后的数据整理。尤其是方向图CST自带的3D远场结果确实直观可一旦要把几十条曲线拼到同一张图里做对比或者要跟理论公式算出来的结果放在一起验证CST自己的后处理就有点施展不开了。前段时间我在整理一个8单元微带阵列的方向图数据为了在报告里把仿真结果、实测结果和方向图乘积定理算出的理论曲线放到同一张极坐标图里最终选择把CST的方向图数据批量导入MATLAB重画。这中间踩了不少坑今天把这些流程和坑一次性说清楚。这篇文章适用于正在做天线设计、需要整理方向图用于论文或报告的工程师也适合刚接触CST和MATLAB联动、不知道怎么处理远场导出数据的同学。核心就三件事CST端如何规范导出方向图数据、MATLAB端如何正确读取解析、三种常见方向图画法怎么落地。顺便会把复制粘贴、单位换算、角度对齐这些容易翻车的细节单独拎出来讲。1. 方向图数据为什么要从CST搬到MATLAB里重画1.1 CST自带后处理的边界在哪CST的Farfield Result文件夹下能直接看3D方向图、极坐标切片、直角坐标曲线做单一频率、单一视角的展示非常方便。可一旦涉及到批量化就难受了比如我要看8个频点、4个切面共32条曲线在CST里一条条切出来再截图整理效率很低。更麻烦的是绘制细节的可控性坐标轴字号、线宽、线型、标注位置、多条曲线叠放顺序这些在CST后处理里调整起来远不如MATLAB灵活生成的图也很难直接达到论文出版级别的要求。我见过不少同事最后都是把CST截图贴进PPT再手动添加标注图片分辨率有限、曲线重叠时区别度差。与其这样不如在一开始就考虑数据导出加脚本绘图一劳永逸。1.2 MATLAB做方向图后处理的价值MATLAB处理方向图的优势不在于仿真能力而在于数据解析和绘图的自由度。比如归一化处理CST里方向性曲线可以直接看dB值但我要画归一化到0 dB的曲线时需要自己减掉最大值要做理论值与仿真值对比时仿真数据读进MATLAB后能跟公式计算结果直接subtract到了多曲线批量绘制场景一句话脚本就能把所有频点扫完输出统一风格、统一尺寸的图片这一套流程在CST里实现成本要高得多。另外MATLAB社区关于天线方向图的函数积累非常丰富。没有Antenna Toolbox也能用自带的polarplot、surf把方向图画出来配合天线工具箱里的polarpattern还能一键生成带增益、波束宽度、旁瓣电平标注的规范方向图这在天线测试报告里很常用。1.3 一个典型场景方向图乘积定理验证这次项目里我需要验证阵列方向图仿真结果是否和方向图乘积定理吻合。定理本身很直白阵列总方向图等于单元方向图乘以阵因子。但关键在于仿真得到的单元方向图是CST里带互耦效应的实际结果把它和阵列因子相乘得到的综合方向图再跟全阵列仿真结果对比能有效判断阵列中单元间互耦对方向图的影响程度。要实现这个验证我必须先把CST里单单元仿真和全阵列仿真的方向图数据都导出来再在MATLAB里做复乘操作。这个过程做完之后我明显感觉掌握从CST导出到MATLAB重绘这一整套链路对天线工程师来说是刚需不光是画图的问题很多数据分析、算法验证都依赖这条链路。2. CST端导出方向图先弄明白导出来的是什么内容2.1 远场结果里的指标到底代表什么很多刚开始用CST的同学打开Farfield文件夹看到Directivity、Gain、Realized Gain、E-Field等一堆结果会发懵。简单区分一下Direction方向性只考虑辐射方向图自身的集中程度不包含损耗单位dBi。Gain增益方向性乘上辐射效率包含了介质损耗和导体损耗但不包含端口失配损耗。Realized Gain实现增益在Gain基础上再考虑S11导致的反射损耗是实际工作状态下的增益。E-Field电场是场值本身单位V/m导出后通常要自己取模值再算方向图。导出方向图数据前先确定你要用的是哪一类结果。做方向图归一化对比时用哪个都行因为归一化后形状一致但要做增益对比时就得统一用Realized Gain否则对比结果会差出一个S11的量。3D方向图右侧的色标还有一个容易忽略的细节它默认显示Min和Max但方向图关注的是主瓣方向、主瓣宽度、旁瓣位置和电平。导出数据后想算半功率波束宽度要在MATLAB里找到主瓣峰值两侧下降3 dB对应的角度区间。2.2 导出1D切片数据最常见需求是导出一条特定平面上的方向图曲线。在CST里操作路径因版本略有差异但原理一致在Navigation Tree里选中对应的Farfield结果然后通过File菜单或右键菜单中的Export/ASCII Export功能导出。导出前先设置要观察的平面要么在2D/3D结果里把视图切到指定平面要么直接导出后自己在MATLAB里切片。导出设置里通常会让你选择数据列常见选项包括Theta、Phi、Abs(Directivity)、Theta(Directivity)、Phi(Directivity)等。这里我建议全选导出Abs和两个极化分量宁可多导也不要少导后面分析极化纯度时用得上。文件格式通常是TXT或CSV分隔符在CST里可选我一般选Tab分隔方便MATLAB里直接readmatrix。2.3 导出3D远场数据完整3D方向图导出会生成一个数据量较大的文件包含整个球面上所有(theta, phi)采样点的场值。导出时CST会要求设置角度步长这一步决定了数据总行数theta取181个点、phi取361个点总数据量就到了6万多行文件体积会有几MB。我建议按实际需求选择步长如果只是为了看趋势theta步长5度、phi步长5度就够但要做精确的波束宽度计算至少要把步长降到1度。这类导出文件头部通常会有一段说明文字记录文件类型、角度范围、步长、数据列含义等信息。第一次导入MATLAB时一定要先把头部打印出来看一眼我后面会详细说怎么解析。2.4 复制粘贴导出的风险CST结果表格支持选中单元格直接CtrlC复制对于数据量小的场景很方便。比如只要50个角度采样点的曲线复制出来直接粘到MATLAB脚本里当数组用。但这里有个很现实的坑CST数值显示默认可能是固定小数位复制出来后精度会损失数据量稍微大一点还会因为格式不统一导致解析困难。我在实际中吃过一次亏复制出来的数据中间混了不同数量的空格MATLAB里sscanf解析直接报错。小数据量可以复制正规流程还是建议走文件导出可控性和可复现性都更好。3. MATLAB数据导入骨架文件头解析与角度网格复原3.1 通用读取模板不管CST导出的是1D切片还是3D数据第一步都是把文件读进来。我通常用readmatrix它能自动跳过以非数字开头的行适合处理CST这种带文件头的TXT导出。% 读取CST导出的方向图数据自动跳过文本头 filename farfield_8GHz.txt; data readmatrix(filename);如果CST导出的是逗号分隔CSV加上分隔符参数data readmatrix(filename, Delimiter, ,);readmatrix处理CST导出的常规数值文件基本够用但遇到文件头特别复杂、或字段包含单位符号时它可能会跳过太多行。这时候可以用textscan先读前几行看看结构再决定跳过多少行fid fopen(filename, r); for k 1:10 line fgetl(fid); disp(line); end fclose(fid);这一步叫侦察文件导出后第一件事先做这个确认文件结构再继续能省掉后面大量的排错时间。3.2 判断数据扫描顺序是theta-major还是phi-major3D远场数据最常见的排列方式是theta在外层循环、phi在内层循环也就是固定一个theta值把所有phi遍历完再进入下一个theta也有相反排列的。这个顺序直接决定你reshape成矩阵时能不能正确还原网格。判断方法很简单看文件前几行中theta列是先变化还是后变化。如果是phi-major那么前若干行phi在0到360内变化theta保持不变。还原网格的通用代码theta_unique unique(data(:,1)); % 唯一theta值 phi_unique unique(data(:,2)); % 唯一phi值 nT length(theta_unique); nP length(phi_unique); % 假设数据是theta-major排列 dir_abs reshape(data(:,3), nP, nT).; % 转置后行为theta、列为phi注意reshape的方向很容易出错转置之后务必用surf先画一张示意图验证坐标轴是否符合预期。我一般读取完立刻画个pcolor看色图排列颜色连续没有花片就说明网格还原正确。3.3 主平面切片怎么从3D数据中抽取很多时候用户从CST导的是完整3D数据但实际报告里只需要E面和H面两条主平面曲线。这种场景不需要重新去CST里导1D数据直接在MATLAB里从3D网格里抽就行。% 抽取phi0°平面xoz面 idx_phi0 phi_unique 0; cut_phi0 dir_abs(:, idx_phi0); % 抽取phi90°平面yoz面 idx_phi90 phi_unique 90; cut_phi90 dir_abs(:, idx_phi90);抽出来之后直接用plot画就行。这里有个细节由于CST默认theta范围是0到180度phi0平面抽出来的实际是从z方向开始指向-x方向的半圈如果你想要完整的360度方向图通常需要用phi0和phi180两个切面的数据拼起来或者极坐标下直接用整个3D数据画。4. 三种输出形式的绘图实操直角图、极坐标图、3D球面图4.1 直角坐标归一化方向图这是报告中最常见的形式。核心逻辑是先找到方向图最大值把整个曲线归一化到0 dB再以角度为横轴画曲线。% data列: Theta, Phi, Abs(Dir) theta_deg data(:,1); dir_linear data(:,3); % 转dB dir_dB 10*log10(dir_linear eps); % 归一化到峰值 dir_norm dir_dB - max(dir_dB); figure; plot(theta_deg, dir_norm, LineWidth, 1.5); xlabel(Theta (deg)); ylabel(Normalized Directivity (dB)); grid on; ylim([-40 3]);为什么纵轴从-40 dB截断因为方向图旁瓣和背瓣通常低于主瓣30 dB以上完整画出会压缩主瓣附近细节。工程习惯上把纵轴范围设在-40 dB到3 dB既能看清楚主瓣和第一旁瓣又不会被极低电平的数值干扰视图。归一化时用20log10还是10log10取决于数据是场值还是功率值。CST导出的Directivity和Gain本质是功率密度比值用10log10导出的E-Field是场值要画功率方向图时用20log10。4.2 极坐标方向图天线报告里极坐标图用得非常多因为方向图本来就是按角度分布的极坐标能直观反映空间指向性。MATLAB新版推荐用polarplot老版本用polar。我建议先归一化再用极坐标画这样不同方案的曲线可以叠在一张图里对比。% 将theta转弧度 theta_rad deg2rad(theta_deg); % 归一化线性值 dir_lin_norm dir_linear ./ max(dir_linear); figure; polarplot(theta_rad, dir_lin_norm, b-, LineWidth, 1.5); rlim([0 1]);极坐标图有个常见问题当功率值很低时曲线会贴近圆心很多细节被压缩。所以有的场景会画功率线性值有的会画电压值开方甚至会自定义径向尺度。如果用的是MATLAB天线工具箱推荐直接用polarpattern它能自动把低于-40 dB的部分截断还能在图上标注主瓣方向、半功率波束宽度、第一旁瓣电平等参数做天线测试报告效率极高。4.3 3D球面方向图CST自带的3D方向图很华丽但要用在正式文档里往往需要统一视角、统一色标。MATLAB里能把导出的球面数据用surf画出来通过sph2cart把(theta, phi, r)转成(x, y, z)坐标[Theta, Phi] meshgrid(theta_rad, phi_rad); [X, Y, Z] sph2cart(Phi, Theta - pi/2, dir_lin_norm); % 注意MATLAB里sph2cart的仰角定义与CST的theta不同 figure; surf(X, Y, Z, dir_lin_norm, EdgeColor, none); axis equal; colormap(jet); colorbar; xlabel(X); ylabel(Y); zlabel(Z);这里必须提醒一下坐标系定义差异MATLAB的sph2cart第二个参数是仰角也就是从xoy平面往上为正而CST的theta是从z轴往下偏转的角度两者相差一个90度的偏移。转坐标时要用theta-pi/2作为仰角否则画出来的方向图朝向是错的。我第一次没注意结果画出来的阵列主瓣指向了侧面还以为是数据导错了排查了半天才发现是坐标系角度定义没对齐。如果导出的3D数据角度网格不是均匀等间隔的surf会画得很难看。这种情况下可以用scatteredInterpolant做插值重采样F scatteredInterpolant(theta_deg(:), phi_deg(:), dir_lin_norm(:), linear, none); theta_q linspace(0, 180, 181); phi_q linspace(0, 360, 361); [Theta_q, Phi_q] meshgrid(theta_q, phi_q); Dir_q F(Theta_q(:), Phi_q(:)); Dir_q reshape(Dir_q, size(Theta_q));插值不仅能修复非均匀网格还能让图形更平滑美观代价是引入一定的数值误差用于展示没问题用于精确计算还是用原始采样数据。5. 方向图数据搬运中最容易翻车的几处细节5.1 科学计数法与分隔符格式差异CST导出的文本文件默认用空格或Tab分隔数字可能是科学计数法例如1.234567e001这种格式。readmatrix本身能识别科学计数法但如果你在中间的环节用Excel打开过文件再另存为CSV格式可能就变了甚至有些区域被Excel自动转成了日期或文本格式。教训就是数据文件中间环节不要经过Excel导出后直接交给MATLAB处理。实在需要人工检查用纯文本编辑器看。5.2 增益和方向性的单位口径要统一CST同一个文件里可能同时导出Direction和Gain两种数值。做归一化或者对比时如果一条曲线用的是方向性、另一条用的是增益两者之间差了一个辐射效率直接画在一起对比会得出错误结论。我在对比阵列和单单元方向图时因为载入不同文件没注意单位口径两条曲线差了2 dB多一度以为互耦把效率压得很低后来才发现是混用了不同结果类型。解决方式是在导出时就固定只选Realized Gain或只选Direction导入后做一次断言检查看最大值是不是在合理区间。5.3 小数据量复制粘帖的精度陷阱前面提到过复制粘贴的导入方式。这里再补充一个具体案例有一次只需要提取主瓣附近一小段数据做曲线拟合我偷懒直接从CST的表格里复制了20多个点粘贴到MATLAB里表面看数字都对可拟合出来的主瓣宽度比CST原图宽了0.5度。原因是CST表格显示默认把数值截断到了3位小数复制出来的精度不足以支持精确的波束宽度计算。从那以后涉及精确计算我都强制走文件导出只在肉眼判断数据趋势时才用复制粘贴。5.4 角度范围与负角度的坑CST的theta范围是0到180度而有些文献习惯用-180到180度或者-90到90度来表示方向图横轴。MATLAB画图时如果不做角度映射直接拿0到180的数据去对照实测的-180到180数据两条曲线会对不上。常用处理方式是把phi180度平面的数据镜像到负角度区域重新构造完整的横坐标。极坐标图同样要注意polarplot默认从0度开始逆时针而CST里通常把theta0度放在顶部如果直接用极坐标画方向图的指向看上去会和CST里的3D图相差90度。我一般会在代码里做一次坐标系转换让MATLAB图与CST图朝向一致心智负担小很多。5.5 方向图乘积定理验证时的数据对齐用MATLAB验证方向图乘积定理时最容易出问题的地方是角度对齐。CST里导出的单元方向图theta网格是0到180度整数采样而计算阵因子时用的角度可能是电长度乘以cos(theta)得到的连续值。MATLAB里做乘法前必须确保两个数据序列角度严格一致必要的时候用interp1把单元方向图插值到阵因子计算的网格上。两个额外容易忽略的点一是单元方向图相位中心的位置要与阵列模型里的阵元位置一致否则叠加相位会出现整体偏移二是单元方向图导出时应保留复数场值而不是只看幅度。只取幅度会导致阵因子相位信息丢失乘积定理验证结果对不上。CST里导出Farfield时选择复数场值MATLAB里直接对复场做计算再取幅度这样才是完整的验证流程。5.6 大文件读取性能3D远场数据导出文件几MB到几十MBreadmatrix一次读入6万到几十万行是常见情况。MATLAB处理这个量级没问题但如果脚本里反复读取、反复reshape内存占用会迅速上涨。我建议读取一次后保存成MAT文件后续处理直接load速度提升非常明显。还有一个习惯是把角度步长从1度放宽到5度来快速迭代画图样式所有图形参数调好后再切回高精度数据出最终图片时间能省一大半。方向图这套CST导出、MATLAB重绘的工作流我现在几乎每个项目都会用。做单天线项目时画几个主平面切线图看起来跟CST自带图差别不大但做阵列项目、做多频点对比时优势就特别明显了尤其是把仿真数据和理论计算、实测数据叠在一张图里处理CST本身根本做不到。如果你也经常倒腾方向图建议把上面这些脚本整理成一个通用的方向图工具箱包括导入、切片、归一化、绘图几个模块后续碰到新项目基本就是换文件名的事情。这些坑我都替你们踩了一遍照着这个思路走能少走不少弯路。本文还有配套的精品资源点击获取
觉得有用,分享给同行:

为您的企业打造数字门面

稳重轻奢商务风格,端正雅致视觉,长效耐看不易过时。

立即咨询 →