Antenna models¶
linkbudget.antennas has three components and the scalar helpers behind
them. They return the standard stage dict, so they drop straight into a
chain.
ParabolicDish¶
Boresight gain and −3 dB beamwidth from the physical diameter,
frequency and aperture efficiency. Like Gain, it scales both signal and
noise. Tag it role="rx" (or "tx") so
summary() can identify the receive antenna for G/T.
linkbudget.ParabolicDish(
"Ground station dish", "1.2 m offset reflector",
diameter=1.2, frequency=11.7e9, efficiency=0.65, role="rx")
The stage dict adds gain_dbi and half_power_beamwidth_deg.
Gain is η·(π·D/λ)²; the beamwidth is the 70·λ/D rule of thumb.
BeamPointingLoss¶
Pointing loss from a finite beamwidth and a pointing error, using the
quadratic main-lobe approximation L = 12·(error / HPBW)² dB (so the loss is
3 dB at half the beamwidth, 12 dB at the full beamwidth).
# give the beamwidth directly...
linkbudget.BeamPointingLoss(
"Pointing", "", pointing_error_deg=0.3, half_power_beamwidth_deg=1.6)
# ...or derive it from a dish
linkbudget.BeamPointingLoss(
"Pointing", "", pointing_error_deg=0.3, diameter=1.2, frequency=11.7e9)
Attenuates the signal only.
PolarizationMismatchLoss¶
Loss from a polarization mismatch between the transmit and receive antennas, computed from their axial ratios (dB) and relative tilt.
linkbudget.PolarizationMismatchLoss(
"Polarization", "",
axial_ratio_db_tx=0.8, # 0 dB = perfectly circular
axial_ratio_db_rx=1.0, # large -> approaches linear
tilt_angle_deg=15.0)
Matched circular gives no loss; circular against linear gives 3 dB; crossed linears give a null. Attenuates the signal only.
AntennaNoiseTemperature¶
The antenna-side noise floor: injects k·T_a·B watts, where the antenna
noise temperature T_a is composed from the sky brightness temperature, warm
ground picked up through the sidelobes/spillover, and the antenna's own ohmic
loss. It is the receive-side counterpart to a ThermalNoise receiver floor —
put it right after the receive antenna.
linkbudget.AntennaNoiseTemperature(
"Antenna noise", "clear-sky Ku-band, 30 deg elevation",
sky_temp_k=12.0, # atmospheric emission along the path (incl. ~2.7 K CMB)
ground_temp_k=290.0,
ground_coupling=0.05, # fraction of the pattern seeing warm ground
radiation_efficiency=0.98, # ohmic efficiency; < 1 also attenuates the signal
physical_temp_k=290.0,
bandwidth=20e6)
T_a = η·[(1 − c)·T_sky + c·T_ground] + (1 − η)·T_phys with c the ground
coupling and η the radiation efficiency. The stage dict adds
scene_noise_temp_k, antenna_noise_temp_k and antenna_noise_power, and
summary() folds antenna_noise_temp_k into the
system noise temperature.
Scalar helpers¶
from linkbudget import antennas
antennas.dish_gain_dbi(1.2, 11.7e9, efficiency=0.65) # dBi
antennas.dish_half_power_beamwidth_deg(1.2, 11.7e9) # degrees
antennas.gaussian_beam_pointing_loss_db(0.3, 1.6) # dB
antennas.polarization_efficiency(0.8, 1.0, tilt_angle_deg=15.0) # 0..1
antennas.antenna_noise_temp_k(12.0, ground_coupling=0.05) # K