openEMS开源电磁仿真:EC-FDTD原理与微带天线实战
简介:本资源是基于扩展有限差分时域法(EC-FDTD)实现的开源电磁场仿真求解器openEMS的Matlab代码包,面向电子信息工程、计算机科学与应用数学等专业的本科生及研究生,适用于课程设计、期末大作业与毕业设计中的电磁建模与仿真任务。压缩包共349个文件,含127个核心Matlab函数(.m)、68个C++引擎模块(.cpp)支撑底层计算、66个头文件(.h)定义接口与数据结构,以及配套文档(.rst/.txt)、Python辅助脚本(.py)、可视化图像(.png)和构建配置文件(CMake、Debian控制文件等),整体仅1.9MB,轻量易部署。已有110人学习下载,代码采用参数化设计,关键变量集中可调,注释详尽、逻辑清晰,附带可直接运行的案例数据,便于快速上手验证与二次开发。读者可完整掌握EC-FDTD数值建模流程,复现微波器件、天线辐射、NF2FF近远场变换等典型电磁仿真任务,并基于源码理解求解器架构与算法实现细节。 直接说结论:如果你在做天线、微波器件、电磁兼容相关的仿真,又不想被商用软件的授权费卡脖子,openEMS 是一个你绕不开的选项。它是一套开源的电磁场求解器(Open Electromagnetic Field Solver),核心求解方式是基于 EC-FDTD 的全波时域算法,可以通过 Matlab 或 Octave 脚本完整驱动建模、求解与后处理。简单讲,它就是“能跑在你自己电脑上的 FDTD 电磁仿真环境”,特别适合做贴片天线、滤波器、波导结构、微带电路的参数扫参和优化迭代。
这篇东西我会从算法原理讲到环境配置,再拿一个实际的微带贴片天线案例走一遍完整仿真流程,中间穿插我踩过的坑和排查经验。适合三类人看:刚接触全波仿真、想用开源工具替代 HFSS/CST 的学生;已经在用 openEMS 但总在网格或端口设置上翻车的工程师;以及单纯想搞明白 EC-FDTD 和传统 FDTD 有什么区别的算法爱好者。
1. openEMS 是什么:EC-FDTD 方法加持的开源电磁场求解器
1.1 一款什么样的工具
openEMS 由德国学者 Thorsten Hansen 等人开发维护,本质上是基于 FDTD(时域有限差分)思想发展来的全波 Maxwell 方程求解器。它把空间离散成 Yee 网格,在时间轴上逐步推进电场和磁场的更新,一次仿真就能得到很宽频带内的响应,再通过傅里叶变换提取 S 参数、远场方向图、场分布等工程关心的结果。
这一点和商用软件里的 HFSS(有限元)或 CST(时域/频域混合)走的是不同技术路线。FDTD 这类时域方法天然适合宽带问题,你用高斯脉冲激励一次,就能覆盖比如 1GHz 到 6GHz 的连续频段,不用像频域求解器那样一个频点一个频点扫。做天线设计时这是巨大优势,尤其是初版设计阶段,一个宽带 S11 曲线能让你快速判断谐振点偏到哪里去了。
openEMS 的另一个特点是它自带一套基于 CSXCAD 的建模体系。你可以在 Matlab 脚本里用 AddMetal、AddMaterial、AddBox 这类命令搭几何模型,也可以装 AppCSXCAD 图形界面用鼠标画。我的习惯是脚本建模,因为几何参数都是变量,后面扫参优化直接改数字重跑就行,比 GUI 里拖拽快得多。项目里常见的 .rar 压缩包里面的 Matlab 代码文件,就是这种“几何 + 求解配置 + 后处理”的整套脚本。
1.2 EC-FDTD 和传统 FDTD 的区别:为什么这个选择很重要
传统 FDTD 用的是标准的蛙跳格式(leapfrog scheme):先更新所有电场分量,再更新所有磁场分量,每一步都基于上一步的结果。它实现简单、内存占用均衡,但在处理色散材料、有损耗介质或某些非线性场景时,时间步长必须压得比较小,否则数值会发散,或者出现明显的数值色散误差。
openEMS 采用的 EC-FDTD(Euler-Cromer FDTD)则是在时间推进格式上做了一点关键改动:它不是把电场和磁场当成对称的蛙跳关系,而是采用 Euler-Cromer 半隐式的更新策略,让其中一个场量先更新,然后立刻用这个新值去更新另一个场量。说白了,就是把“相互追赶”变成“先走一步、后者跟进”的模式。这种格式在处理色散介质时稳定性更好,能容忍稍微大一点的时间步长,在同样网格条件下收敛性更稳健。
对你的实际好处是什么?我做介质基板天线仿真时体会最深:FR4、Rogers 这类介质都有频变介电常数和损耗角正切,传统 FDTD 处理这些材料要么不稳定,要么需要在每个频点额外做修正。EC-FDTD 格式在色散材料的处理上天然更稳,仿真结果更不容易出现“网格加密一点、结果漂一大截”的糟心事。
注意:openEMS 的这套求解器是 C++ 写的,Matlab 脚本只是前端驱动。真正跑仿真时计算核心的效率关键在网格数量和时间步长,脚本本身快慢没有那么重要。
2. 环境准备:安装 openEMS 并把 Matlab 接进来
2.1 获取 openEMS:版本选择与安装方式
openEMS 的官方代码托管在 GitHub 的 openEMS 仓库,页面上有 release 版本可以直接下载。我建议你优先拿 release 的预编译包,尤其是 Windows 用户,省去自己编译的麻烦。Linux 用户如果系统比较新,也可以考虑自己从源码编译,多花点时间但能拿到最新特性。
安装时有个容易踩坑的点:openEMS 对 Matlab 版本和 Octave 版本的兼容性不完全一样。如果你用的是较新的 Matlab(比如 R2022a 之后),装完 openEMS 之后要先跑一遍它自带的测试脚本,确认核心库能正常加载。网上很多人报“undefined function”错误,十有八九是 openEMS 目录没正确加到 Matlab 搜索路径里。
2.2 Matlab 环境配置与路径设置
openEMS 装好后,在 Matlab 里要做两件事:设置路径和初始化环境变量。项目里常见的做法是写一个init_openEMS.m脚本,内容大概是这样:
% 设置 openEMS 根目录,改成你自己的安装路径 openEMS_dir = 'D:/Program Files/openEMS'; addpath(genpath(fullfile(openEMS_dir, 'matlab'))); addpath(genpath(fullfile(openEMS_dir, 'matlab', 'openEMS'))); addpath(genpath(fullfile(openEMS_dir, 'matlab', 'CSXCAD'))); % 设置 hdf5 库路径(部分版本需要) setenv('HDF5_DISABLE_VERSION_CHECK', '1');每次打开 Matlab 先跑一下这个脚本,确认没有报错。如果提示找不到InitFDTD或AddBox这类函数,就是路径没弄对,别急着怀疑安装包坏了。
2.3 验证安装:跑一个最小例子
环境配没配好,最快的验证方式是跑一个极简单的偶极子或贴片天线案例,看能不能出 S11 曲线。我自己通常会先跑 openEMS 自带的antenna示例目录里的某个例子,跑通了再改自己的模型。这样如果出问题,能确定是自己改的代码有问题,还是环境没配好,排查范围会小很多。
实操心得:Windows 上如果遇到“找不到 openEMS.exe”这类报错,去检查一下系统环境变量里有没有把 openEMS 的 bin 目录加进去。openEMS 的求解核心是通过外部进程调用的,Matlab 脚本负责生成网格和配置文件,真正算的时候是
openEMS这个可执行程序在工作。
3. 核心概念解析:CSXCAD 建模、网格、激励与端口
3.1 CSXCAD 几何建模:先把结构画对
openEMS 的建模 API 风格和 CST 的 VBA 脚本有点像,都是用命令创建几何体。常用的几个:
AddMetal(CSX, name):定义金属材料AddMaterial(CSX, name):定义介质材料,可设 Epsilon、Mue、KappaAddBox(CSX, material, priority, start, stop):添加长方体AddCylinder(CSX, material, priority, start, stop, radius):添加圆柱体AddPolygon:拉伸多边形,适合做不规则贴片形状AddPort:设置集总端口
这里有个关键概念叫 priority(优先级)。openEMS 里不同材料重叠时,优先级高的材料占据重叠区域。比如微带天线的金属贴片压在介质基板上,贴片的 priority 就要比基板高,否则金属会被介质盖住,结果完全不对。这是我第一次用 openEMS 时栽过跟头的地方,调了半天谐振频率不对,最后发现是 priority 设反了。
另外,坐标轴方向也要提前想清楚。常用的做法是把基板放在 XY 平面,Z 方向是厚度方向,贴片在 Z=0 面,地平面在 Z=-h 面。这样后期观察场分布时,视图方向和结果理解都直观。
3.2 网格设置与稳定性:FDTD 的 CFL 条件
FDTD 方法的时间步长和空间网格必须满足 CFL 条件,否则数值解直接发散。对三维情况,稳定条件是:
Δt ≤ 1 / (c * sqrt(1/Δx² + 1/Δy² + 1/Δz²))其中 c 是介质中的光速。openEMS 会自动根据网格尺寸计算时间步长,所以你主要关心的是网格怎么划分,不用手动去调 Δt,但最好理解这个关系。
网格设置的关键在于:结构边缘至少要有 10 到 20 个网格单元跨越,才能保证几何结构被比较好地离散化。比如厚度 1.6mm 的 FR4 基板,Z 方向网格不能给 2mm 一个网格,那样整个基板只有不到一个网格的高度,介电常数加载位置都会出问题。
openEMS 的DefineRectGrid函数允许你设置渐变网格,在贴片边缘、馈电点附近加密,其他区域拉稀。我的习惯是先跑一个稀疏网格版本看趋势,确认谐振频率大概在哪,再加密网格验证精度,这样能在精度和计算时间之间找到平衡。
3.3 激励源与端口:S 参数怎么来的
openEMS 里最常用的激励方式是高斯脉冲。设置激励频率范围和幅值后,求解器会从端口注入一个宽带脉冲,然后在时域记录端口电压和电流,通过傅里叶变换得到频域 S 参数。核心代码:
FDTD = InitFDTD('endCriteria', 1e-5); FDTD = SetGaussExcite(FDTD, 0.5*f_start, f_band);这里的endCriteria是时域迭代终止条件,表示能量衰减到初始值的 1e-5 时停止计算。如果设得太宽松,结果还没收敛就停了,S11 曲线会很毛糙;设得太严格,计算时间翻好几倍。我一般先用 1e-4 做初步扫参,最终验证时再收紧到 1e-5。
端口方面,微带天线最常用的是集总端口(lumped port)。你要在端口位置定义一段传输线结构,并把端口设置在正确的位置和方向上。这个比较考验对结构细节的理解:端口必须放在激励电流实际流过的路径上,方向要和电流方向一致,否则 S11 曲线会莫名多出一些奇怪的谐振峰。
4. 实操案例:微带贴片天线的完整仿真流程
4.1 天线结构与设计参数
这里我以 2.45GHz 矩形微带贴片天线为例,这个频段是 WiFi 和蓝牙的工作频段,大家可能更熟悉。设计参数如下:
- 工作频率:2.45GHz
- 基板材料:FR4(相对介电常数 4.4,损耗角正切 0.02)
- 基板厚度:1.6mm
- 馈电方式:微带线侧馈(也可以做同轴探针馈电,这里用微带线馈电展示完整建模流程)
矩形贴片的初始尺寸可以用经典公式估算。先算贴片宽度 W:
W = c/(2*f0) * sqrt(2/(εr+1))然后算有效介电常数 εeff 和等效延伸长度 ΔL,最后得到贴片长度 L:
εeff = (εr+1)/2 + (εr-1)/2 * (1+12h/W)^(-0.5) ΔL = 0.412h * (εeff+0.3)(W/h+0.264) / (εeff-0.258)(W/h+0.8) L = c/(2*f0*sqrt(εeff)) - 2ΔL代入数值算一下:W 约 37.3mm,L 约 29.2mm。这个值是初始尺寸,实际在 openEMS 里仿真后会发现谐振频率有偏移,需要调 L 长度来校准频率。
4.2 建模代码逐段解读
下面是完整的 openEMS Matlab 建模脚本(核心部分,可直接运行):
% ========== 物理常量与单位 ========== c0 = 2.99792458e8; mu0 = 4*pi*1e-7; eps0 = 1/(c0^2*mu0); % ========== 天线设计参数 ========== f0 = 2.45e9; % 中心频率 lambda0 = c0/f0; % 自由空间波长 h = 1.6e-3; % 基板厚度 er = 4.4; % 基板介电常数 % 矩形贴片尺寸(上述公式计算) W = c0/(2*f0)*sqrt(2/(er+1)); eps_eff = (er+1)/2 + (er-1)/2*(1+12*h/W)^(-0.5); deltaL = 0.412*h*((eps_eff+0.3)*(W/h+0.264))/((eps_eff-0.258)*(W/h+0.8)); L = c0/(2*f0*sqrt(eps_eff)) - 2*deltaL; % 微带馈线宽度(50欧姆阻抗,近似计算) W_feed = 3.0e-3; % 先取约 3mm,后续可通过仿真微调 feed_len = 8e-3; % 馈线长度 % ========== 网格设置 ========== grid = [2*h 2*h h/4]; % 初始网格:XY 方向粗,Z 方向细分 mesh = DefineRectGrid(grid); % ========== 初始化 FDTD ========== FDTD = InitFDTD('endCriteria', 1e-5); FDTD = SetGaussExcite(FDTD, 0.4*f0, 0.8*f0); % 激励频带覆盖 0.4f0~1.2f0 % 边界条件:MUR 吸收边界(或 PML) BC = {'MUR', 'MUR', 'MUR', 'MUR', 'MUR', 'MUR'}; FDTD = SetBoundaryCond(FDTD, BC); % ========== 创建材料 ========== CSX = InitCSX(); CSX = AddMetal(CSX, 'GND'); % 地平面 CSX = AddMetal(CSX, 'Patch'); % 贴片 CSX = AddMaterial(CSX, 'FR4'); % 介质基板 CSX = SetMaterialProperty(CSX, 'FR4', 'Epsilon', er, 'Kappa', 2*pi*f0*eps0*0.02); % ========== 几何建模 ========== % 基板 CSX = AddBox(CSX, 'FR4', 0, [-W/2-1e-3, -L/2-feed_len-1e-3, -h], [W/2+1e-3, L/2+1e-3, 0]); % 地平面(比基板略大) CSX = AddBox(CSX, 'GND', 1, [-W/2-2e-3, -L/2-feed_len-2e-3, -h], [W/2+2e-3, L/2+feed_len+2e-3, -h-0.01e-3]); % 贴片 CSX = AddBox(CSX, 'Patch', 2, [-W/2, -L/2, 0], [W/2, L/2, 0.01e-3]); % 微带馈线 CSX = AddBox(CSX, 'Patch', 2, [-W_feed/2, -L/2, 0], [W_feed/2, -L/2-feed_len, 0.01e-3]); % ========== 端口设置 ========== port = AddPort(CSX, 3, 'port1', 1, 'x', [-W_feed/2, -L/2-feed_len, -0.5e-3], [W_feed/2, -L/2-feed_len, 0], [0 0 1], 'lumped', 50);这段代码里几个值得注意的地方:
AddBox的第 5 个参数是 priority,基板为 0,地平面为 1,贴片为 2。这样贴片才能叠在基板表面,地平面在基板下面,不会互相覆盖错误。Kappa参数定义了介质损耗。FR4 的损耗角正切约 0.02,根据公式 Kappa = ε0εr2πftanδ 可以近似算出。这里我取了中心频率值来算,严格做法是设置色散模型,但工程上近似够用。- 端口用
AddPort定义,馈电点位于微带线末端和地平面之间,方向沿 Z 轴。这是微带结构集总端口的典型接法。
4.3 网格细化和监控点设置
上面的网格[2*h 2*h h/4]其实非常粗,只能用来验证流程能不能跑通。我实际做仿真时,会在贴片边缘、馈电点附近用SmoothMesh或局部加密的方式把网格加到足够细。
FDTD 仿真里网格数为 N 时,内存消耗大约正比于 N,计算时间正比于 N 的 4/3 次方左右。所以网格加密 2 倍,计算时间大约会增加 2 到 3 倍,这在仿真中是最大的开销来源。
为了避免网格数量失控,我在 openEMS 里采用分级网格策略:贴片区域用 1mm 网格,馈电区域用 0.5mm 网格,基板厚度方向用 0.2mm 网格,外围空气区域用 2mm 网格。这样既能保证关键区域精度,又不至于网格数量爆炸。
另外,我建议在结构周围设置至少 3 到 5 层的吸收边界网格。如果边界距离天线太近,吸收边界会影响天线阻抗和辐射特性,仿真结果会明显偏离真实值。
4.4 运行仿真并提取 S11 与方向图
建模完成后,调用求解器和后处理:
% ========== 运行求解 ========== Sim_Path = './sim_result'; Sim_CSX = 'patch_antenna.xml'; RunOpenEMS(FDTD, CSX, Sim_CSX, Sim_Path); % ========== 后处理:提取 S 参数 ========== freq = linspace(2.0e9, 3.0e9, 501); S11 = extractS('patch_antenna', Sim_Path, freq, 1, 'S11'); % 画 S11 曲线 figure; plot(freq/1e9, 20*log10(abs(S11)), 'LineWidth', 2); grid on; xlabel('Frequency (GHz)'); ylabel('S11 (dB)'); title('Rectangular Patch Antenna S11');跑完之后看 S11 曲线,找到最低点对应频率。如果最低点没落在 2.45GHz,就需要调整贴片长度 L 来校准谐振频率。我通常会在脚本里写一个循环,自动扫描 L 从 28mm 到 31mm 的几个值,然后选最接近目标频率的那组参数。
远场方向图提取稍微复杂一点,需要在SetDump里打开远场输出,然后通过CalcNF2FF函数计算:
% 设置远场输出 CSX = SetDump(CSX, 'farfield', 'HTD', 5, 'Box', [-W/2-10e-3, -L/2-10e-3, -h-10e-3], ... [W/2+10e-3, L/2+10e-3, 10e-3], [0 0 1]); % 计算远场 nf2ff = CalcNF2FF(Sim_Path, 'patch_antenna', 2.45e9, [0, 90], [-180, 180, 2]); figure; plot(nf2ff.theta*180/pi, nf2ff.E_norm_dB, 'LineWidth', 2); grid on; xlabel('Theta (deg)'); ylabel('Normalized Gain (dB)');4.5 结果分析与优化思路
从仿真结果看,一个典型的矩形贴片天线 S11 曲线会在谐振频率点出现明显凹陷,通常能达到 -15dB 以下。如果凹陷不够深,可能是阻抗匹配不够好,可以调馈线位置(也就是馈点沿 L 方向的位置)来改善。
这里说一下调馈点位置的原理:矩形贴片沿 L 方向的电场分布是余弦函数,边缘处电场最强、阻抗最高,中心处电场为零、阻抗为零。所以馈点从边缘向中心移动时,输入阻抗单调下降。通过仿真找阻抗匹配点,就是移动馈点位置,找到 S11 曲线达到最深的那个点。这个方法在微带天线设计中非常基础但极其实用。
如果你想要圆极化或者双频工作,可以在贴片上切角、开槽,这些结构在 openEMS 里都可以通过AddPolygon或布尔运算实现。不过那是进阶玩法了,先把基础的线极化贴片跑通再往深了做。
5. 进阶技巧与经验:让 openEMS 更像生产工具
5.1 加快仿真速度的几个实用操作
第一个技巧是用并行计算。openEMS 支持 OpenMP 多线程和 MPI 并行,你在InitFDTD之前设置并行参数,然后调用求解器时会自动启用多核。不过我实测下来,在普通 PC 上把线程数设成和物理核心数相同效果最好,设太多反而会因为线程切换开销下降效率。
第二个技巧是合理设置endCriteria。很多人在初版调试时就把收敛条件设得很严格,结果每个参数都要等很久。我的习惯是:大范围扫参用 1e-3,找到大致趋势后缩小范围,最后精确仿真用 1e-5 到 1e-6。这样总耗时通常能减少一半以上。
第三个技巧是尽量减小空气盒子的体积。吸收边界离结构太远虽然更安全,但也意味着更多无用网格。实际操作中我一般把吸收边界设在距结构最外沿约 0.2 到 0.3 个波长处,这样可以兼顾精度和速度。
第四个技巧是利用对称性。如果天线结构关于某个平面完全对称(几何、材料、激励都对称),可以只仿真一半,设置对称边界条件。对于矩形贴片天线,如果馈电方式也对称,仿真规模直接减半,计算时间大约减少 40% 到 50%。不过要注意,对称边界和激励方向对应关系很容易搞错,要仔细对照文档。
5.2 与 HFSS 等商用工具的差异对比
用惯了 HFSS 或 CST 的朋友接触 openEMS 会有一些体验落差,这是正常的。我整理了一个对比表:
| 对比维度 | openEMS | HFSS/CST |
|---|---|---|
| 授权费用 | 免费开源 | 高昂年费 |
| 求解方法 | EC-FDTD 时域 | HFSS 有限元 / CST 时域频域混合 |
| 建模方式 | Matlab 脚本 / AppCSXCAD GUI | 成熟 GUI,交互式建模 |
| 网格处理 | 手动设置为主 | 自动网格划分 |
| 宽带扫频 | 一次仿真得到宽频段 | 频域需逐点扫,时域也快 |
| 材料模型 | 支持色散介质 | 材料库丰富 |
| 后处理 | Matlab 脚本自定义 | 内置丰富后处理 |
| 学习曲线 | 较陡,需写代码 | 相对平缓 |
| 优化功能 | 需自写扫参脚本 | 内置参数优化器 |
我的个人建议是:如果你做的是比较常规的天线或微波结构,而且预算允许,HFSS/CST 的体验确实省心。但如果你要做的仿真数量很大(比如课程设计、科研前期探索、小公司研发),openEMS 这套免费方案在成本上的优势是碾压级的。而且脚本化建模的好处是参数可追溯、可复用,比 GUI 操作更容易形成自己的仿真库。
5.3 脚本化仿真的工程价值
既然说到仿真库,这点值得展开讲讲。用 openEMS 做事情,最舒服的是所有设计都变成了可复现的代码。我今天设计了一个 2.45GHz 贴片天线,脚本存下来,明天要改成 5.8GHz,只需要改目标频率,重新算一遍尺寸参数,跑仿真,完事。整个流程不需要重新建模,改几个数字就够了。
这种脚本化能力在做参数扫描时尤其值钱。我之前做一个双频天线项目,需要在贴片上开 U 型槽,槽的位置、宽度、深度都影响两个谐振频率。我写了一个三层循环的扫参脚本,连续跑了两天,把整个参数空间的 S11 数据全部拿到手,然后直接画出等高线图定位最优参数。这种工作如果放在 GUI 里手动操作,人力成本是不可想象的。
6. 常见问题与排查技巧实录
6.1 安装与报错类问题
问题 1:Matlab 提示找不到 InitFDTD 函数
这是最典型的问题。原因几乎都是 openEMS 的 matlab 路径没加全。openEMS 的 Matlab 接口分布在matlab、matlab/openEMS、matlab/CSXCAD等子目录,用addpath(genpath(...))一次性递归添加是最省事的。
问题 2:openEMS 求解器没有输出
检查一下系统环境变量里是否有 openEMS 的 bin 目录,以及RunOpenEMS中指定的输出路径是否有写权限。如果路径里有中文或空格,也可能导致程序启动失败,建议所有路径都用英文。
问题 3:新版 Matlab 下报 HDF5 错误
这个大多和 HDF5 库版本冲突有关,我在环境变量里设置了HDF5_DISABLE_VERSION_CHECK=1之后基本就解决了。
6.2 仿真数值异常类问题
问题 4:S11 曲线高频段严重“抖动”
高频段出现锯齿状噪声,通常说明网格太粗或者时间步长设置过大。FDTD 方法在高频段对网格尺寸很敏感,网格尺寸一般要小于最高频率对应波长的 1/10。我遇到这种情况时会先检查网格设置,把中心频率对应的波长和网格尺寸比一下,网格要至少 10 个点覆盖一个波长。
问题 5:谐振频率严重偏移设计值
如果仿真出来的谐振频率和理论计算差得很远,先检查材料参数是不是正确设置,尤其是介电常数。FR4 的介电常数在 4.2 到 4.8 之间浮动很常见,和具体板材、频率都有关系。另一个常见原因是端口和馈电位置不对,导致天线没有被有效激励。
问题 6:S11 曲线看起来完全“没有谐振”
这个通常是网格太粗糙或者吸收边界太近导致的。我一开始用稀疏网格仿真时,贴片天线 S11 曲线就是一条平平的线,完全没有谐振峰。后来把网格加密到每个波长 15 个点以上,谐振才显现出来。经验是:如果结构关键区域网格数不够,几何结构实际上已经变形了,仿真出来的东西跟设计对象根本不是同一个东西。
6.3 参数速查表
调试和写报告时我常参考这个表:
| 检查项 | 推荐值/原则 |
|---|---|
| 最高频率网格密度 | 至少 10 网格/波长,建议 15-20 |
| 基板厚度方向网格 | 至少 3-5 层 |
| 吸收边界距离 | 0.2-0.3 倍波长(PML)或 0.5 倍波长(MUR) |
| endCriteria 初跑 | 1e-3 到 1e-4 |
| endCriteria 精跑 | 1e-5 到 1e-6 |
| 端口阻抗 | 50 欧姆(常规) |
| 激励脉冲频带 | 目标频段宽度的 1.5-2 倍 |
| 材料 priority | 金属贴片 > 地平面 > 介质基板 |
最后分享一个小技巧。如果你在调模型时总感觉哪里不对,不要急于改代码。先在 AppCSXCAD 里打开模型看一眼几何结构对不对,这个可视化的成本很低,能帮你迅速发现坐标写反、尺寸少个毫米这类低级错误。我在项目早期因为坐标正负号写错,白跑了好几次仿真,后来养成了“建模必可视化检查”的习惯,省下的时间远超打开 GUI 的那几秒钟。
本文还有配套的精品资源,点击获取
