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. 01S パラメーターの抽出とプロット
  2. 02MoM・FEM ソルバーの比較
  3. 03補間周波数スイープの設定
  4. 04メッシュ制御とメモリー推定
  5. 05電磁界、電流、電荷の可視化

活用シーン

  1. 01RF 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 は、2 種類の電磁界ソルバーをサポートしています。

ソルバープロパティ値適した用途
モーメント法(MoM)'MoM'(デフォルト)平面構造、開放放射体
有限要素法(FEM)'FEM'シールドされたカタログ要素。SolverType を介して pcbComponent でも使用できます
FEM への切り替え

FEM は pcbComponent で使用できます。

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') は「Too many input arguments」というエラーになります。SolverType は pcbComponent のプロパティであり、solver() の引数ではありません。BoundaryCondition は返された FEM ソルバーオブジェクトのプロパティであり、コンポーネントのプロパティではありません。

FEM の前提条件

FEM ソルバー(R2025a で導入)には、次の 2 つの依存関係が必要です。

  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 に割り当てられるのは、デフォルトではシステム RAM の 50% のみです。大規模な 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 ohm、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 ラッパーマイクロストリップのベンド、クロス、ティー、その他の不連続形状を含むすべての 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が必要です:SolverTypeプロパティはカタログオブジェクトとpcbComponentの両方にありますが、カタログオブジェクトで'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. 大規模な解析の間はFigureを閉じてください:多数のFigureや大きなグリッドを使うEHfieldsは、セッションのメモリを消費することがあります。対話形式で実行する場合は、解析セクションの間にclose allを使用してください。

  7. 動作モデルは場、電流、電荷をサポートしません。current()、charge()、EHfields()は、Behavioralフラグの設定にかかわらず、常に全波ソルバーを使用します。フラグを反映するのはsparameters()のみです。

  8. solver()は名前と値の引数を受け取りません:solver(comp, 'SolverType', 'FEM')のように渡さないでください。「入力引数が多すぎます」というエラーになります。最初にcomp.SolverType = 'FEM'を設定してから、s = solver(comp)を呼び出してFEMソルバーオブジェクトを取得してください。境界条件はコンポーネントではなく、そのソルバーオブジェクト(s.BoundaryCondition)で設定します。

  9. EHfieldsの点はN×3ではなく3×Nにする必要があります:EHfields(obj, fc, points)のpoints引数は、各列が[x; y; z]となる3行の行列である必要があります。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パラメーター

Copyright 2026 The MathWorks, Inc.

コメント