matlab-design-pcb-coupler

$npx mdskill add matlab/matlab-agentic-toolkit/matlab-design-pcb-coupler

Designs couplers, splitters, and Rotman lenses for power division and beam-forming.

  • User needs to create a Wilkinson, branchline, ratrace, or directional coupler.
  • Uses MATLAB RF and PCB Toolbox classes with design() methods.
  • Selects coupler type based on user request and invokes appropriate class.
  • Returns a designed coupler object ready for analysis or integration.

SKILL.md

.github/skills/matlab-design-pcb-couplerView on GitHub ↗
---
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: MathWorks BSD-3-Clause
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-txline`
- 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

1. **Before:** `matlab-manage-pcb-material` — set up substrate and conductor
2. **This skill:** Design the coupler or splitter
3. **Check mesh/memory:** `memoryEstimate(obj, fc, 'RetainMesh', true)` — inspect auto-mesh density before committing to a full solve
4. **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

```matlab
ws = design(wilkinsonSplitter, 3e9);
show(ws);
memoryEstimate(ws, 3e9, 'RetainMesh', true);  % Check mesh before solving
sp = sparameters(ws, linspace(1e9, 5e9, 51), 'SweepOption', 'interp');
rfplot(sp);
```

Key properties: `SplitLineLength`, `SplitLineWidth`, `Resistance`, `PortLineLength`, `PortLineWidth`, `GroundPlaneWidth`.

### Unequal Split

```matlab
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:

```matlab
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

```matlab
ws = design(wilkinsonSplitter, 5e9);
sub = dielectric("FR4", "Teflon");
sub.Thickness = [1e-3 0.5e-3];         % Set Thickness BEFORE assigning to component
ws.Substrate = sub;
ws.Height = 1.5e-3;
show(ws);
```

## Branchline Couplers

### Standard (Single-Section)

```matlab
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)

```matlab
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:

```matlab
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 value
show(bl);
```

### Analysis Methods for Couplers

```matlab
freq = linspace(3e9, 7e9, 51);

% Coupling factor (S31 for branchline)
coupling(bl, freq);

% Directivity
directivity(bl, freq);

% Isolation (S41 for branchline)
isolation(bl, freq);
```

## Ratrace Coupler

180° hybrid (sum/difference port):

```matlab
rr = design(couplerRatrace, 5e9);
show(rr);

freq = linspace(3e9, 7e9, 51);
sp = sparameters(rr, freq, 'SweepOption', 'interp');
rfplot(sp);

% Analysis
coupling(rr, freq);
directivity(rr, freq);
isolation(rr, freq);
```

Key properties: `RingRadius`, `RingWidth`, `PortLineWidth`, `PortLineLength`.

### Charge and Current on Ratrace

```matlab
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:

```matlab
dc = couplerDirectional;
dc.NumSections = 3;
dc.Width = [2.8e-3 2.8e-3 2.8e-3];       % One value per section
dc.Spacing = [1.3e-3 1.3e-3 1.3e-3];     % One value per section
dc.GroundPlaneLength = 0.15;               % Must accommodate total length
show(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 |

```matlab
st = splitterTee;
st = design(splitterTee, 5e9);
show(st);
sp = sparameters(st, linspace(3e9, 7e9, 51), 'SweepOption', 'interp');
rfplot(sp);

% Circular shape variant
st2 = splitterTee(Shape='Circular');
st2 = design(st2, 5e9);
show(st2);
```

### Corporate Power Divider (N-way)

For array feed networks:

```matlab
cpd = powerDividerCorporate;
cpd.NumOutputPorts = 4;       % 1:4 divider
cpd = design(cpd, 5e9);
show(cpd);
sp = sparameters(cpd, linspace(3e9, 7e9, 51), 'SweepOption', 'interp');
rfplot(sp);
```

### 8-Way Corporate Divider

```matlab
cpd = powerDividerCorporate;
cpd.NumOutputPorts = 8;
cpd = design(cpd, 2.4e9);
show(cpd);
```

## SIW Splitter

```matlab
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:

```matlab
siw_s.FeedLine.InputWidth = 1e-3;
siw_s.FeedLine.OutputWidth = 3e-3;
show(siw_s);
```

