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
- 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.
- Convert the operating frequency to wavelength with wavelength(freq_hz).
- Size the aperture: aperture_from_gain(gain_db, wavelength_m, eta) returns
the reflector diameter in meters.
- 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.
- Compute the beam: half_power_beamwidth(diameter_m, wavelength_m) returns
theta_3dB in degrees; the beam narrows as the diameter grows.
- Budget the pointing: pointing_budget(theta_3db_deg, pointing_fraction)
returns the allowed error in degrees and the pointing loss in dB.
- Rate the receive chain: gain_over_temperature(receive_gain_db,
noise_temp_k) returns G/T in dB/K.
- 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.
- 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.
1---2name: antenna-aperture-sizing3description: 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.4license: Apache-2.05---67# Parabolic Antenna Aperture Sizing (space-systems/subsystems/antenna-aperture-sizing)89Use when the task is sizing the parabolic reflector antenna aperture of a10spacecraft communications link in the reverse direction: the antenna gain is11an INPUT handed over from the forward link design, and this leaf converts the12required gain into the reflector diameter through the aperture efficiency,13then reports the achieved gain of the sized aperture, the half-power14beamwidth, the pointing accuracy requirement with its pointing loss, and the15receive gain-over-temperature G/T. It implements the standard16eta * (pi * D / lambda)^2 aperture model in pure Python, stdlib only,17deterministic and offline. It pairs with space-systems/subsystems/18communication-link-budget, which supplies the required-gain input; the19reverse-sizing pattern follows the precedent of the solar-array and battery20leaves.2122## Domain quick reference2324- Wavelength: lambda = c / f, with c = 299792458 m/s. S-band 2.2 GHz gives25 lambda about 0.13627 m.26- Aperture gain: G = eta * (pi * D / lambda)^2 linear, gain in dB is27 10 * log10(G). The aperture efficiency eta defaults to 0.6, the typical28 parabolic reflector value, and must lie in (0, 1].29- Aperture from the required gain: D = (lambda / pi) * sqrt(G_lin / eta),30 with G_lin = 10**(gain_db / 10). This is the reverse of the gain law and31 the sizing step of this leaf.32- Required-gain assembly (terms taken from the forward link design):33 G_req = margin + path loss + other losses + 10 * log10(k * T * R)34 - transmit power, all terms in dB, k = 1.380649e-23 J/K, R the data rate,35 T the system noise temperature.36- Half-power beamwidth: theta_3dB = 70 * lambda / D degrees, the standard37 lambda/D approximation for a uniformly illuminated circular aperture.38- Pointing budget: allowed pointing error = pointing_fraction * theta_3dB,39 with pointing_fraction default 0.1; pointing loss =40 12 * (pointing_fraction)^2 dB in the small-error approximation, so the41 default budget allows 0.360 deg error for 0.12 dB loss on a 3.60 deg beam.42- Gain over temperature: G/T = receive_gain_db - 10 * log10(T), dB/K, with T43 the receive system noise temperature.44- Units are SI: m, Hz, K, bps, dBW for transmit power, dB for gains and45 losses. ECSS frames the space communications context; the relations above46 are standard engineering methodology, summary-only.4748## Workflow49501. Fix the requirement: take the required antenna gain from the forward link51 design, or assemble it with required_gain_db(margin_db, path_loss_db,52 other_losses_db, data_rate_bps, noise_temp_k, transmit_power_dbw) when the53 link terms are available.542. Convert the operating frequency to wavelength with wavelength(freq_hz).553. Size the aperture: aperture_from_gain(gain_db, wavelength_m, eta) returns56 the reflector diameter in meters.574. Confirm the size closes the gain: gain_from_aperture(diameter_m,58 wavelength_m, eta) returns (gain_lin, gain_db); the achieved gain must59 match the required gain to within 1e-6 dB.605. Compute the beam: half_power_beamwidth(diameter_m, wavelength_m) returns61 theta_3dB in degrees; the beam narrows as the diameter grows.626. Budget the pointing: pointing_budget(theta_3db_deg, pointing_fraction)63 returns the allowed error in degrees and the pointing loss in dB.647. Rate the receive chain: gain_over_temperature(receive_gain_db,65 noise_temp_k) returns G/T in dB/K.668. For the whole report in one call, antenna_sizing(required_gain_db,67 freq_hz, eta, noise_temp_k, pointing_fraction) returns the wavelength,68 diameter, achieved gain, beamwidth, pointing allowance and loss, G/T69 (None when the noise temperature is not given) and the gain error.709. Confirm the deterministic checks with the contract test71 scripts/test_antenna_aperture_sizing.py.7273## Worked example7475S-band downlink at f = 2.2 GHz, required gain 33.5 dBi, eta = 0.6, system76noise temperature 150 K. Real module outputs:7778- Wavelength: lambda = c / f = 0.136269 m (bound about 0.13627 m).79- Reflector diameter: aperture_from_gain(33.5, 0.136269, 0.6) = 2.6496 m,80 inside the 2.5-2.8 m magnitude bound (about 2.650 m).81- Achieved gain: gain_from_aperture(2.6496, 0.136269, 0.6) = 33.500000 dB;82 the gain error achieved minus required is 0.0 dB, within 1e-6.83- Beamwidth: half_power_beamwidth = 70 * 0.136269 / 2.6496 = 3.60017 deg,84 inside the 3.3-3.9 deg bound (about 3.60 deg).85- Pointing budget: allowed error 0.36002 deg (0.1 * 3.60017) with pointing86 loss 12 * 0.1^2 = 0.12000 dB, about 0.360 deg and 0.12 dB.87- Gain over temperature: G/T = 33.5 - 10 * log10(150) = 11.7391 dB/K,88 inside the 11-13 dB/K bound (about 11.74 dB/K).899091## Pitfalls9293- Sizing from the wrong gain sense: the required gain is an INPUT94 handed over from the forward link budget, and this leaf works the95 reverse direction (gain to diameter); feeding a received-power or96 EIRP figure instead of the antenna gain sizes the wrong dish.97- Forgetting the wavelength changes the diameter: aperture scales as98 lambda / pi * sqrt(G/eta), so a frequency slip (S-band 2.2 GHz is99 lambda = 0.136269 m) directly rescales the reflector at fixed gain.100- Dropping the aperture efficiency: eta defaults to 0.6 and must lie101 in (0, 1]; an ideal eta = 1 sizing undersizes the real reflector,102 and the achieved gain must be checked with the round trip103 (gain error below 1e-6 dB in the worked example).104- Treating the pointing loss as negligible: the budget is105 12 * (pointing_fraction)^2 dB against an allowed error of106 pointing_fraction * theta_3dB, so a sloppy pointing requirement107 eats the link margin the antenna was sized to close.108- Confusing gain and G/T: G/T = receive_gain_db - 10 log10(T) needs109 the receive noise temperature and comes back in dB/K; omitting the110 temperature returns None from the sizing dict rather than a111 number.112- Ignoring the beam narrowness of a big dish: beamwidth is113 70 * lambda / D, so a large aperture needs a proportionally114 tighter pointing budget and a better star tracker or RF sensing115 than the 0.360 deg default allowance.116## Verification117118- Confirm antenna_sizing(33.5, 2.2e9, 0.6, 150.0) returns a diameter in119 2.5-2.8 m, achieved gain 33.5 dB within 0.01 dB, beamwidth in 3.3-3.9 deg,120 G/T in 11-13 dB/K and an absolute gain error below 1e-6.121- Round trip: aperture_from_gain(gain_from_aperture(D)) recovers D to 1e-9.122- Beamwidth is monotonic decreasing in diameter; pointing fraction 0 gives123 zero pointing loss; doubling the noise temperature lowers G/T by 3.01 dB;124 the required gain rises 10 dB per decade of data rate and of noise125 temperature.126- ValueError rejection: frequency, diameter, wavelength, gain, data rate and127 noise temperature at or below zero, efficiency outside (0, 1], negative128 pointing fraction.129- Deterministic: no RNG, identical floats run to run; the convenience dict130 carries exactly the documented keys.131- Run the contract test offline: python3132 scripts/test_antenna_aperture_sizing.py (35 tests, deterministic).133134## Related leaves135136- space-systems/subsystems/communication-link-budget: the forward link137 budget that supplies the required-gain input this leaf sizes from.138- space-systems/subsystems/solar-array-sizing: the reverse-sizing pattern139 precedent in the same pack.140- space-systems/subsystems/spacecraft-battery-sizing: the companion power141 subsystem sizing leaf.142143## Behavior contract (gate 3)144145Run the deterministic contract test (stdlib unittest, offline):146147 python3 scripts/test_antenna_aperture_sizing.py148149The test covers the S-band sizing contract (diameter 2.5-2.8 m, beamwidth1503.3-3.9 deg, G/T 11-13 dB/K against the real module outputs), wavelength and151aperture gain, aperture from a required gain with the 1e-9 round trip, the152required-gain assembly scaling (10 dB per decade of data rate and noise153temperature), half-power beamwidth monotonicity, the pointing budget at the154default and zero fractions, gain over temperature with the 3.01 dB noise155doubling identity, the end-to-end sizing convenience dict and its exact key156set, ValueError rejection of every non-physical input, and run-to-run157determinism.158159## Compliance160161- Standards referenced, not reproduced: ECSS E-ST-70 (space data links and162 RF comms) is a free ESA download (ecss.nl/standards); the aperture163 relations above are standard engineering methodology, summary-only per164 standards-map.yaml.165- compliance: STANDARDS-REF, gated: false.