linkbudget.propagation¶
propagation ¶
propagation.py
Atmospheric and terrain propagation-loss models: simplified engineering
implementations of the relevant ITU-R Recommendations plus a two-ray
ground-reflection model. Each class is a drop-in LinkContainer
component (it returns the same stage dict as the components in
link_container) and is tagged is_propagation = True so that
LinkContainer.summary() folds it into the total path loss.
The models are deliberately compact approximations, not line-by-line reference implementations:
AtmosphericAbsorption-- ITU-R P.676 Annex 2 (gaseous, f <= 57 GHz)RainAttenuation-- ITU-R P.838-3 + P.618 slant pathCloudFogAttenuation-- ITU-R P.840 double-Debye liquid waterTroposphericScintillation-- ITU-R P.618 section 2.4.1TwoRayGroundReflection-- plane-earth two-ray model
AtmosphericAbsorption ¶
AtmosphericAbsorption(name: str = 'Atmospheric absorption', description: str = '', frequency: float = 1000000000.0, water_vapor_density: float = 7.5, path_length_km: float | None = None, elevation_deg: float | None = None, oxygen_height_km: float = 6.0, water_height_km: float = 2.1)
Bases: Component
Clear-air gaseous absorption (oxygen + water vapour).
Give a horizontal path_length_km directly, or give an
elevation_deg for a slant path through the atmosphere (the path is
then computed from the gas equivalent heights oxygen_height_km and
water_height_km).
Source code in linkbudget/propagation.py
water_vapor_density
instance-attribute
¶
path_length_km
instance-attribute
¶
elevation_deg
instance-attribute
¶
elevation_deg = _validate.optional_in_range('elevation_deg', elevation_deg, 0.0, 90.0, low_open=True)
oxygen_height_km
instance-attribute
¶
water_height_km
instance-attribute
¶
propagate_signal ¶
Attenuate the signal and noise by the gaseous absorption over the path.
Source code in linkbudget/propagation.py
RainAttenuation ¶
RainAttenuation(name: str = 'Rain attenuation', description: str = '', frequency: float = 1000000000.0, rain_rate: float = 0.0, polarization_tilt_deg: float = 45.0, path_length_km: float | None = None, elevation_deg: float | None = None, rain_height_km: float = 3.0, station_height_km: float = 0.0, latitude_deg: float | None = None)
Bases: Component
Rain attenuation.
Two ways to specify the path:
path_length_km-- a horizontal path; an ITU-R style effective-length reduction factor is applied.elevation_deg+rain_height_km+station_height_km-- a slant path, using the ITU-R P.618 0.01 % reduction and vertical adjustment factors.latitude_degrefines the vertical factor.
Source code in linkbudget/propagation.py
path_length_km
instance-attribute
¶
elevation_deg
instance-attribute
¶
elevation_deg = _validate.optional_in_range('elevation_deg', elevation_deg, 0.0, 90.0, low_open=True)
rain_height_km
instance-attribute
¶
station_height_km
instance-attribute
¶
propagate_signal ¶
Attenuate the signal and noise by the rain loss over the effective path.
Source code in linkbudget/propagation.py
CloudFogAttenuation ¶
CloudFogAttenuation(name: str = 'Cloud / fog attenuation', description: str = '', frequency: float = 1000000000.0, temperature_k: float = 273.15, liquid_water_path: float | None = None, elevation_deg: float = 90.0, liquid_water_density: float | None = None, path_length_km: float | None = None)
Bases: Component
Attenuation from cloud / fog liquid water (ITU-R P.840).
Give either a columnar liquid_water_path (kg/m2, i.e. the integrated
content) with an elevation_deg, or a liquid_water_density
(g/m3) with a path_length_km.
Source code in linkbudget/propagation.py
temperature_k
instance-attribute
¶
liquid_water_path
instance-attribute
¶
elevation_deg
instance-attribute
¶
liquid_water_density
instance-attribute
¶
liquid_water_density = _validate.optional_non_negative('liquid_water_density', liquid_water_density)
path_length_km
instance-attribute
¶
propagate_signal ¶
Attenuate the signal and noise by the cloud / fog liquid-water loss.
Source code in linkbudget/propagation.py
TroposphericScintillation ¶
TroposphericScintillation(name: str = 'Tropospheric scintillation', description: str = '', frequency: float = 1000000000.0, elevation_deg: float = 30.0, antenna_diameter: float = 1.0, antenna_efficiency: float = 0.5, n_wet: float | None = None, temperature_c: float = 15.0, relative_humidity_percent: float = 50.0, time_percent: float = 0.01)
Bases: Component
Tropospheric scintillation fade (ITU-R P.618 section 2.4.1).
Reports the fade depth exceeded time_percent percent of an average
year. The wet refractivity n_wet is derived from
temperature_c / relative_humidity_percent if not given directly.
Source code in linkbudget/propagation.py
elevation_deg
instance-attribute
¶
antenna_diameter
instance-attribute
¶
antenna_efficiency
instance-attribute
¶
antenna_efficiency = _validate.in_range('antenna_efficiency', antenna_efficiency, 0.0, 1.0, low_open=True)
relative_humidity_percent
instance-attribute
¶
relative_humidity_percent = _validate.in_range('relative_humidity_percent', relative_humidity_percent, 0.0, 100.0)
time_percent
instance-attribute
¶
propagate_signal ¶
Attenuate the signal by the scintillation fade depth (noise unchanged).
Source code in linkbudget/propagation.py
TwoRayGroundReflection ¶
TwoRayGroundReflection(name: str = 'Two-ray ground reflection', description: str = '', distance: float = 1000.0, tx_height: float = 10.0, rx_height: float = 2.0, frequency: float | None = None)
Bases: Component
Plane-earth two-ray propagation model for a terrestrial path.
Beyond the free-space / plane-earth crossover distance the received power
falls as (h_tx h_rx / d**2)**2 (a 40 dB/decade slope). Below the
crossover it falls back to free-space loss (frequency required for
that and for reporting the crossover distance).
Source code in linkbudget/propagation.py
propagate_signal ¶
Attenuate the signal and noise by the two-ray path loss.
Source code in linkbudget/propagation.py
oxygen_specific_attenuation_db_per_km ¶
Specific attenuation from dry air / oxygen (dB/km), valid f <= 57 GHz.
Source code in linkbudget/propagation.py
water_vapor_specific_attenuation_db_per_km ¶
water_vapor_specific_attenuation_db_per_km(frequency_ghz: float, water_vapor_density: float = 7.5) -> float
Specific attenuation from water vapour (dB/km).
water_vapor_density is the absolute humidity in g/m**3 (7.5 is the
ITU-R reference value).
Source code in linkbudget/propagation.py
rain_kalpha ¶
rain_kalpha(frequency_hz: float, polarization_tilt_deg: float = 45.0, elevation_deg: float = 90.0) -> tuple[float, float]
ITU-R P.838-3 k and alpha for the given frequency, polarization
tilt (45 deg = circular) and path elevation.
Source code in linkbudget/propagation.py
rain_specific_attenuation_db_per_km ¶
rain_specific_attenuation_db_per_km(frequency_hz: float, rain_rate_mm_h: float, polarization_tilt_deg: float = 45.0, elevation_deg: float = 90.0) -> float
ITU-R P.838-3 specific rain attenuation gamma_R = k R**alpha (dB/km).
Source code in linkbudget/propagation.py
cloud_specific_attenuation_coefficient ¶
ITU-R P.840 cloud liquid-water specific attenuation coefficient
K_l in (dB/km) per (g/m**3).
Source code in linkbudget/propagation.py
scintillation_std_db ¶
scintillation_std_db(frequency_hz: float, elevation_deg: float, antenna_diameter_m: float, antenna_efficiency: float = 0.5, n_wet: float | None = None, temperature_c: float = 15.0, relative_humidity_percent: float = 50.0) -> float
Standard deviation (dB) of the tropospheric scintillation fade (ITU-R P.618 section 2.4.1).