## Design Workflow

1. **Select topology** based on requirements (equal/unequal split, bandwidth, isolation)
2. **Design at center frequency**: `obj = design(ObjectType, fc)`
3. **Visualize**: `show(obj)`
4. **Analyze S-parameters**: `sparameters(obj, freq, 'SweepOption', 'interp')`
5. **Check metrics**: `coupling`, `directivity`, `isolation`
6. **Customize**: Adjust properties for specific impedance, substrate, dimensions
7. **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 |

```matlab
c = design(couplerBranchline, 2.4e9);
freq = linspace(2e9, 3e9, 101);

coupling(c, freq);              % plots coupling factor
cVal = coupling(c, freq);       % returns numeric values (dB)

directivity(c, freq);           % plots directivity
dVal = directivity(c, freq);    % returns numeric values (dB)

isolation(c, freq);             % plots isolation
iVal = 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.

```matlab
lens = rotmanLens;
lens.NumBeamPorts  = 4;
lens.NumArrayPorts = 4;
lens.NumDummyPorts = 4;       % Absorb reflected energy at lens edges
lens.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.

```matlab
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:

```matlab
s.FeedLine = traceRectangular(Length=3e-3, Width=2e-3);
```

## Pitfalls

1. **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.

2. **Check mesh density before solving**: Catalog couplers generate dense auto-meshes that dominate runtime. Always run `memoryEstimate(obj, fc, 'RetainMesh', true)` before `sparameters()`. If memory is excessive, coarsen: `mesh(obj, 'MaxEdgeLength', lambda/6)`. See `matlab-analyze-em` for full mesh inspection workflow.

3. **Resistance in Wilkinson**: The isolation resistor value defaults to 100 ohm (2×Z0). For non-50-ohm systems, adjust `Resistance` property accordingly.

4. **Port numbering varies**: Different coupler types number ports differently. Always check with `show(obj)` which port is which before interpreting S-parameters.

5. **Wideband coupler sections**: More sections = wider bandwidth but larger size. Each section adds approximately a quarter-wavelength at center frequency.

6. **Corporate divider symmetry**: `powerDividerCorporate` requires `NumOutputPorts` to be a power of 2 (2, 4, 8, 16...).

7. **Corporate divider substrate**: `powerDividerCorporate.Substrate` is read-only. Set the substrate on `corp.SplitterElement.Substrate` instead — the corporate divider builds from its unit `SplitterElement` (a `wilkinsonSplitter`). Note: `design()` may override the substrate thickness.

8. **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.

9. **Set substrate BEFORE design()**: `design(obj, fc)` auto-sizes dimensions based on the current substrate. Setting substrate after `design()` changes the material but does NOT re-compute dimensions — causing incorrect impedance. Always: set `Substrate` first, then call `design()`.

10. **DGS coupling**: Adding DGS to couplers can improve directivity by 10-15 dB but slightly shifts center frequency. Re-tune after adding DGS.

11. **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.

12. **No design() for couplerDirectional**: `couplerDirectional` does not support `design()`. Set `Length`, `Width`, `Spacing`, and `NumSections` manually.

13. **couplerDirectional multi-section dimensions**: When `NumSections > 1`, `Width` and `Spacing` must be vectors with one element per section. `Length` remains scalar. Also increase `GroundPlaneLength` to accommodate the longer structure — the default only fits 1 section.

14. **Cascading couplers with stubs/resonators**: To physically attach a stub or resonator to a coupler port, use `pcbcascade(pcbComponent(coupler), pcbComponent(stub), portA, portB)`. Match `Height`, `Substrate`, and `Conductor` between the two objects. The connected ports disappear — verify surviving port count with `show(combined)`. See `matlab-integrate-pcb-circuit` for cascade details.

15. **Catalog couplers are MoM-only**: Objects like `couplerBranchline` only support MoM natively. To use FEM, wrap in `pcbComponent` and set `SolverType` after 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 configuration
- `matlab-analyze-em` — S-parameter and field analysis
- `matlab-optimize-pcb-design` — Optimizing coupler/splitter performance
- `matlab-integrate-pcb-circuit` — Combining splitters with other components

----

Copyright 2026 The MathWorks, Inc.

More from matlab/matlab-agentic-toolkit

SkillDescription
matlab-access-datafeed>
matlab-add-awgnRead BEFORE writing any code that adds Additive White Gaussian Noise (AWGN) to signals and converts between SNR, Eb/No, Es/No, and per-subcarrier SNR for communications simulations, using awgn(), convertSNR(), berawgn(). The default MATLAB patterns for AWGN (e.g., 'measured' option, manual SNR formulas) produce subtly incorrect results. This skill specifies the correct calling conventions, required function usage, and critical anti-patterns that must be avoided.
matlab-analyze-ams-waveformAnalyze AMS waveform data using Mixed-Signal Blockset utilities: phase noise measurement, clock jitter, anti-aliased resampling, timing measurements, lock time, INL/DNL, ADC/DAC calibration, HSpice import. Use when analyzing time-domain voltage from PLL/VCO/clock simulations, measuring phase noise from variable-step solver output, computing jitter, or resampling non-uniform data.
matlab-analyze-dataAnalyze data using MATLAB. Use when the task involves tables, timetables, time-series data, numeric arrays, sensor matrices, or gridded data — including but not limited to exploring, filtering, sorting, cleaning, transforming, aggregating, smoothing, padding, trimming, and answering questions about data. MATLAB provides extensive, easy-to-use built-in functions for these workflows with no additional products required.
matlab-analyze-dependenciesAnalyze the effective toolbox file set to produce a Dependency Manifest — classify all transitive dependencies as included, product, add-on, or external-unresolved, then present resolution options with tradeoffs. Use after matlab-define-toolbox-api when the spec is approved.
matlab-analyze-emS-parameters, insertion loss, fields, currents, mesh control, and solver selection for RF PCB performance validation. TRIGGER: user asks to compute S-parameters, analyze insertion/return loss, extract fields or currents, compare MoM vs FEM, or control mesh for any RF PCB component. Invoke BEFORE writing sparameters() or solver code — API is non-obvious. SKIP: designing or creating components (use the specific matlab-design-pcb-* skill), material/stackup setup only (use matlab-manage-pcb-material), optimization sweeps (use matlab-optimize-pcb-design), PDN/IR-drop analysis (use matlab-analyze-pcb-pdn).
matlab-analyze-installed-antennaAnalyze antennas installed on electrically large conducting platforms using MATLAB Antenna Toolbox. Loads platform geometry from STL/STEP/IGES, installs antenna elements, selects electromagnetic solvers (MoM-PO, FMM, MoM), and computes patterns, impedance, coupling, and efficiency. Use when the user wants to model an antenna on a vehicle, aircraft, ship, satellite, or other large structure.
matlab-analyze-pcb-pdnPDN DC voltage/current analysis, IR drop, design rule checking, and multi-net batch analysis on imported PCB layouts. TRIGGER: user asks about power integrity, PDN analysis, IR drop, voltage distribution, current density, power nets, or design rule checking on a PCB. Invoke BEFORE writing code — the PDN API chain is specialized and non-obvious. SKIP: importing a PCB file (use matlab-read-pcb-layout), EM field/S-parameter extraction (use matlab-analyze-em), material/stackup setup only (use matlab-manage-pcb-material), transmission line design (use matlab-design-pcb-txline).
matlab-analyze-rcsCalculate and visualize monostatic and bistatic radar cross section (RCS) using MATLAB Antenna Toolbox. Computes RCS of platforms, antennas, and arrays with PO, MoM, and FMM solvers, supporting HH/VV/HV/VH polarization, GPU acceleration, and near-field observation. Use when the user wants to compute, plot, or analyze radar cross section.
matlab-analyze-rf-propagationAnalyze RF propagation and plan wireless sites using MATLAB Antenna Toolbox. Creates transmitter/receiver sites, computes signal strength, coverage maps, SINR, line-of-sight, and ray tracing in geographic or indoor environments. Supports multiple propagation models (free-space, close-in, Longley-Rice, ray tracing, rain/gas/fog), custom terrain, building data, and directional antennas. Use when the user wants to compute coverage, signal strength, path loss, SINR, ray tracing, or plan a wireless network.