关于 matlab-analyze-em
matlab-analyze-em 是一项在 MATLAB 中分析 RF PCB 元件电磁性能的技能,面向工程师。它介绍 S 参数提取、求解器选择、频率扫描和网格配置,以及场与电流可视化。
主要功能
- 01提取并绘制 S 参数
- 02比较 MoM 与 FEM 求解器
- 03配置插值频率扫描
- 04控制网格并估算内存
- 05可视化电磁场、电流与电荷
适用场景
- 01检查 RF PCB 元件的频率响应
- 02比较结构的不同求解器结果
- 03权衡网格精度与计算开销
- 04查看电磁场和电流分布
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ matlab/ matlab-agentic-toolkit --skill matlab-analyze-em安装后在 Claude Code 中输入/matlab-analyze-em确认已加载。
附带文件manifest.yaml
详细介绍
分析 RF PCB 组件的电磁性能
适用场景
- 从任意 RF PCB 组件(目录组件或自定义
pcbComponent)中提取 S 参数 - 比较 MoM 与 FEM 求解器,或为结构选择合适的求解器
- 使用插值扫描或
frequencySweep对象,加快多频率分析 - 控制网格密度,在精度与速度之间权衡
- 可视化 E/H 场、表面电流或电荷分布
- 使用行为(解析)S 参数模型进行快速估算或优化
不适用场景
- 构建或组装自定义 PCB 结构——请使用
matlab-assemble-pcb-layout - 设计标准传输线或目录对象——请使用
matlab-design-pcb-transmission-line - 定义介电材料或金属材料——请使用
matlab-manage-pcb-material - 将多个组件级联或连接成电路——请使用
matlab-integrate-pcb-circuit - 从 Gerber、ODB++ 或 Allegro 导入 PCB 布局——请使用
matlab-read-pcb-layout
典型工作流
- 之前: 使用
matlab-manage-pcb-material设置基板/导体;然后使用设计技能或matlab-assemble-pcb-layout创建组件 - 此技能: 提取 S 参数、可视化场和电流,并验证性能
- 之后: 使用
matlab-optimize-pcb-design调整尺寸(若未满足规格)→ 使用matlab-integrate-pcb-circuit级联到更大的网络中 → 使用matlab-write-pcb-layout导出 Gerber
快速参考
| 任务 | 代码 |
|---|---|
| S 参数(MoM) | sp = sparameters(obj, freq, 'SweepOption', 'interp') |
| 指定端口 Z0 的 S 参数 | sp = sparameters(obj, freq, 50, 'SweepOption', 'interp') |
| 插值扫描 | sp = sparameters(obj, freq, 50, 'SweepOption', 'interp') |
| 带梯度的插值 | sp = sparameters(obj, freq, 50, 'SweepOption', 'interpWithGrad') |
| 绘制 S 参数 | rfplot(sp) 或 rfplot(sp, [2 1], 1) |
| 电流分布 | current(obj, fc) |
| 电荷分布 | charge(obj, fc) |
| 馈电电流 | feedCurrent(obj, freq) |
| E/H 场 | [e, h] = EHfields(obj, fc, points) |
| 设置网格 | mesh(obj, 'MaxEdgeLength', val) |
| 内存估算 | memoryEstimate(obj, fc) |
| 切换到 FEM 求解器 | pcb.SolverType = 'FEM' |
| FEM 边界条件 | s = solver(pcb); s.BoundaryCondition = 'absorbing' |
| 频率扫描对象 | fsweep = frequencySweep; sp = sparameters(obj, freq, 'SweepOption', fsweep) |
| 从扫描获取有理模型 | rmodel = getRationalModel(fsweep) |
| 查找方法 | methods(obj) |
S 参数提取
sparameters 函数是所有 RF PCB 组件的主要分析方法。
基本用法
obj = design(couplerBranchline, 5e9);
freq = linspace(1e9, 10e9, 101);
sp = sparameters(obj, freq, 'SweepOption', 'interp');
figure;
rfplot(sp);
指定端口阻抗
sp = sparameters(obj, freq, 50, 'SweepOption', 'interp'); % 50-ohm reference
sp = sparameters(obj, freq, 75, 'SweepOption', 'interp'); % 75-ohm reference
绘制特定 S 参数
rfplot(sp, [2 1], 1); % Plot S21 only
rfplot(sp, [1 1], 1); % Plot S11 only
rfplot(sp, 2:4, 1); % Plot S21, S31, S41 vs port 1
提取数值数据
sp = sparameters(obj, freq, 'SweepOption', 'interp');
S21_dB = 20*log10(abs(squeeze(sp.Parameters(2,1,:))));
S11_dB = 20*log10(abs(squeeze(sp.Parameters(1,1,:))));
求解器选择
RF PCB Toolbox 支持两种电磁求解器:
| 求解器 | 属性值 | 最适用场景 |
|---|---|---|
| 矩量法(MoM) | 'MoM'(默认) | 平面结构、开放式辐射结构 |
| 有限元法(FEM) | 'FEM' | 屏蔽型目录元件;也可通过 SolverType 用于 pcbComponent |
切换到 FEM
可通过 pcbComponent 使用 FEM:
pcb = pcbComponent(couplerBranchline);
pcb.SolverType = 'FEM';
sp_fem = sparameters(pcb, freq);
FEM 边界条件配置
将 SolverType 设置为 'FEM' 后,通过 solver() 获取求解器对象,以配置边界条件:
pcb = pcbComponent(catalogObj);
pcb.SolverType = 'FEM';
s = solver(pcb); % Returns em.solvers.fem.FEM object
s.BoundaryCondition = 'absorbing'; % or 'perfectly-matched-layer' (default)
| 边界条件 | 值 | 使用场景 |
|---|---|---|
| 完全匹配层(PML) | 'perfectly-matched-layer'(默认) | 开放式辐射结构、天线 |
| 吸收型 | 'absorbing' | 屏蔽外壳、波导端口 |
注意: solver(comp, 'SolverType', 'FEM') 会报错并提示“输入参数过多”。SolverType 是 pcbComponent 的属性,而不是 solver() 的参数。BoundaryCondition 是返回的 FEM 求解器对象的属性,而不是组件的属性。
FEM 前提条件
FEM 求解器(R2025a 引入)需要两个依赖项:
- Integro-Differential Modeling Framework for MATLAB(IDMF) — 通过 Home > Add-Ons > 搜索 "Integro-Differential Modeling Framework for MATLAB" 进行安装。使用
matlab.addons.installedAddons验证。 - Windows Subsystem for Linux(WSL) — Windows 上必需。请在提升权限的 PowerShell 提示符中运行
wsl --install进行安装。使用wsl --status验证。
如果 WSL 可用,在通过 pcbComponent 设计自定义结构时即可使用 FEM 求解器。对于带屏蔽的目录元件,系统会自动使用 FEM。
防火墙提示: Windows Defender 可能会阻止 IDMF 使用的 PostgreSQL 服务器(<matlabroot>\sys\postgresql\win64\PostgreSQL\bin\postgres.exe)。如果 FEM 在首次使用时求解卡住,请告知用户这可能是原因之一,并让用户根据其 IT/安全策略决定采取何种措施。请勿自行修改防火墙设置。
WSL 内存调整
WSL 默认只分配 50% 的系统 RAM。大型 FEM 问题可能会因内存不足而失败。如果用户在 FEM 求解过程中遇到 OOM,请告知他们可以通过编辑 C:/Users/%UserProfile%/.wslconfig 来增加 WSL 内存:
[wsl2]
memory=48GB
swap=8GB
然后运行 wsl --shutdown 和 restart-service LxssManager(在提升权限的 PowerShell 中)。应根据系统规格调整数值。这可能需要 IT 部门参与——请用户手动进行此更改,并在准备就绪后继续。请勿自行创建或修改 .wslconfig。
仅限 FEM 的属性
当 SolverType='FEM' 时,pcbComponent 会提供其他属性:
| 属性 | 用途 |
|---|---|
Connector | 附加 RFConnector 对象,用于同轴馈电建模(默认值:50 欧姆,InnerRadius=0.5mm,OuterRadius=1.5mm) |
IsShielded | 在结构周围添加金属屏蔽盒(尺寸与接地平面相同) |
FEM 限制
- 无法提取模式阻抗:FEM 求解器不支持
getZEven/getZOdd。对于带屏蔽的比较,请仅使用 S 参数。 - 需要 PEC:FEM 要求
Conductivity=Inf(PEC)。有限电导率金属(例如 Copper)会报错。比较带屏蔽与不带屏蔽的情况时,两者都使用 PEC。 - 连接器间距:
RFConnector的外半径(默认 1.5 mm)必须能容纳在相邻端口之间。如果端口间距较小,请增大Spacing/GroundPlaneWidth,或减小连接器的OuterRadius。
比较求解器
obj = design(couplerBranchline, 5e9);
freq = linspace(1e9, 5e9, 21);
sp_mom = sparameters(obj, freq, 'SweepOption', 'interp');
pcb = pcbComponent(obj);
pcb.SolverType = 'FEM';
sp_fem = sparameters(pcb, freq); % FEM: interp not applicable
figure;
rfplot(sp_mom); hold on;
rfplot(sp_fem, '--');
legend('MoM', 'FEM');
插值扫描
若要加快多频率分析,请使用插值扫描,而不是逐点进行离散求解。这样速度会显著提升,尤其适用于大型结构。
基本插值
freq = linspace(4.5e9, 5.5e9, 101);
sp = sparameters(obj, freq, 50, 'SweepOption', 'interp');
使用梯度进行插值
使用梯度信息进行更准确的插值:
freq = [4.5e9, 5.5e9]; % Only need start/end — solver picks internal points
sp = sparameters(obj, freq, 50, 'SweepOption', 'interpWithGrad');
何时使用插值
| 场景 | 建议 |
|---|---|
| 窄带(< 2:1 BW) | 'interpWithGrad' — 速度最快且准确 |
| 宽带(> 2:1 BW) | 'interp' — 在宽范围内稳定 |
| 调试 / 单频 | 不使用扫描选项(离散求解) |
| 谐振结构 | 离散求解或使用精细的 'interp' 网格 |
frequencySweep 对象(R2025a)
若要更精细地控制基于插值的扫描,请使用 frequencySweep 对象。该对象提供误差容差、迭代次数限制和有理拟合功能——当默认的 'SweepOption' 设置不够用时很有帮助。
fsweep = frequencySweep;
fsweep.SweepType = "interp"; % "interp" (default) | "interpWithGrad"
fsweep.ErrTol = -80; % dB, default -80
fsweep.NumFreqs = 100; % points to discretize frequency range, default 100
fsweep.NumIters = 25; % max fitting iterations, default 25
freq = linspace(1e9, 10e9, 200);
sp = sparameters(comp, freq, 'SweepOption', fsweep);
% Extract rational fitting model after the sweep
rmodel = getRationalModel(fsweep);
| 属性 | 默认值 | 描述 |
|---|---|---|
SweepType | "interp" | 插值类型;"interpWithGrad" 使用梯度信息 |
ErrTol | -80 dB | 拟合迭代之间的最大误差容差 |
NumFreqs | 100 | 用于离散化频率范围的点数 |
NumIters | 25 | 最大拟合迭代次数 |
网格控制
网格密度会直接影响准确性和计算时间。
设置最大边长
经验法则:最高频率下的 MaxEdgeLength ≤ λ/8。
fc = 10e9;
lambda = 3e8 / fc;
mesh(obj, 'MaxEdgeLength', lambda/8);
查看网格
figure;
mesh(obj); % Visualize default mesh
figure;
mesh(obj, 'MaxEdgeLength', 1e-3); % Visualize refined mesh
网格配置
在自动网格划分和手动网格划分之间切换:
meshconfig(obj, 'manual');
mesh(obj, 'MaxEdgeLength', 0.5e-3, 'MinEdgeLength', 0.1e-3);
meshconfig(obj, 'auto'); % Revert to automatic meshing
求解前检查点:检查网格和内存
目录组件会生成密集的自动网格,即使使用插值扫频也可能显著增加运行时间。在开始完整求解前,务必先检查:
fc = 10e9;
memoryEstimate(obj, fc, 'RetainMesh', true); % Estimate RAM; retain mesh for inspection
mesh(obj); % Visualize — check if overly dense
% If too dense or memory too high, coarsen
lambda = physconst('LightSpeed') / fc;
mesh(obj, 'MaxEdgeLength', lambda/6); % Relax from default
memoryEstimate(obj, fc, 'RetainMesh', true); % Re-check after coarsening
'RetainMesh', true 选项会将生成的网格保留在对象上,以便立即进行可视化。若不使用此选项,估算完成后网格会被丢弃。
场可视化
EHfields — 电场和磁场
单点处
ind = spiralInductor;
[e, h] = EHfields(ind, 4e9, [0; 0; 1]); % Point at (0,0,1) meters
平面网格上的近场
fc = 5e9;
Nx = 80; Ny = 60;
xVec = linspace(-0.02, 0.02, Nx);
yVec = linspace(-0.015, 0.015, Ny);
[Xg, Yg] = meshgrid(xVec, yVec);
Zg = 2e-3 * ones(size(Xg)); % Observation plane at z = 2 mm
points = [Xg(:)'; Yg(:)'; Zg(:)'];
[eNear, hNear] = EHfields(obj, fc, points);
eMag2D = reshape(vecnorm(eNear), Ny, Nx);
figure;
imagesc(xVec*1e3, yVec*1e3, 20*log10(eMag2D));
xlabel('x (mm)'); ylabel('y (mm)');
title(sprintf('|E| at z=2mm, f=%.1f GHz', fc/1e9));
colorbar; axis equal tight;
观测平面选择
| 结构类型 | 推荐切片 | 原因 |
|---|---|---|
| 水平走线(微带线、短截线) | z = h 处的 X-Y 平面(信号层) | 走线平面处的场最强 |
| 垂直结构(过孔) | y = 0 处的 X-Z 平面 | 查看垂直场变化 |
| T 形结/短截线 | 朝短截线偏移的 X-Y 平面 | 捕捉开路端的边缘场 |
远场(默认球面)
EHfields(obj, fc, ViewField="E"); % Plot only, no output
电流和电荷分布
表面电流
figure;
current(obj, 5e9); % Linear scale
figure;
current(obj, 5e9, scale="log"); % Log scale for dynamic range
电荷分布
figure;
charge(obj, 5e9); % On metal surface
figure;
charge(obj, 5e9, 'dielectric'); % On dielectric surface
馈电电流与频率
freq = linspace(1e9, 10e9, 101);
feedCurrent(obj, freq); % Plots feed current magnitude
传输线 RLGC 和阻抗
有关 pcb2D 横截面分析、RLGC 提取、特性阻抗(getZ0)和传播延迟,请参阅 matlab-design-pcb-transmission-line。
行为级 S 参数(快速解析模型)
行为级模型使用闭式解析近似计算 S 参数,而不进行全波电磁仿真。其速度快出多个数量级,适用于初步探索、电路级仿真和优化内循环。
语法
S = sparameters(obj, freq, Behavioral=true); % Named argument
S = sparameters(obj, freq, 'Behavioral', true); % Name-value pair
支持的对象
行为级模式适用于:
| 类别 | 对象 |
|---|---|
| 目录组件 | coplanarWaveguide、microstripLine、stripLine、spiralInductor、interdigitalCapacitor 以及大多数目录对象 |
| pcbComponent 封装器 | 任意包含微带弯折、交叉、T 形或其他不连续形状的 pcbComponent |
常见模式
传输线不连续结构——将形状封装在 pcbComponent 中,然后比较行为级模型与全波结果:
m = microstripLine(Length=0.04, Width=2.7e-3, Height=1.6e-3);
shape = bendMitered(Length=[m.Length/2, m.Length/2], ...
Width=[m.Width, m.Width], MiterDiagonal=sqrt(2)*m.Width);
pcb = pcbComponent(shape);
pcb.BoardThickness = m.Substrate.Thickness;
pcb.Layers{2} = m.Substrate;
freq = (1:40)*100e6;
S_fast = sparameters(pcb, freq, Behavioral=true); % ~instant
S_em = sparameters(pcb, freq, 'SweepOption', 'interp'); % Full MoM solve
直接用于目录对象:
cpw = design(coplanarWaveguide, 3e9, LineLength=0.5, Z0=75);
cpw.Conductor = metal("Gold");
S = sparameters(cpw, 3e9, Behavioral=true);
何时使用行为级模型与全波模型
| 场景 | 建议 |
|---|---|
| 快速估算阻抗/损耗 | 行为级模型 |
| 优化内循环 | 行为级模型 |
通过 pcbElement 进行电路级级联 | 行为级模型(在 pcbElement 中设置 Behavioral=true) |
| 最终设计验证 | 全波模型(默认) |
| 复杂多层结构 | 全波模型 |
| 近场/电流/电荷可视化 | 仅全波模型 |
精度限制
行为级模型假设微带线/带状线几何结构理想,因此在以下情况下可能与全波结果存在差异:
- 高频(高于第一个高阶模式)
- 走线过宽或过窄(超出准 TEM 工作范围)
- 复杂多层基板
- 辐射或表面波耦合显著的结构
注意事项
-
先询问频率范围:不要假设分析频率范围。运行
sparameters前,务必先询问用户想要分析哪个频段。错误的假设会浪费求解时间,还可能错过结构的工作频段。 -
密集自动网格会耗尽内存:目录中的组件通常会生成过于密集的网格。在进行全频段扫描前,务必先运行
memoryEstimate(obj, fc, 'RetainMesh', true),然后运行mesh(obj)进行可视化。如果网格过细或内存占用过高,请在求解前使用mesh(obj, 'MaxEdgeLength', lambda/6)调粗网格。即使使用插值扫描,这一点也同样适用——网格决定了每个频点的计算成本。 -
FEM 只能通过 pcbComponent 使用,且在 Windows 上需要 WSL:目录对象和
pcbComponent都具有SolverType属性,但在目录对象上将其设为'FEM'会报错(例如,“不支持 couplerBranchline 的 FEM 求解器”)。请先转换目录对象:pcb = pcbComponent(catalogObj); pcb.SolverType = 'FEM';。此外,FEM 需要 Windows Subsystem for Linux(WSL)——如果未安装 WSL,求解将失败。WSL 不可用时,请使用 MoM(默认值)。 -
馈电错误:如果
sparameters因馈电相关错误而失败,请确认FeedLocations坐标位于金属走线上,并且FeedDiameter能够容纳在走线宽度内。馈电点与任一走线边缘的距离至少应为FeedDiameter/2。 -
插值扫描的频率范围:对于
'interpWithGrad',只需指定[fmin, fmax],求解器会选择内部采样点。对于'interp',请提供完整的频率向量;求解器会在已计算的频点之间进行插值。 -
大型求解之间关闭图窗:包含大量图窗或大型网格的 EHfields 可能会占用会话内存。在交互运行时,请在各分析部分之间使用
close all。 -
行为模型不支持场、电流或电荷。 无论
Behavioral标志如何,current()、charge()和EHfields()始终使用全波求解器。只有sparameters()会遵循该标志。 -
solver()不接受名称-值参数:不要传入solver(comp, 'SolverType', 'FEM')——这会报错:“输入参数过多”。请先设置comp.SolverType = 'FEM',然后调用s = solver(comp)获取 FEM 求解器对象。边界条件应在该求解器对象上配置(s.BoundaryCondition),而不是在组件上配置。 -
EHfields 的点必须是 3×N,而不是 N×3:
EHfields(obj, fc, points)的points参数必须是一个 3 行矩阵,其中每列为[x; y; z]。不要传入 N×3 矩阵。请使用以下代码构建:points = [Xg(:)'; Yg(:)'; Zg(:)']
相关技能
matlab-manage-pcb-material— 材料属性会影响求解器精度和损耗建模matlab-assemble-pcb-layout— 构建待分析的自定义结构matlab-design-pcb-transmission-line— 传输线参数提取、pcb2D、RLGC、串扰matlab-design-pcb-passive— 电感器/电容器的行为 S 参数
版权所有 2026 The MathWorks, Inc.