简介:面向电磁仿真与天线设计工程师,该压缩包集中解决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结果表格支持选中单元格直接Ctrl+C复制,对于数据量小的场景很方便。比如只要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-major
3D远场数据最常见的排列方式是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网格里抽就行。
% 抽取phi=0°平面(xoz面) idx_phi0 = phi_unique == 0; cut_phi0 = dir_abs(:, idx_phi0); % 抽取phi=90°平面(yoz面) idx_phi90 = phi_unique == 90; cut_phi90 = dir_abs(:, idx_phi90);抽出来之后直接用plot画就行。这里有个细节:由于CST默认theta范围是0到180度,phi=0平面抽出来的实际是从+z方向开始指向-x方向的半圈;如果你想要完整的360度方向图,通常需要用phi=0和phi=180两个切面的数据拼起来,或者极坐标下直接用整个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.234567e+001"这种格式。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数据,两条曲线会对不上。常用处理方式是把phi=180度平面的数据镜像到负角度区域,重新构造完整的横坐标。极坐标图同样要注意,polarplot默认从0度开始逆时针,而CST里通常把theta=0度放在顶部,如果直接用极坐标画,方向图的"指向"看上去会和CST里的3D图相差90度。我一般会在代码里做一次坐标系转换,让MATLAB图与CST图朝向一致,心智负担小很多。
5.5 方向图乘积定理验证时的数据对齐
用MATLAB验证方向图乘积定理时,最容易出问题的地方是角度对齐。CST里导出的单元方向图theta网格是0到180度整数采样,而计算阵因子时用的角度可能是电长度乘以cos(theta)得到的连续值。MATLAB里做乘法前必须确保两个数据序列角度严格一致,必要的时候用interp1把单元方向图插值到阵因子计算的网格上。
两个额外容易忽略的点:一是单元方向图相位中心的位置要与阵列模型里的阵元位置一致,否则叠加相位会出现整体偏移;二是单元方向图导出时应保留复数场值,而不是只看幅度。只取幅度会导致阵因子相位信息丢失,乘积定理验证结果对不上。CST里导出Farfield时选择复数场值,MATLAB里直接对复场做计算,再取幅度,这样才是完整的验证流程。
5.6 大文件读取性能
3D远场数据导出文件几MB到几十MB,readmatrix一次读入6万到几十万行是常见情况。MATLAB处理这个量级没问题,但如果脚本里反复读取、反复reshape,内存占用会迅速上涨。我建议读取一次后保存成MAT文件,后续处理直接load,速度提升非常明显。还有一个习惯是把角度步长从1度放宽到5度来快速迭代画图样式,所有图形参数调好后再切回高精度数据出最终图片,时间能省一大半。
方向图这套"CST导出、MATLAB重绘"的工作流,我现在几乎每个项目都会用。做单天线项目时画几个主平面切线图看起来跟CST自带图差别不大,但做阵列项目、做多频点对比时优势就特别明显了,尤其是把仿真数据和理论计算、实测数据叠在一张图里处理,CST本身根本做不到。如果你也经常倒腾方向图,建议把上面这些脚本整理成一个通用的方向图工具箱,包括导入、切片、归一化、绘图几个模块,后续碰到新项目基本就是换文件名的事情。这些坑我都替你们踩了一遍,照着这个思路走,能少走不少弯路。
本文还有配套的精品资源,点击获取