Skill v1.0.1
currentAutomated scan100/100+2 new
version: "1.0.1" name: matlab-design-pcb-passive description: "Spiral inductors, interdigital capacitors, baluns, resonators, phase shifters for impedance matching, DC blocking, and bias tees. TRIGGER: user asks to design or create a spiral inductor, interdigital capacitor, balun, resonator, phase shifter, or other passive RF component. Invoke BEFORE writing code — class names and property patterns are non-obvious. SKIP: filter design (use matlab-design-pcb-filter), coupler/splitter design (use matlab-design-pcb-coupler), transmission line design (use matlab-design-pcb-transmission-line), EM analysis (use matlab-analyze-em), material setup only (use matlab-manage-pcb-material)." license: https://www.mathworks.com/content/dam/mathworks/license/pmrl/license.md metadata: author: MathWorks version: "1.0"
Designing Passive Components
When to Use
- Designing spiral inductors or interdigital capacitors for RF circuits
- Extracting inductance, capacitance, or self-resonant frequency from passive components
- Creating ring or split-ring resonators for filtering or metamaterial applications
- Designing coupled-line or Marchand baluns for balanced-to-unbalanced conversion
- Building Schiffman phase shifters or radial stubs
When NOT to Use
- Designing transmission lines (microstrip, stripline, CPW) — use
matlab-design-pcb-transmission-line - Designing filters (bandpass, lowpass, bandstop) — use
matlab-design-pcb-filter - Designing couplers or splitters — use
matlab-design-pcb-coupler - Setting up substrate materials — use
matlab-manage-pcb-material - Running EM analysis after design — use
matlab-analyze-em
Typical Workflow
- Before:
matlab-manage-pcb-material— set up substrate and conductor - This skill: Design the passive component (inductor, capacitor, balun, resonator)
- Check mesh/memory:
memoryEstimate(obj, fc, 'RetainMesh', true)— inspect auto-mesh density before committing to a full solve - After:
matlab-analyze-em— validate S-parameters →matlab-optimize-pcb-design— tune dimensions →matlab-integrate-pcb-circuit— cascade into circuit
Quick Reference
| Task | Code | |
|---|---|---|
| Spiral inductor | ind = spiralInductor | |
| Interdigital capacitor | cap = interdigitalCapacitor | |
| Extract inductance | L = inductance(ind, freq) | |
| Extract capacitance | C = capacitance(cap, freq, DeEmbed=true) | |
| Behavioral S-params | S = sparameters(obj, freq, Behavioral=true) | |
| Ring resonator | r = design(resonatorRing, freq) | |
| Split-ring (custom) | r = resonatorSplitRingCustom | |
| Split-ring (square) | r = resonatorSplitRingSquare | |
| Coupled-line balun | b = balunCoupledLine | |
| Marchand balun | b = balunMarchand | |
| Phase shifter | ps = design(phaseShifter, freq, PhaseShift=90) | |
| Radial stub | stub = stubRadialShunt | |
| Optimize | optimize(obj, freq, ...) |
Spiral Inductors
Creating and Configuring
ind = spiralInductor;ind.SpiralShape = 'Square'; % 'Square' | 'Circle' | 'Hexagon' | 'Octagon'ind.InnerDiameter = 5e-4;ind.Width = 2.5e-4;ind.Spacing = 2.5e-4;ind.NumTurns = 4;ind.Height = 1.016e-3; % Must be a cumulative substrate layer boundaryind.GroundPlaneLength = 5.6e-3;ind.GroundPlaneWidth = 5.6e-3;
RFIC Substrates (Silicon/SiO2)
ind = spiralInductor;ind.Substrate = dielectric('Name', {'Silicon','SiO2'}, ...'EpsilonR', [11.9, 4.1], 'LossTangent', [0.005, 0], ...'Thickness', [300e-6, 3e-6]);ind.Height = 303e-6; % Signal trace at top of stack
Spiral Shape and Q-Factor Tradeoffs
| Shape | Q-Factor | Notes | |
|---|---|---|---|
'Circle' | Highest | Best electrical performance | |
'Octagon' | High | Close to circular; easier to fabricate | |
'Hexagon' | Moderate | Compromise | |
'Square' | Lowest | Easiest to manufacture; current crowding at corners |
Ground Plane Proximity Effect
Smaller Height increases capacitive coupling to ground, reducing inductance, Q-factor, and self-resonant frequency. Account for this when the PCB stackup constrains Height.
Inductance Extraction
L = inductance(ind, 600e6); % Scalar frequency → scalar (H)L = inductance(ind, linspace(100e6, 1e9, 30)); % Vector → vector
Self-Resonant Frequency (SRF)
At SRF, parasitic capacitance resonates with inductance — impedance peaks, then the inductor behaves as a capacitor. Design so the operating band stays below SRF/3 to SRF/2.
freq = linspace(100e6, 10e9, 201);L = inductance(ind, freq);% Sign change: L > 0 (inductive) → L < 0 (capacitive) at SRF
Visualization
show(ind)current(ind, 600e6)charge(ind, 600e6)[E, H] = EHfields(ind, 4e9, [0; 0; 1]);
Interdigital Capacitors
Creating and Configuring
cap = interdigitalCapacitor;cap.NumFingers = 4;cap.FingerLength = 0.0137;cap.FingerWidth = 3.16e-4;cap.FingerSpacing = 3e-4;cap.FingerEdgeGap = 3.41e-4;cap.TerminalStripWidth = 5e-4;cap.PortLineWidth = 1.9e-3;cap.PortLineLength = 3e-3;cap.Height = 7.87e-4;
Capacitance Extraction
C = capacitance(cap, 5e9); % RawC = capacitance(cap, 5e9, DeEmbed=true); % De-embeddedC = capacitance(cap, 5e9, DeEmbed=true, IncludeParasitics=true); % With parasitics
- DeEmbed removes feed line effects to isolate the capacitor.
- IncludeParasitics adds parasitic inductance/resistance from the finger structure.
Behavioral S-Parameters
Both spiralInductor and interdigitalCapacitor support fast behavioral models:
S = sparameters(ind, freq, Behavioral=true); % ~instantS = sparameters(cap, freq, Behavioral=true);
Use for initial exploration; switch to full-wave (Behavioral=false, the default) for validation. Before a full-wave solve, always check mesh density:
memoryEstimate(ind, fc, 'RetainMesh', true); % Check auto-mesh before full-wavesp = sparameters(ind, freq, 'SweepOption', 'interp');
Ring Resonators
resonatorRing is a microstrip ring resonator coupled to two feed lines via a gap.
r = resonatorRing;r.RingRadiusOuter = 0.01;r.RingWidth = 4e-3;r.CouplingGap = 1e-3;r.PortLineLength = 0.01;r.PortLineWidth = 5e-3;r.Height = 1.6e-3;r.GroundPlaneWidth = 0.04;
Frequency-Based Design
r = design(resonatorRing, 1.8e9); % 50 Ω defaultr = design(resonatorRing, 2.5e9, Z0=75); % 75 Ω
Split-Ring Resonators
Two object types: resonatorSplitRingCustom (pluggable shape) and resonatorSplitRingSquare (pre-configured square).
Custom Split-Ring Resonator
r = resonatorSplitRingCustom;sr = splitRing(Type="Hexagon", NumRings=3);sr.SplitSide = [2 3 5];r.Resonator = sr;r.FeedType = 'Tapped'; % 'Tapped' (default) or 'Coupled'r.PortLineLength = 0.01;r.PortLineWidth = 7.5e-4;r.Height = 8.13e-4;
Square Split-Ring Resonator
r = resonatorSplitRingSquare;r.RingLengthInner = 3.6e-3;r.RingWidth = 5e-4;r.RingSpacing = 3e-4;r.SplitGap = 5e-4;r.CouplingGap = 2.5e-4;r.NumResonator = 5;r.ResonatorSpacing = 4e-3;
For the full splitRing shape property table, CSRR ground-plane etching, and SIW integration patterns, see references/resonators-detail.md.
Coupled-Line Baluns
balunCoupledLine is a 3-section coupled-line balun (balanced-to-unbalanced converter).
b = balunCoupledLine;b.NumCoupledLineSection = 3;b.CoupledLineLength = 0.0153;b.CoupledLineWidth = 4e-4;b.CoupledLineSpacing = 1.4e-4;b.OutputLineLength = 0.0124;b.OutputLineWidth = 1.53e-4;b.OutputLineSpacing = 0.011;b.Height = 1.3e-3;
balunCoupledLine has no design() method. Use designCoupledLine, designOutputLine, designUncoupledLine for section-by-section sizing from impedance targets. See references/resonators-detail.md for the full API.
Marchand Baluns
balunMarchand is a broadband balun using λ/4 coupled-line sections.
bm = balunMarchand;bm.CoupledLineLength = 0.0178;bm.CoupledLineWidth = 3e-3;bm.CoupledLineSpacing = 1.5e-4;bm.OutputLineLength = 0.016;bm.OutputLineWidth = 2.9e-4;bm.Height = 1.6e-3;
No design() method. Set dimensions manually or use optimize().
Phase Shifters
phaseShifter is a Schiffman-type phase shifter using coupled-line sections.
ps = design(phaseShifter, 1.8e9); % Default phase shiftps = design(phaseShifter, 1.8e9, PhaseShift=90); % 90° phase shift
Properties
ps.NumSections = 1;ps.PortLineLength = 0.01;ps.PortLineWidth = 5e-3;ps.Height = 1.6e-3;ps.SectionShape = ubendRightAngle; % Default U-bend shape
Radial Stubs
stubRadialShunt creates a single- or double-radial stub shunt. Radial stubs provide wideband short-circuit behavior compared to rectangular stubs.
stub = stubRadialShunt;stub.StubType = "Single"; % "Single" (default) or "Double"stub.OuterRadius = 8.5e-3;stub.InnerRadius = 1.2e-3;stub.Angle = 90; % Range [5, 175] degreesstub.PortLineWidth = 2.5e-3;stub.PortLineLength = 0.0137;stub.Height = 1.6e-3;
For double-stub vector property configuration, see references/resonators-detail.md.
Circuit Integration
Wrap passive components in pcbElement for RF Toolbox circuit assembly:
ckt = circuit;c1 = interdigitalCapacitor;c2 = interdigitalCapacitor(NumFingers=3);p = pcbElement(c2, 'Behavioral', false);add(ckt, [1 2 0 0], c1);add(ckt, [2 3 0 0], p);setports(ckt, [1 0], [3 0]);S = sparameters(ckt, 8e9);
Optimization
All objects in this skill support optimize():
ind = spiralInductor(NumTurns=3);optimize(ind, linspace(1e9, 3e9, 11), ...'Properties', {'Width', 'Spacing', 'InnerDiameter'}, ...'LowerBound', [1e-4, 1e-4, 3e-4], ...'UpperBound', [5e-4, 5e-4, 1e-3], ...'Objective', 'maximizeBandwidth');
Multilayer Dielectric Pattern
All objects follow the same pattern — set Thickness before assigning to the component:
sub = dielectric('FR4', 'Teflon');sub.Thickness = [1.6e-3, 0.8e-3];obj.Substrate = sub;obj.Height = 0.8e-3; % Must match a cumulative layer boundary
Pitfalls
- Use interpolating sweep for S-parameters: Always use
sparameters(obj, freq, 'SweepOption', 'interp')for MoM solves. Direct sweeps solve at every frequency point individually and are significantly slower.
- Check mesh density before solving: Spiral inductors and interdigital capacitors generate dense auto-meshes. Always run
memoryEstimate(obj, fc, 'RetainMesh', true)beforesparameters(). If memory is excessive, coarsen:mesh(obj, 'MaxEdgeLength', lambda/6). Seematlab-analyze-emfor full mesh inspection workflow.
- No `design()` for inductors/capacitors.
spiralInductorandinterdigitalCapacitorhave nodesign()method. Set dimensions manually or useoptimize().
- Inductance/capacitance are frequency-dependent. Both require a frequency argument — no DC extraction. Parasitic effects shift the value at high frequencies.
- DeEmbed matters for capacitance. Without
DeEmbed=true, extracted capacitance includes feed line contributions.
- SpiralShape is case-sensitive. Use
'Square','Circle','Hexagon','Octagon'.
- Behavioral vs full-wave accuracy. Behavioral S-parameters diverge near SRF (inductors) or finger resonances (capacitors).
- Height must be a cumulative substrate boundary. For Thickness=[t1, t2], valid Heights are t1, t1+t2. Applies to all objects in this skill.
- spiralInductor requires multi-layer substrate. The underpass feed routing needs ≥ 2 dielectric layers. A single layer errors with "More than one substrate is required."
- GroundPlane dimensions. Keep ground plane ≥ 2× the component footprint to avoid truncating fringing fields.
- No `design()` for baluns.
balunCoupledLineandbalunMarchandhave nodesign()method. Use section-design functions oroptimize().
- No `design()` for split-ring resonators. Only
resonatorRingsupportsdesign().
- `splitRing` is a shape, not a component. Cannot be analyzed directly — attach to
resonatorSplitRingCustomor embed in apcbComponent.
- PhaseShift units are degrees. The
PhaseShiftparameter indesign(phaseShifter, ...)is degrees, not radians.
- `stubRadialShunt` has no `design()` method. Set dimensions manually or use
optimize().
- Polygonal SplitSide defaults may be invalid. Hexagons require
SplitSidefrom {2, 3, 5, 6}. Always set explicitly for polygonal types with multiple rings.
Related Skills
matlab-manage-pcb-material— Substrate and conductor setupmatlab-analyze-em— S-parameters, fields, mesh controlmatlab-optimize-pcb-design— optimize() syntax, objectives, solversmatlab-integrate-pcb-circuit— pcbElement circuit integrationmatlab-design-pcb-filter— SIW filters can embed split-ring resonatorsmatlab-assemble-pcb-layout— Custom CSRR structures via pcbComponent + Boolean opsmatlab-design-pcb-coupler— Related coupled-line structures
Copyright 2026 The MathWorks, Inc.