# Antenna Aperture Sizing

> Use when you must size the parabolic antenna aperture of a spacecraft communications link: convert a required antenna gain into the reflector diameter through the aperture efficiency, compute the achieved gain of the sized aperture, the half-power beamwidth, the pointing budget with pointing loss, and the receive gain-over-temperature G/T figure of merit. Produces the required gain, the reflector diameter, the achieved gain, the beamwidth, the pointing budget and the G/T that gate an antenna aperture sizing. Trigger: antenna aperture sizing, parabolic reflector gain, aperture efficiency, required antenna gain, half-power beamwidth, pointing loss budget, gain over temperature, spacecraft antenna sizing.

- Skill: `ashfordeou/antenna-aperture-sizing` (Agent Skill, multi-file: 3 files)
- Install (CLI): `npx skillmds@latest add ashfordeou/antenna-aperture-sizing`
- Raw SKILL.md: https://api.skillmd.com/api/skills/ashfordeou/antenna-aperture-sizing/raw
- Safety review: pending
- Works with: Claude Code, Claude.ai, OpenAI Codex
- Category: Finance & Business
- License: Apache-2.0
- Author: ashfordeOU (https://skillmd.com/u/ashfordeou)
- Updated: 2026-09-17
- Page: https://skillmd.com/skills/ashfordeou/antenna-aperture-sizing

---


# Parabolic Antenna Aperture Sizing (space-systems/subsystems/antenna-aperture-sizing)

Use when the task is sizing the parabolic reflector antenna aperture of a
spacecraft communications link in the reverse direction: the antenna gain is
an INPUT handed over from the forward link design, and this leaf converts the
required gain into the reflector diameter through the aperture efficiency,
then reports the achieved gain of the sized aperture, the half-power
beamwidth, the pointing accuracy requirement with its pointing loss, and the
receive gain-over-temperature G/T. It implements the standard
eta * (pi * D / lambda)^2 aperture model in pure Python, stdlib only,
deterministic and offline. It pairs with space-systems/subsystems/
communication-link-budget, which supplies the required-gain input; the
reverse-sizing pattern follows the precedent of the solar-array and battery
leaves.

## Domain quick reference

- Wavelength: lambda = c / f, with c = 299792458 m/s. S-band 2.2 GHz gives
  lambda about 0.13627 m.
- Aperture gain: G = eta * (pi * D / lambda)^2 linear, gain in dB is
  10 * log10(G). The aperture efficiency eta defaults to 0.6, the typical
  parabolic reflector value, and must lie in (0, 1].
- Aperture from the required gain: D = (lambda / pi) * sqrt(G_lin / eta),
  with G_lin = 10**(gain_db / 10). This is the reverse of the gain law and
  the sizing step of this leaf.
- Required-gain assembly (terms taken from the forward link design):
  G_req = margin + path loss + other losses + 10 * log10(k * T * R)
  - transmit power, all terms in dB, k = 1.380649e-23 J/K, R the data rate,
  T the system noise temperature.
- Half-power beamwidth: theta_3dB = 70 * lambda / D degrees, the standard
  lambda/D approximation for a uniformly illuminated circular aperture.
- Pointing budget: allowed pointing error = pointing_fraction * theta_3dB,
  with pointing_fraction default 0.1; pointing loss =
  12 * (pointing_fraction)^2 dB in the small-error approximation, so the
  default budget allows 0.360 deg error for 0.12 dB loss on a 3.60 deg beam.
- Gain over temperature: G/T = receive_gain_db - 10 * log10(T), dB/K, with T
  the receive system noise temperature.
- Units are SI: m, Hz, K, bps, dBW for transmit power, dB for gains and
  losses. ECSS frames the space communications context; the relations above
  are standard engineering methodology, summary-only.

## Workflow

1. Fix the requirement: take the required antenna gain from the forward link
   design, or assemble it with required_gain_db(margin_db, path_loss_db,
   other_losses_db, data_rate_bps, noise_temp_k, transmit_power_dbw) when the
   link terms are available.
2. Convert the operating frequency to wavelength with wavelength(freq_hz).
3. Size the aperture: aperture_from_gain(gain_db, wavelength_m, eta) returns
   the reflector diameter in meters.
4. Confirm the size closes the gain: gain_from_aperture(diameter_m,
   wavelength_m, eta) returns (gain_lin, gain_db); the achieved gain must
   match the required gain to within 1e-6 dB.
5. Compute the beam: half_power_beamwidth(diameter_m, wavelength_m) returns
   theta_3dB in degrees; the beam narrows as the diameter grows.
6. Budget the pointing: pointing_budget(theta_3db_deg, pointing_fraction)
   returns the allowed error in degrees and the pointing loss in dB.
7. Rate the receive chain: gain_over_temperature(receive_gain_db,
   noise_temp_k) returns G/T in dB/K.
8. For the whole report in one call, antenna_sizing(required_gain_db,
   freq_hz, eta, noise_temp_k, pointing_fraction) returns the wavelength,
   diameter, achieved gain, beamwidth, pointing allowance and loss, G/T
   (None when the noise temperature is not given) and the gain error.
9. Confirm the deterministic checks with the contract test
   scripts/test_antenna_aperture_sizing.py.

## Worked example

S-band downlink at f = 2.2 GHz, required gain 33.5 dBi, eta = 0.6, system
noise temperature 150 K. Real module outputs:

- Wavelength: lambda = c / f = 0.136269 m (bound about 0.13627 m).
- Reflector diameter: aperture_from_gain(33.5, 0.136269, 0.6) = 2.6496 m,
  inside the 2.5-2.8 m magnitude bound (about 2.650 m).
- Achieved gain: gain_from_aperture(2.6496, 0.136269, 0.6) = 33.500000 dB;
  the gain error achieved minus required is 0.0 dB, within 1e-6.
- Beamwidth: half_power_beamwidth = 70 * 0.136269 / 2.6496 = 3.60017 deg,
  inside the 3.3-3.9 deg bound (about 3.60 deg).
- Pointing budget: allowed error 0.36002 deg (0.1 * 3.60017) with pointing
  loss 12 * 0.1^2 = 0.12000 dB, about 0.360 deg and 0.12 dB.
- Gain over temperature: G/T = 33.5 - 10 * log10(150) = 11.7391 dB/K,
  inside the 11-13 dB/K bound (about 11.74 dB/K).


## Pitfalls

- Sizing from the wrong gain sense: the required gain is an INPUT
  handed over from the forward link budget, and this leaf works the
  reverse direction (gain to diameter); feeding a received-power or
  EIRP figure instead of the antenna gain sizes the wrong dish.
- Forgetting the wavelength changes the diameter: aperture scales as
  lambda / pi * sqrt(G/eta), so a frequency slip (S-band 2.2 GHz is
  lambda = 0.136269 m) directly rescales the reflector at fixed gain.
- Dropping the aperture efficiency: eta defaults to 0.6 and must lie
  in (0, 1]; an ideal eta = 1 sizing undersizes the real reflector,
  and the achieved gain must be checked with the round trip
  (gain error below 1e-6 dB in the worked example).
- Treating the pointing loss as negligible: the budget is
  12 * (pointing_fraction)^2 dB against an allowed error of
  pointing_fraction * theta_3dB, so a sloppy pointing requirement
  eats the link margin the antenna was sized to close.
- Confusing gain and G/T: G/T = receive_gain_db - 10 log10(T) needs
  the receive noise temperature and comes back in dB/K; omitting the
  temperature returns None from the sizing dict rather than a
  number.
- Ignoring the beam narrowness of a big dish: beamwidth is
  70 * lambda / D, so a large aperture needs a proportionally
  tighter pointing budget and a better star tracker or RF sensing
  than the 0.360 deg default allowance.
## Verification

- Confirm antenna_sizing(33.5, 2.2e9, 0.6, 150.0) returns a diameter in
  2.5-2.8 m, achieved gain 33.5 dB within 0.01 dB, beamwidth in 3.3-3.9 deg,
  G/T in 11-13 dB/K and an absolute gain error below 1e-6.
- Round trip: aperture_from_gain(gain_from_aperture(D)) recovers D to 1e-9.
- Beamwidth is monotonic decreasing in diameter; pointing fraction 0 gives
  zero pointing loss; doubling the noise temperature lowers G/T by 3.01 dB;
  the required gain rises 10 dB per decade of data rate and of noise
  temperature.
- ValueError rejection: frequency, diameter, wavelength, gain, data rate and
  noise temperature at or below zero, efficiency outside (0, 1], negative
  pointing fraction.
- Deterministic: no RNG, identical floats run to run; the convenience dict
  carries exactly the documented keys.
- Run the contract test offline: python3
  scripts/test_antenna_aperture_sizing.py (35 tests, deterministic).

## Related leaves

- space-systems/subsystems/communication-link-budget: the forward link
  budget that supplies the required-gain input this leaf sizes from.
- space-systems/subsystems/solar-array-sizing: the reverse-sizing pattern
  precedent in the same pack.
- space-systems/subsystems/spacecraft-battery-sizing: the companion power
  subsystem sizing leaf.

## Behavior contract (gate 3)

Run the deterministic contract test (stdlib unittest, offline):

    python3 scripts/test_antenna_aperture_sizing.py

The test covers the S-band sizing contract (diameter 2.5-2.8 m, beamwidth
3.3-3.9 deg, G/T 11-13 dB/K against the real module outputs), wavelength and
aperture gain, aperture from a required gain with the 1e-9 round trip, the
required-gain assembly scaling (10 dB per decade of data rate and noise
temperature), half-power beamwidth monotonicity, the pointing budget at the
default and zero fractions, gain over temperature with the 3.01 dB noise
doubling identity, the end-to-end sizing convenience dict and its exact key
set, ValueError rejection of every non-physical input, and run-to-run
determinism.

## Compliance

- Standards referenced, not reproduced: ECSS E-ST-70 (space data links and
  RF comms) is a free ESA download (ecss.nl/standards); the aperture
  relations above are standard engineering methodology, summary-only per
  standards-map.yaml.
- compliance: STANDARDS-REF, gated: false.

