mcpField
M
matlab-analyze-em

matlab-analyze-em

github.com/matlab其他1.2k84 次安装1 天前更新
代码仓库

关于 matlab-analyze-em

matlab-analyze-em 是一项在 MATLAB 中分析 RF PCB 元件电磁性能的技能,面向工程师。它介绍 S 参数提取、求解器选择、频率扫描和网格配置,以及场与电流可视化。

主要功能

  1. 01提取并绘制 S 参数
  2. 02比较 MoM 与 FEM 求解器
  3. 03配置插值频率扫描
  4. 04控制网格并估算内存
  5. 05可视化电磁场、电流与电荷

适用场景

  1. 01检查 RF PCB 元件的频率响应
  2. 02比较结构的不同求解器结果
  3. 03权衡网格精度与计算开销
  4. 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

典型工作流

  1. 之前: 使用 matlab-manage-pcb-material 设置基板/导体;然后使用设计技能或 matlab-assemble-pcb-layout 创建组件
  2. 此技能: 提取 S 参数、可视化场和电流,并验证性能
  3. 之后: 使用 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 引入)需要两个依赖项:

  1. Integro-Differential Modeling Framework for MATLAB(IDMF) — 通过 Home > Add-Ons > 搜索 "Integro-Differential Modeling Framework for MATLAB" 进行安装。使用 matlab.addons.installedAddons 验证。
  2. 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拟合迭代之间的最大误差容差
NumFreqs100用于离散化频率范围的点数
NumIters25最大拟合迭代次数

网格控制

网格密度会直接影响准确性和计算时间。

设置最大边长

经验法则:最高频率下的 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 工作范围)
  • 复杂多层基板
  • 辐射或表面波耦合显著的结构

注意事项

  1. 先询问频率范围:不要假设分析频率范围。运行 sparameters 前,务必先询问用户想要分析哪个频段。错误的假设会浪费求解时间,还可能错过结构的工作频段。

  2. 密集自动网格会耗尽内存:目录中的组件通常会生成过于密集的网格。在进行全频段扫描前,务必先运行 memoryEstimate(obj, fc, 'RetainMesh', true),然后运行 mesh(obj) 进行可视化。如果网格过细或内存占用过高,请在求解前使用 mesh(obj, 'MaxEdgeLength', lambda/6) 调粗网格。即使使用插值扫描,这一点也同样适用——网格决定了每个频点的计算成本。

  3. FEM 只能通过 pcbComponent 使用,且在 Windows 上需要 WSL:目录对象和 pcbComponent 都具有 SolverType 属性,但在目录对象上将其设为 'FEM' 会报错(例如,“不支持 couplerBranchline 的 FEM 求解器”)。请先转换目录对象:pcb = pcbComponent(catalogObj); pcb.SolverType = 'FEM';。此外,FEM 需要 Windows Subsystem for Linux(WSL)——如果未安装 WSL,求解将失败。WSL 不可用时,请使用 MoM(默认值)。

  4. 馈电错误:如果 sparameters 因馈电相关错误而失败,请确认 FeedLocations 坐标位于金属走线上,并且 FeedDiameter 能够容纳在走线宽度内。馈电点与任一走线边缘的距离至少应为 FeedDiameter/2。

  5. 插值扫描的频率范围:对于 'interpWithGrad',只需指定 [fmin, fmax],求解器会选择内部采样点。对于 'interp',请提供完整的频率向量;求解器会在已计算的频点之间进行插值。

  6. 大型求解之间关闭图窗:包含大量图窗或大型网格的 EHfields 可能会占用会话内存。在交互运行时,请在各分析部分之间使用 close all。

  7. 行为模型不支持场、电流或电荷。 无论 Behavioral 标志如何,current()、charge() 和 EHfields() 始终使用全波求解器。只有 sparameters() 会遵循该标志。

  8. solver() 不接受名称-值参数:不要传入 solver(comp, 'SolverType', 'FEM')——这会报错:“输入参数过多”。请先设置 comp.SolverType = 'FEM',然后调用 s = solver(comp) 获取 FEM 求解器对象。边界条件应在该求解器对象上配置(s.BoundaryCondition),而不是在组件上配置。

  9. 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.

评论

支持 Markdown