name: matlab-design-reflector-antenna
description: Design and analyze curved reflector antennas using MATLAB Antenna Toolbox. Covers parabolic dishes (prime-focus, Cassegrain, Gregorian), offset dual-reflector configurations, corner reflectors, cylindrical and spherical reflectors, and custom dual-reflector surfaces. Includes exciter selection, f/D ratio design, solver selection (MoM-PO, PO, MoM, FMM), feed offset, and pattern analysis. Use when the user wants to design a dish antenna, parabolic reflector, Cassegrain, Gregorian, corner reflector, or any curved reflector structure.
license: MathWorks BSD-3-Clause
allowed-tools: mcp__matlab__evaluate_matlab_code mcp__matlab__check_matlab_code mcp__matlab__detect_matlab_toolboxes ReadMcpResourceTool
argument-hint: [exciter-type]
metadata:
author: MathWorks
version: "1.0"
Reflector Antenna Design Skill
You are an expert RF and antenna engineer assisting a professional engineer with reflector antenna design. Use MATLAB Antenna Toolbox to design, analyze, and visualize curved reflector antennas including parabolic dishes, dual-reflector systems, corner reflectors, and custom reflector geometries.
Scope: This skill covers curved/shaped reflector structures. The flat reflector (backing structure for dipoles) is a catalog element covered by the general antenna design skill.
When to Use
- User wants to design a parabolic dish, satellite dish, or prime-focus reflector
- User wants a Cassegrain or Gregorian dual-reflector system
- User wants an offset-fed reflector (no blockage)
- User wants a corner reflector antenna
- User wants to use reflectorCalculator for trade studies
- User asks about f/D ratio, aperture efficiency, or feed illumination taper
When NOT to Use
- User wants a flat reflector backing a dipole — use
matlab-design-antenna(catalogreflector) - User wants a reflectarray with unit cells — use
matlab-design-reflectarray - User wants a PCB antenna — use
matlab-design-pcb-antenna - User wants to optimize reflector dimensions — use
matlab-optimize-antenna
Core Workflow
- Parse the request -- Identify reflector type, operating frequency, exciter type, aperture size, f/D ratio, and constraints (offset feed, scan angle, polarization).
- Create the reflector -- Set exciter first (if non-default), then call
design(). - Analyze -- Pattern, gain, beamwidth, impedance, sidelobe level.
- Solver selection -- Choose MoM-PO (default), PO, MoM, or FMM based on electrical size.
- Present results -- Summarize key metrics with units.
Reflector Types
| Type | Description | Default Exciter | Solver |
|---|---|---|---|
reflectorParabolic |
Prime-focus parabolic dish | dipole |
MoM-PO |
cassegrain |
Symmetric dual-reflector (hyperbolic sub) | hornConical |
MoM-PO |
gregorian |
Symmetric dual-reflector (ellipsoidal sub) | hornConical |
MoM-PO |
cassegrainOffset |
Offset Cassegrain (no blockage) | hornConical |
MoM-PO |
gregorianOffset |
Offset Gregorian (no blockage) | hornConical |
MoM-PO |
reflectorCorner |
Corner reflector (directional) | dipole |
MoM |
reflectorCylindrical |
Cylindrical reflector (fan beam) | dipole |
MoM |
reflectorSpherical |
Spherical reflector (wide scan) | dipole |
MoM-PO |
customDualReflectors |
Custom surface geometry | hornConical |
MoM-PO |
Name mapping:
- "dish antenna" / "parabolic dish" / "satellite dish" -->
reflectorParabolic - "Cassegrain" / "dual reflector" -->
cassegrainorcassegrainOffset - "Gregorian" -->
gregorianorgregorianOffset - "corner reflector" -->
reflectorCorner - "offset feed" / "no blockage" -->
cassegrainOffsetorgregorianOffset - "shaped reflector" / "custom surface" -->
customDualReflectors
Creating Reflector Antennas
design() for Reflectors
Reflector antennas use design(obj, freq) with two arguments only. Set the exciter on the object before calling design():
freq = 10e9;
% Default exciter (dipole for parabolic)
rp = design(reflectorParabolic, freq);
% Custom exciter -- set BEFORE design
rp = reflectorParabolic;
rp.Exciter = hornConical;
rp = design(rp, freq);
Important: Unlike finite arrays, design() for reflectors does NOT accept a third element argument. Always set Exciter property first.
Supported Exciters
| Exciter | Works With | Notes |
|---|---|---|
dipole |
All reflectors | Simple, linearly polarized |
horn |
Parabolic, dual-reflectors | Rectangular horn |
hornConical |
All except corner/cylindrical | Best for dishes (circular symmetry) |
helix |
Parabolic, spherical | Circular polarization |
spiralArchimedean |
Parabolic, spherical | Wideband CP |
vivaldi |
Parabolic | Wideband, linear pol |
patchMicrostrip |
Parabolic | Compact feed |
cavity |
NOT supported | Cannot be set as Exciter |
For dual-reflector systems (Cassegrain/Gregorian), hornConical is the standard choice -- it provides symmetric illumination with controlled beamwidth.
Workflow 1: Prime-Focus Parabolic Dish
The most common reflector antenna. Key parameter is the f/D ratio.
freq = 10e9;
c = physconst("LightSpeed");
lambda = c / freq;
% Design with default dipole exciter
rp = design(reflectorParabolic, freq);
figure; show(rp);
figure; pattern(rp, freq);
% Key dimensions
fprintf("Radius: %.4f m (%.1f lambda)\n", rp.Radius, rp.Radius/lambda);
fprintf("Focal length: %.4f m\n", rp.FocalLength);
fprintf("f/D ratio: %.2f\n", rp.FocalLength / (2*rp.Radius));
fprintf("Aperture diameter: %.4f m (%.1f lambda)\n", 2*rp.Radius, 2*rp.Radius/lambda);
With Horn Exciter (Higher Gain)
freq = 10e9;
rp = reflectorParabolic;
rp.Exciter = hornConical;
rp = design(rp, freq);
figure; show(rp);
figure; pattern(rp, freq);
% Beamwidth
[bw, angles] = beamwidth(rp, freq, 0, 1:360);
fprintf("3-dB beamwidth: %.1f deg\n", bw);
Custom f/D Ratio
freq = 12e9;
c = physconst("LightSpeed");
lambda = c / freq;
rp = reflectorParabolic;
rp.Exciter = hornConical;
rp.Radius = 10 * lambda; % 10-lambda aperture radius
rp.FocalLength = 10 * lambda; % f/D = 0.5
rp.FeedOffset = [0 0 0];
figure; show(rp);
figure; pattern(rp, freq);
Workflow 2: Cassegrain and Gregorian (Symmetric Dual-Reflector)
freq = 10e9;
% Cassegrain (hyperbolic subreflector) -- shorter, common for large dishes
cass = design(cassegrain, freq);
figure; show(cass);
figure; pattern(cass, freq);
fprintf("Main radius: %.4f m, Sub radius: %.4f m\n", cass.Radius(1), cass.Radius(2));
% Gregorian (ellipsoidal subreflector) -- lower cross-pol, slightly longer
greg = design(gregorian, freq);
figure; show(greg);
figure; pattern(greg, freq);
Both use hornConical as default exciter. Properties: Radius (1-by-2), FocalLength (1-by-2).
Workflow 3: Offset Dual-Reflector (No Feed Blockage)
Offset configurations eliminate aperture blockage, improving efficiency and reducing sidelobes.
freq = 10e9;
co = design(cassegrainOffset, freq);
figure; show(co);
figure; pattern(co, freq);
fprintf("Offset: %.4f m, InterAxialAngle: %.1f deg\n", co.MainReflectorOffset, co.InterAxialAngle);
% Offset Gregorian
go = design(gregorianOffset, freq);
figure; show(go);
Offset-specific properties: MainReflectorOffset, InterAxialAngle, DualReflectorSpacing, ReflectorTilt ([main, sub] angles).
Workflow 4: Corner Reflector
Two conducting planes at an angle. Corner angle determines gain.
| Corner Angle | Image Sources | Approx. Gain |
|---|---|---|
| 90 | 3 (total 4) | ~10 dBi |
| 60 | 5 (total 6) | ~12 dBi |
| 45 | 7 (total 8) | ~13 dBi |
freq = 1e9;
rc = design(reflectorCorner, freq);
rc.CornerAngle = 90;
figure; show(rc);
figure; pattern(rc, freq);
fprintf("Corner angle: %d deg, Spacing: %.4f m\n", rc.CornerAngle, rc.Spacing);
Workflow 5: Cylindrical and Spherical Reflectors
freq = 1e9;
% Cylindrical -- fan beam (narrow in one plane, wide in other)
% Properties: GroundPlaneLength, GroundPlaneWidth, Spacing, Depth, EnableProbeFeed, Conductor
rcyl = design(reflectorCylindrical, freq);
figure; show(rcyl);
figure; pattern(rcyl, freq);
% Spherical -- wide-angle scanning by moving the feed
% Properties: Radius, Depth, FeedOffset ([0 0 0.075] default), SolverType
rs = design(reflectorSpherical, freq);
figure; show(rs);
figure; pattern(rs, freq);
fprintf("Radius: %.4f m, Depth: %.4f m\n", rs.Radius, rs.Depth);
Using an Array as Exciter
Any array object (linearArray, circularArray, etc.) can be assigned as the Exciter for a reflector. Design the array first, then assign it -- do NOT call design() on the reflector afterward.
freq = 10e9;
c = physconst("LightSpeed");
lambda = c / freq;
% Design the array exciter first
arr = circularArray;
arr.NumElements = 4;
arr.Element = spiralArchimedean;
arr = design(arr, freq);
% Assign to reflector (set dimensions manually -- no design() on reflector)
rp = reflectorParabolic;
rp.Exciter = arr;
rp.Radius = 5*lambda;
rp.FocalLength = 5*lambda; % f/D = 0.5
figure; show(rp);
figure; pattern(rp, freq);
Works with all reflector types:
% Corner reflector with linear array of invertedF
rc = reflectorCorner;
rc.Exciter = design(linearArray, freq, invertedF);
rc.GroundPlaneWidth = 2*lambda;
rc.Spacing = 0.25*lambda;
figure; show(rc);
EnableProbeFeed (Cylindrical Reflector)
reflectorCylindrical has an EnableProbeFeed property that changes the feed mechanism from a standalone exciter to a probe feed through the reflector surface:
rcyl = design(reflectorCylindrical, freq);
rcyl.EnableProbeFeed = true;
figure; show(rcyl);
figure; pattern(rcyl, freq);
Workflow 6: Custom Reflector Surfaces from STL Files
Import arbitrary reflector geometry from STL files using stlread and assign to customDualReflectors. This works for single-reflector setups (only MainReflector needed) or dual-reflector configurations.
Single Custom Reflector from STL
freq = 2e9;
c = physconst("LightSpeed");
lambda = c / freq;
% Load STL as triangulation object
tri = stlread("MyCustomReflector.stl");
% Create reflector with custom surface
cdr = customDualReflectors;
cdr.MainReflector = tri;
cdr.Exciter = dipole(Length=0.15, Width=0.015, Tilt=90, TiltAxis=[0 1 0]);
cdr.FeedOffset = [0 0 0.05]; % exciter position relative to reflector
cdr.RemeshReflectors = true; % re-mesh imported surface for solver
figure; show(cdr);
figure; pattern(cdr, freq);
Dual Custom Reflectors from STL
freq = 10e9;
mainTri = stlread("main_reflector.stl");
subTri = stlread("sub_reflector.stl");
cdr = customDualReflectors;
cdr.MainReflector = mainTri;
cdr.SubReflector = subTri;
cdr.Exciter = hornConical;
cdr.ReflectorOffset = [0 0 0; 0 0 0.1];
cdr.FeedOffset = [0 0 0.15];
figure; show(cdr);
figure; pattern(cdr, freq);
Optimizing Exciter Position on Custom Reflector
To optimize the exciter location on a custom STL reflector without moving the reflector itself, vary FeedOffset using SADEA optimization (see matlab-optimize-antenna):
freq = 2e9;
tri = stlread("MyCustomReflector.stl");
% Define evaluation function that sweeps FeedOffset
evalFcn = @(params) evaluateReflector(params, tri, freq);
% Use SADEA to optimize exciter position
% Optimization variables: FeedOffset [x, y, z]
% See matlab-optimize-antenna skill for full SADEA setup
Properties:
MainReflector: N-by-3 matrix or triangulation object (fromstlread)SubReflector: N-by-3 matrix or triangulation object (optional for single-reflector)ReflectorOffset: 2-by-3 matrix [main offset; sub offset] — additive translation applied on top of existing coordinatesFeedOffset: 1-by-3 vector — controls exciter position independently of reflectorReflectorTilt: [main, sub] tilt anglesRemeshReflectors: true/false (re-mesh imported surfaces for better solver accuracy)
Coordinate System Behavior
customDualReflectors preserves the coordinate system of the data you assign. If your surfaces are already positioned in a shared global frame, they will display correctly without any offset.
If both reflectors appear overlapping, the issue is in the source data — each surface was likely generated in its own local frame (both centered at origin). In that case, use ReflectorOffset to apply the correct relative positioning:
% Surfaces generated independently (both at local origin)
cdr = customDualReflectors;
cdr.MainReflector = mainPoints;
cdr.SubReflector = subPoints;
% ReflectorOffset is ADDITIVE — shifts each surface from its current position
cdr.ReflectorOffset = [0 0 0; 0 0 0.3]; % shift sub 0.3m above main
If surfaces are already in global coordinates (correct relative positions), do NOT apply ReflectorOffset — coordinates are used as-is.
Alternative: installedAntenna (Non-Reflector Structures)
If your custom geometry is an electrically large scattering structure (e.g., vehicle body, aircraft fuselage) rather than a traditional reflector, use installedAntenna instead (see matlab-analyze-installed-antenna):
ant = installedAntenna;
ant.Platform = platform(FileName="vehicle_body.stl", Units="m");
ant.Element = dipole(Length=0.15, Width=0.015);
ant.ElementPosition = [x y z]; % meters — controls antenna placement
figure; show(ant);
figure; pattern(ant, freq);
Use installedAntenna when:
- The structure is not shaped to focus energy (not a dish/reflector)
- You need to study antenna placement on a large platform
- You want MoM-PO or FMM solvers for installed performance
Workflow 7: Reflector Calculator (Gaussian-Beam Analysis)
reflectorCalculator (R2026a) provides fast analytical design using Gaussian-beam methods -- no full-wave solve required. Computes efficiency, gain, beamwidth, and sidelobe level instantly.
See references/reflectorCalculator.md for full details (feed types, single-fed/array-fed/pattern-fed examples, solve output metrics, and bridge to full-wave via createAntenna).
Quick usage:
freq = 12e9;
rc = reflectorCalculator;
rc.Diameter = 1;
rc.FocalLength = 0.9;
rc.ClearanceHeight = 0.1;
rc.FeedType = "singlefed";
rc.RadiatingElement = "horn";
s = solve(rc, freq); % returns 18-metric table instantly
ant = createAntenna(rc, freq); % bridge to customDualReflectors for full-wave
When to use: Trade studies, sizing, feed selection. Then createAntenna for full-wave validation with customDualReflectors.
Solver Selection
| Solver | Speed | Accuracy | Best For |
|---|---|---|---|
"MoM-PO" |
Fast | Good | Default for dishes > 5lambda (hybrid full-wave + PO) |
"PO" |
Fastest | Approximate | Very large dishes (> 50lambda), quick estimates |
"MoM" |
Slowest | Best | Small reflectors (< 5lambda), corner/cylindrical |
"FMM" |
Moderate | Good | Large structures where MoM-PO is insufficient |
rp.SolverType = "MoM-PO"; % Hybrid (default for parabolic)
rp.SolverType = "PO"; % Physical optics only (fastest)
rp.SolverType = "FMM"; % Fast multipole method
Note: reflectorCorner and reflectorCylindrical do NOT have a SolverType property -- they always use MoM.
f/D Ratio Design Guide
The focal-length-to-diameter ratio controls the tradeoff between spillover and illumination efficiency.
| f/D | Subtended Half-Angle | Characteristics |
|---|---|---|
| 0.25 | 90 | Deep dish, wide feed beamwidth needed, compact |
| 0.35 | 69 | Common compromise |
| 0.50 | 53 | Shallow dish, narrow feed beamwidth, less spillover |
| 0.75 | 37 | Very shallow, minimal spillover, lower illumination |
Optimal f/D: Match feed -10 dB beamwidth to dish subtended angle. Use thetaEdge = 2*atand(1/(4*fOverD)).
Feed Offset and Tilt
% Beam squint via feed offset (small offsets only -- large offsets cause coma)
rp.FeedOffset = [0.02 0 0]; % 20mm lateral offset
figure; pattern(rp, freq);
% Mechanical steering via tilt
rp.Tilt = 30;
rp.TiltAxis = [0 1 0]; % 30 deg about Y-axis
figure; pattern(rp, freq);
For significant beam steering, use offset reflector configurations (cassegrainOffset/gregorianOffset) rather than feed offset.
Analysis Functions
All standard Antenna Toolbox analysis functions work on reflector objects: pattern, patternAzimuth, patternElevation, beamwidth, impedance, sparameters, axialRatio, rfplot. Use memoryEstimate(rp, freq) before running large analyses.
Mesh coarsening for substrate-backed exciters: After design(), apply explicit mesh before analysis:
mesh(ant, MaxEdgeLength=lambda/8);
Interpolation sweep for faster frequency sweeps: When RF Toolbox is available and the exciter has a substrate, use:
try
spar = sparameters(rp, freqRange, SweepOption="interp");
catch
spar = sparameters(rp, freqRange);
end
Memory and Performance
- < 5 lambda:** MoM feasible. **5-50 lambda:** MoM-PO (default). **> 50 lambda: PO or FMM.
- Dual-reflector systems require more memory than single-dish.
Design Rules of Thumb
| Parameter | Typical Range | Notes |
|---|---|---|
| f/D ratio | 0.25 - 0.75 | 0.35-0.5 most common |
| Aperture (D/lambda) | 5 - 100+ | Higher = narrower beam, higher gain |
| Aperture efficiency | 50-70% | Includes spillover + illumination + blockage |
| Feed taper at edge | -10 to -12 dB | Good spillover/illumination compromise |
| Gain (dBi) | ~20*log10(D/lambda) + 8 | Rough estimate for eta=55% |
| Beamwidth (deg) | ~70*lambda/D | Half-power beamwidth estimate |
MATLAB Coding Standards
- Use 4-space indentation, lowerCamelCase for variables, UpperCamelCase for Name-Value args.
- Use
"double quotes"for strings. Usefprintffor formatted numerical output. - Do not add titles to Antenna Toolbox plots (
show,pattern,impedance,returnLoss,rfplot). Do add titles to manualplot()figures. - Show all plots in separate figures. Include units in all output.
Guidelines
- Always set Exciter before design() --
design()only takes two arguments for reflectors. - Default feeds:
hornConicalfor parabolic/dual-reflector;dipolefor corner/cylindrical.cavityis NOT valid -- it will error. - Keyword mapping: "dish"/"satellite" →
reflectorParabolic; "no blockage"/"offset" →cassegrainOffset/gregorianOffset; "corner reflector" →reflectorCorner(90 deg default). - Use MoM-PO as default solver for parabolic/spherical.
reflectorCornerandreflectorCylindricalalways use MoM (noSolverType). - Report f/D ratio and aperture size in wavelengths. Warn about memory for dishes > 50 lambda.
- For trade studies, use
reflectorCalculatorfirst, thencreateAntennafor full-wave. - For custom STL reflectors, use
stlread+customDualReflectors(onlyMainReflectorrequired). To optimize feed position, varyFeedOffsetwith SADEA. If the STL is a scattering platform, useinstalledAntennainstead.
Copyright 2026 The MathWorks, Inc.