Matlab design reflector antenna
Skill matlab/matlab-agentic-toolkit/skills-catalog/rf-and-mixed-signal/matlab-design-reflector-antenna
The MATLAB Agentic Toolkit brings trusted MATLAB capabilities to AI agents, making engineering and scientific workflows agent-ready.
npx -y skills add matlab/matlab-agentic-toolkit --skill matlab-design-reflector-antennaAssembled from the repository path, not quoted from the project. Check it against their README if it does not work.
One thing to look at
- no licenseNo license file was found in the repository. Code published without one is not open source by default, so using it at work is a question for whoever answers licensing questions where you are.
What its author says it does
Copied from the file, not written here
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.
The file declares its own license as MathWorks BSD-3-Clause. That is the author’s claim about this one file, and it is not the same thing as the license GitHub reports for the repository, which is listed with the other numbers below.
SKILL.md
18.9 KB, as published. Nobody here has run it
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.