Skill v1.0.1
currentAutomated scan100/100+1 new
version: "1.0.1" name: matlab-design-pcb-coupler description: "Wilkinson, branchline, ratrace, directional couplers, corporate dividers, Rotman lenses for power splitting and beam-forming. TRIGGER: user asks to design, create, or analyze any coupler, splitter, power divider, combiner, or Rotman lens. Invoke BEFORE writing code — class names and design() availability vary per coupler type. SKIP: EM simulation/S-parameter extraction of an existing component (use matlab-analyze-em), building custom non-catalog geometry (use matlab-assemble-pcb-layout), material/stackup setup only (use matlab-manage-pcb-material), cascading multiple components (use matlab-integrate-pcb-circuit)." license: https://www.mathworks.com/content/dam/mathworks/license/pmrl/license.md metadata: author: MathWorks version: "1.0"
Designing Couplers and Splitters
When to Use
- Designing Wilkinson splitters (equal, unequal, wideband) for power division
- Creating branchline or ratrace couplers for quadrature or sum/difference networks
- Building corporate power dividers for array feed networks
- Designing directional couplers for signal sampling
- Creating SIW splitters or Rotman lenses for beam-forming
When NOT to Use
- Designing transmission lines — use
matlab-design-pcb-transmission-line - Designing filters — use
matlab-design-pcb-filter - Designing passive components (inductors, capacitors, baluns) — use
matlab-design-pcb-passive - Cascading couplers with other components — use
matlab-integrate-pcb-circuit - Optimizing coupler performance — use
matlab-optimize-pcb-design
Typical Workflow
- Before:
matlab-manage-pcb-material— set up substrate and conductor - This skill: Design the coupler or splitter
- 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 larger network
Quick Reference — Component Selection
| Object | Type | Ports | Best For | |
|---|---|---|---|---|
wilkinsonSplitter | Equal power divider | 3 | Standard 2-way equal split | |
wilkinsonSplitterUnequal | Unequal power divider | 3 | Asymmetric power distribution | |
wilkinsonSplitterWideband | Wideband equal divider | 3 | Multi-octave equal split | |
couplerBranchline | 90° hybrid | 4 | Quadrature combining/splitting | |
couplerBranchlineWideband | Wideband 90° hybrid | 4 | Multi-section wideband quadrature | |
couplerRatrace | 180° hybrid | 4 | Sum/difference networks | |
couplerDirectional | Directional coupler | 4 | Sampling, multi-section symmetric | |
splitterTee | T-junction | 3 | Simple reactive split | |
powerDividerCorporate | N-way corporate | N+1 | Array feed networks | |
SIWSplitter | SIW power divider | 3 | High-freq waveguide split | |
rotmanLens | Beam-forming network | N beam + N array | True-time-delay phased arrays |
Wilkinson Splitters
Equal Split
ws = design(wilkinsonSplitter, 3e9);show(ws);memoryEstimate(ws, 3e9, 'RetainMesh', true); % Check mesh before solvingsp = sparameters(ws, linspace(1e9, 5e9, 51), 'SweepOption', 'interp');rfplot(sp);
Key properties: SplitLineLength, SplitLineWidth, Resistance, PortLineLength, PortLineWidth, GroundPlaneWidth.
Unequal Split
ws = wilkinsonSplitterUnequal;ws = design(ws, 3e9);show(ws);
The power division ratio is controlled by the impedance transformation arms.
Property reference (2-element vector properties):
| Property | Description | Default | |
|---|---|---|---|
SplitLineLength | Length of split lines (m) | 0.0279 | |
SplitLineWidth | Width of split lines (m) | [0.0014 0.0049] (2-element vector: one per arm) | |
MatchLineLength | Length of output matching lines (m) | 0.0277 | |
MatchLineWidth | Width of output matching lines (m) | [0.0039 0.0066] (2-element vector: one per arm) | |
Resistance | Isolation resistor (ohms) | 106 |
Wideband Wilkinson
Multi-section for extended bandwidth:
ws = wilkinsonSplitterWideband;ws = design(ws, 5e9);show(ws);sp = sparameters(ws, linspace(2e9, 8e9, 51), 'SweepOption', 'interp');rfplot(sp);
Property reference (vector properties scale with `NumSections`):
| Property | Description | Default (3 sections) | |
|---|---|---|---|
NumSections | Number of cascaded sections | 3 | |
Shape | Shape of sections | "Rectangular" ("Circular") | |
SplitLineWidth | Width of quarter-wave transformers (m) | [8.55e-04 0.0014 0.0021] (vector, one per section) | |
Resistance | Isolation resistor values (ohms) | [100 183.40 141.42] (vector, one per section) |
Multi-Layer Wilkinson
ws = design(wilkinsonSplitter, 5e9);sub = dielectric("FR4", "Teflon");sub.Thickness = [1e-3 0.5e-3]; % Set Thickness BEFORE assigning to componentws.Substrate = sub;ws.Height = 1.5e-3;show(ws);
Branchline Couplers
Standard (Single-Section)
bl = design(couplerBranchline, 5e9);show(bl);freq = linspace(3e9, 7e9, 51);sp = sparameters(bl, freq, 'SweepOption', 'interp');rfplot(sp);
Key properties: SeriesArmLength, SeriesArmWidth, ShuntArmLength, ShuntArmWidth, PortLineLength, PortLineWidth.
Wideband (Multi-Section)
blw = couplerBranchlineWideband;blw.NumSections = 3;blw = design(blw, 5e9);show(blw);
Property reference (vector properties scale with `NumSections`):
| Property | Description | Default (2 sections) | |
|---|---|---|---|
NumSections | Number of branchline sections | 2 | |
SeriesArmWidth | Width of series arms (m) | 0.0051 (scalar or vector) | |
ShuntArmWidth | Width of shunt arms (m) | [0.00096 0.0029 0.00096] (vector, NumSections+1 elements) | |
IsShielded | Add metal shielding | false |
Branchline with DGS
Adding DGS improves directivity and isolation:
bl = design(couplerBranchline, 5e9);dgsShape = dumbbell;dgsShape.SideLength = 3e-3; % Head size (default Type='Square')dgsShape.ArmLength = 5e-3;dgsShape.ArmWidth = 0.3e-3;bl = dgs(bl, {dgsShape}); % Must capture return valueshow(bl);
Analysis Methods for Couplers
freq = linspace(3e9, 7e9, 51);% Coupling factor (S31 for branchline)coupling(bl, freq);% Directivitydirectivity(bl, freq);% Isolation (S41 for branchline)isolation(bl, freq);
Ratrace Coupler
180° hybrid (sum/difference port):
rr = design(couplerRatrace, 5e9);show(rr);freq = linspace(3e9, 7e9, 51);sp = sparameters(rr, freq, 'SweepOption', 'interp');rfplot(sp);% Analysiscoupling(rr, freq);directivity(rr, freq);isolation(rr, freq);
Key properties: RingRadius, RingWidth, PortLineWidth, PortLineLength.
Charge and Current on Ratrace
figure; current(rr, 5e9);figure; charge(rr, 5e9);
Directional Coupler
Multi-section symmetric directional coupler. Note: couplerDirectional does not have a design function — set properties manually:
dc = couplerDirectional;dc.NumSections = 3;dc.Width = [2.8e-3 2.8e-3 2.8e-3]; % One value per sectiondc.Spacing = [1.3e-3 1.3e-3 1.3e-3]; % One value per sectiondc.GroundPlaneLength = 0.15; % Must accommodate total lengthshow(dc);freq = linspace(3e9, 7e9, 51);coupling(dc, freq);directivity(dc, freq);
Key properties: NumSections, Length (scalar), Width (vector, one per section), Spacing (vector, one per section), PortLineWidth, GroundPlaneLength.
Tee Junction and Corporate Dividers
Splitter Tee
Simple reactive T-junction. The Shape property controls the junction geometry:
| Shape Value | Description | |
|---|---|---|
'RectangularMitered' | Rectangular with mitered bends (default) | |
'RectangularCurved' | Rectangular with curved bends | |
'Circular' | Circular junction |
st = splitterTee;st = design(splitterTee, 5e9);show(st);sp = sparameters(st, linspace(3e9, 7e9, 51), 'SweepOption', 'interp');rfplot(sp);% Circular shape variantst2 = splitterTee(Shape='Circular');st2 = design(st2, 5e9);show(st2);
Corporate Power Divider (N-way)
For array feed networks:
cpd = powerDividerCorporate;cpd.NumOutputPorts = 4; % 1:4 dividercpd = design(cpd, 5e9);show(cpd);sp = sparameters(cpd, linspace(3e9, 7e9, 51), 'SweepOption', 'interp');rfplot(sp);
8-Way Corporate Divider
cpd = powerDividerCorporate;cpd.NumOutputPorts = 8;cpd = design(cpd, 2.4e9);show(cpd);
SIW Splitter
siw_s = SIWSplitter;siw_s = design(siw_s, 10e9);show(siw_s);
The FeedLine property is a traceTapered object controlling the microstrip-to-SIW transition:
siw_s.FeedLine.InputWidth = 1e-3;siw_s.FeedLine.OutputWidth = 3e-3;show(siw_s);
Design Workflow
- Select topology based on requirements (equal/unequal split, bandwidth, isolation)
- Design at center frequency:
obj = design(ObjectType, fc) - Visualize:
show(obj) - Analyze S-parameters:
sparameters(obj, freq, 'SweepOption', 'interp') - Check metrics:
coupling,directivity,isolation - Customize: Adjust properties for specific impedance, substrate, dimensions
- Optimize if needed (see
matlab-optimize-pcb-design)
Coupler-Specific Analysis Functions
These functions are available on 4-port coupler objects: couplerBranchline, couplerBranchlineWideband, couplerRatrace, couplerDirectional.
| Function | What It Measures | Signature | |
|---|---|---|---|
coupling(obj, freq) | Coupling factor (dB) — power transferred to coupled port | Plots by default; cVal = coupling(obj, freq) returns values | |
directivity(obj, freq) | Directivity (dB) — separation of forward vs. backward coupled power | Plots by default; dVal = directivity(obj, freq) returns values | |
isolation(obj, freq) | Isolation (dB) — power leakage to the isolated port | Plots by default; iVal = isolation(obj, freq) returns values |
c = design(couplerBranchline, 2.4e9);freq = linspace(2e9, 3e9, 101);coupling(c, freq); % plots coupling factorcVal = coupling(c, freq); % returns numeric values (dB)directivity(c, freq); % plots directivitydVal = directivity(c, freq); % returns numeric values (dB)isolation(c, freq); % plots isolationiVal = isolation(c, freq); % returns numeric values (dB)
Port Numbering Convention
3-Port (Splitters)
| Port | Function | |
|---|---|---|
| 1 | Input | |
| 2 | Output (through) | |
| 3 | Output (split) |
4-Port (Couplers)
| Port | Branchline | Ratrace | |
|---|---|---|---|
| 1 | Input | Input | |
| 2 | Through (-3dB, 0°) | Sum | |
| 3 | Coupled (-3dB, -90°) | Difference | |
| 4 | Isolated | Through |
Rotman Lens (Beam-Forming Network)
rotmanLens is an N-beam, N-array true-time-delay beam-forming network.
lens = rotmanLens;lens.NumBeamPorts = 4;lens.NumArrayPorts = 4;lens.NumDummyPorts = 4; % Absorb reflected energy at lens edgeslens.BeamPortAngle = 40; % Angular spread of beam ports (degrees)lens.MaxScanAngle = 30; % Maximum scan angle (degrees)lens.Height = 5.08e-4;lens.Conductor = metal("Copper");show(lens);layout(lens);
Key properties: OnaxisFocalLength, OffaxisFocalLength (auto-computed from scan angle). BeamTaper and ArrayTaper control the tapered feed line shapes (traceTapered objects).
SIW Power Divider
SIWSplitter is a substrate integrated waveguide 1:2 power divider.
s = SIWSplitter;s.InputLineLength = 0.0155;s.SplitLineLength = 0.0145;s.Width = 0.0125;s.ViaSpacing = [0.0017, 0.011]; % [wall via spacing, split via spacing]s.ViaDiameter = 5e-4;s.PostDiameter = 2.54e-4;s.PostOffsetX = 5.5e-3;s.Height = 8e-4;show(s);
Custom feed lines via FeedLine property:
s.FeedLine = traceRectangular(Length=3e-3, Width=2e-3);
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: Catalog couplers generate dense auto-meshes that dominate runtime. 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.
- Resistance in Wilkinson: The isolation resistor value defaults to 100 ohm (2×Z0). For non-50-ohm systems, adjust
Resistanceproperty accordingly.
- Port numbering varies: Different coupler types number ports differently. Always check with
show(obj)which port is which before interpreting S-parameters.
- Wideband coupler sections: More sections = wider bandwidth but larger size. Each section adds approximately a quarter-wavelength at center frequency.
- Corporate divider symmetry:
powerDividerCorporaterequiresNumOutputPortsto be a power of 2 (2, 4, 8, 16...).
- Corporate divider substrate:
powerDividerCorporate.Substrateis read-only. Set the substrate oncorp.SplitterElement.Substrateinstead — the corporate divider builds from its unitSplitterElement(awilkinsonSplitter). Note:design()may override the substrate thickness.
- Corporate dividers have large mesh: Multi-way corporate dividers are physically large structures. Memory requirements can exceed hundreds of GB at high frequencies. Use behavioral S-parameters (
'Behavioral', true) for fast amplitude/phase balance verification when full-wave is infeasible.
- Set substrate BEFORE design():
design(obj, fc)auto-sizes dimensions based on the current substrate. Setting substrate afterdesign()changes the material but does NOT re-compute dimensions — causing incorrect impedance. Always: setSubstratefirst, then calldesign().
- DGS coupling: Adding DGS to couplers can improve directivity by 10-15 dB but slightly shifts center frequency. Re-tune after adding DGS.
- SplitterTee is reactive: Unlike Wilkinson, the T-junction is a reactive (lossless) split — output ports are not isolated from each other. Use Wilkinson when isolation matters.
- No design() for couplerDirectional:
couplerDirectionaldoes not supportdesign(). SetLength,Width,Spacing, andNumSectionsmanually.
- couplerDirectional multi-section dimensions: When
NumSections > 1,WidthandSpacingmust be vectors with one element per section.Lengthremains scalar. Also increaseGroundPlaneLengthto accommodate the longer structure — the default only fits 1 section.
- Cascading couplers with stubs/resonators: To physically attach a stub or resonator to a coupler port, use
pcbcascade(pcbComponent(coupler), pcbComponent(stub), portA, portB). MatchHeight,Substrate, andConductorbetween the two objects. The connected ports disappear — verify surviving port count withshow(combined). Seematlab-integrate-pcb-circuitfor cascade details.
- Catalog couplers are MoM-only: Objects like
couplerBranchlineonly support MoM natively. To use FEM, wrap inpcbComponentand setSolverTypeafter construction (not during):
``matlab bl = design(couplerBranchline, 5e9); pcb = pcbComponent(bl); pcb.SolverType = 'FEM'; s = solver(pcb); s.BoundaryCondition = 'perfectly-matched-layer'; ` Do NOT pass SolverType as a name-value to pcbComponent(). FEM requires the IDMF solver engine (WSL on Windows) — if idmf_hub is missing, use MoM instead. See matlab-analyze-em` for FEM prerequisites and troubleshooting.
Related Skills
matlab-manage-pcb-material— Substrate configurationmatlab-analyze-em— S-parameter and field analysismatlab-optimize-pcb-design— Optimizing coupler/splitter performancematlab-integrate-pcb-circuit— Combining splitters with other components
Copyright 2026 The MathWorks, Inc.