Contents Menu Expand Light mode Dark mode Auto light/dark, in light mode Auto light/dark, in dark mode Skip to content
Ephemerista
Logo
Ephemerista
  • Changelog
  • User Manual
    • Quickstart
    • User Manual
    • Tutorials
  • Developer Documentation
    • Module Structure
    • Interoperability
  • API
    • Analysis – ephemerista.analysis
      • Coverage – ephemerista.analysis.coverage
      • Link Budgets – ephemerista.analysis.link_budget
      • Visibility – ephemerista.analysis.visibility
    • Angles – ephemerista.angles
    • Assets – ephemerista.assets
    • Celestial Bodies – ephemerista.bodies
    • Comms – ephemerista.comms
      • Antennas - ephemerista.comms.antennas
      • Channels - ephemerista.comms.channels
      • Receivers - ephemerista.comms.receiver
      • Communication Systems - ephemerista.comms.systems
      • Transmitters - ephemerista.comms.transmitter
      • Utilities - ephemerista.comms.utils
    • Constellations – ephemerista.constellation
      • Constellation Design – ephemerista.constellation.design
      • Constellation Planes – ephemerista.constellation.plane
    • Coordinates – ephemerista.coords
      • Anomalies – ephemerista.coords.anomalies
      • Events – ephemerista.coords.events
      • Orbit Shapes – ephemerista.coords.shapes
      • Trajectories – ephemerista.coords.trajectories
      • Two-Body States – ephemerista.coords.twobody
    • Frames – ephemerista.frames
    • Math – ephemerista.math
    • Plotting Tools – ephemerista.plot
      • Ground Track Plots – ephemerista.plot.groundtrack
    • Orbit Propagators – ephemerista.propagators
      • Orekit-based Propagators and Utilities – ephemerista.propagators.orekit
        • CCSDS ODM I/O - ephemerista.propagators.orekit.ccsds
        • Orekit Type Conversion Utilities - ephemerista.propagators.orekit.conversions
        • Numerical Orekit Propagators - ephemerista.propagators.orekit.numerical
        • Semi-Analytical Orekit Propagators - ephemerista.propagators.orekit.semianalytical
      • SGP4 Propagator - ephemerista.propagators.sgp4
      • Precomputed Trajectory Interpolator - ephemerista.propagators.oem
    • Scenarios – ephemerista.scenarios
    • Time – ephemerista.time
Back to top
View this page

Link Budgets – ephemerista.analysis.link_budget¶

The link_budget.py module.

This module provides the LinkBudget class and the associated LinkBudgetResults class.

pydantic model ephemerista.analysis.link_budget.EnvironmentalLosses¶

The EnvironmentalLosses class.

This class models all environmental losses supported by Ephemerista.

Fields:
  • atmospheric_attenuation (float)

  • cloud_attenuation (float)

  • depolarization_loss (float)

  • gaseous_attenuation (float)

  • rain_attenuation (float)

  • scintillation_attenuation (float)

field atmospheric_attenuation: float [Required] (alias 'atmosphericAttenuation')¶

Attenuation of atmospheric gases, in dB

Constraints:
  • ge = 0.0

field cloud_attenuation: float [Required] (alias 'cloudAttenuation')¶

Attenuation due to clouds, in dB

Constraints:
  • ge = 0.0

field depolarization_loss: float [Required] (alias 'depolarizationLoss')¶

Depolarization losses, in dB

Constraints:
  • ge = 0.0

field gaseous_attenuation: float [Required] (alias 'gaseousAttenuation')¶

Gaseous attenuation, in dB

Constraints:
  • ge = 0.0

field rain_attenuation: float [Required] (alias 'rainAttenuation')¶

Rain attenuation, in dB)

Constraints:
  • ge = 0.0

field scintillation_attenuation: float [Required] (alias 'scintillationAttenuation')¶

Solar scintillation attenuation, in dB

Constraints:
  • ge = 0.0

classmethod calculate(percentage_exceed, time, observer, target_comms, observer_comms, gs_pass, min_elevation_deg=5.0)¶

Calculate environmental losses for a given link.

Parameters:
  • percentage_exceed (float) – Percentage of time losses are exceeded

  • time (Time) – Time at which to calculate losses

  • observer (Asset) – Observer asset (typically ground station)

  • target_comms (CommunicationSystem) – Target communication system

  • observer_comms (CommunicationSystem) – Observer communication system

  • gs_pass (Pass) – Pass object for elevation data

  • min_elevation_deg (float, optional) – Minimum elevation (degrees) below which the threshold value is used. ITU-R models become numerically unstable below ~5 degrees. Default is 5.0.

Returns:

Calculated environmental losses for the link

Return type:

EnvironmentalLosses

classmethod no_losses()¶

Initialize all environmental losses to zero.

Returns:

Instance with all loss components set to zero.

Return type:

EnvironmentalLosses

sum()¶

Sum all environmental losses.

Returns:

Total environmental losses in dB.

Return type:

float

pydantic model ephemerista.analysis.link_budget.InterferenceStats¶

The InterferenceStats class.

This class models the influence of interfering radio transmissions on the link.

Fields:
  • c_n0i0 (float)

  • eb_n0i0 (float)

  • interference_power_w (float)

  • margin_with_interference (float)

field c_n0i0: float [Required] (alias 'cN0I0')¶

Carrier to noise plus interference density, in dB

field eb_n0i0: float [Required] (alias 'ebN0I0')¶

Bit energy to noise plus interference density, in dB

field interference_power_w: float [Required] (alias 'interferencePowerW')¶

Total received interference power from all sources, in W

Constraints:
  • ge = 0.0

field margin_with_interference: float [Required] (alias 'marginWithInterference')¶

Link margin considering interference, in dB

property interference_power: float¶
pydantic model ephemerista.analysis.link_budget.Link¶

The Link class.

This class models a radio link between two communication systems covering a specific visbility window.

Fields:
  • link_type (Literal['uplink', 'downlink'])

  • stats (list[ephemerista.analysis.link_budget.LinkStats])

  • times (list[ephemerista.time.Time])

  • window (ephemerista.analysis.visibility.Window)

field link_type: Literal['uplink', 'downlink'] [Required] (alias 'linkType')¶

Link type, uplink or downlink

field stats: list[LinkStats] [Required]¶

List of link metrics, one for each time step

field times: list[Time] [Required]¶

Time vector

field window: Window [Required]¶

Time window of the visibility pass where the link budget is computed

plot(*, plot_interference=False)¶

Plot all link properties.

Parameters:

plot_interference (bool, optional) – Whether to include interference statistics in the plots. Default is False.

Returns:

Figure containing subplots of all link properties.

Return type:

matplotlib.figure.Figure

plot_attenuations(percentage_exceed)¶

Plot all environmental attenuations.

Parameters:

percentage_exceed (float) – Percentage of time the attenuations are exceeded, used in plot title.

Returns:

Figure containing subplots of all environmental attenuations.

Return type:

matplotlib.figure.Figure

to_dataframe()¶

Convert link statistics to a pandas DataFrame.

Returns:

DataFrame containing all link statistics indexed by time.

Return type:

pd.DataFrame

property mean_c_n0: float¶
property mean_eb_n0: float¶
property mean_eirp: float¶
property mean_fspl: float¶
property mean_gt: float¶
property mean_losses: float¶
property mean_margin: float¶
property mean_rx_angle: float¶
property mean_slant_range: float¶
property mean_tx_angle: float¶
pydantic model ephemerista.analysis.link_budget.LinkBudget¶

The LinkBudget analysis.

Fields:
  • end_time (ephemerista.time.Time | None)

  • min_elevation_deg (float)

  • percentage_exceed (float)

  • scenario (ephemerista.scenarios.Scenario)

  • start_time (ephemerista.time.Time | None)

  • with_environmental_losses (bool)

  • with_interference (bool)

field end_time: Time | None = None (alias 'endTime')¶

End time (optional, if None the scenario’s end time is used)

field min_elevation_deg: float = 5.0 (alias 'minElevationDeg')¶

Minimum elevation angle (degrees) below which the threshold value is used to avoid numerical instability

Constraints:
  • ge = 0.0

  • le = 90.0

field percentage_exceed: float = 1.0 (alias 'percentageExceed')¶

Percentage of the time the environmental attenuation values are exceeded, per ITU-R

Constraints:
  • gt = 0.001

  • le = 5.0

field scenario: Scenario [Required]¶

The scenario used to analyze the link budget

field start_time: Time | None = None (alias 'startTime')¶

Start time (optional, if None the scenario’s start time is used)

field with_environmental_losses: bool = True (alias 'withEnvironmentalLosses')¶

Whether to calculate environmental losses (rain, atmospheric, etc.) or use zero losses

field with_interference: bool = False (alias 'withInterference')¶

Whether to calculate interference from other transmissions in the scenario

analyze(ensemble=None, visibility=None)¶

Run the link budget analysis.

Parameters:
  • ensemble (Ensemble, optional) – Pre-computed ensemble with propagated trajectories. If None, the scenario will be propagated automatically.

  • visibility (VisibilityResults, optional) – Pre-computed visibility results. If None, visibility analysis will be run automatically.

Returns:

Complete link budget analysis results including all links and their statistics over time.

Return type:

LinkBudgetResults

pydantic model ephemerista.analysis.link_budget.LinkBudgetResults¶

The results of the LinkBudget analysis.

Fields:
  • links (dict[uuid.UUID, dict[uuid.UUID, list[ephemerista.analysis.link_budget.Link]]])

  • results_type (Literal['link_budget'])

field links: dict[Annotated[UUID], dict[Annotated[UUID], list[Link]]] [Required]¶

Dictionary of all links between all targets and all observers

field results_type: Literal['link_budget'] = 'link_budget' (alias 'type')¶
get(observer, target)¶

Get all links for a given observer and target pairing.

Return type:

list[Link]

to_dataframe(observer, target, *, with_interference=False)¶

Convert the analysis results to a Pandas data frame.

Parameters:
  • observer (AssetKey) – Observer asset identifier

  • target (AssetKey) – Target asset identifier

  • with_interference (bool, optional) – Whether to include interference statistics in the dataframe. Default is False.

Returns:

Dataframe containing link statistics for all passes between the observer and target.

Return type:

pd.DataFrame

pydantic model ephemerista.analysis.link_budget.LinkStats¶

The LinkStats class.

This class models all relevant properties of a radio link for link budget calculations at specific point in time.

Fields:
  • bandwidth (float)

  • c_n0 (float)

  • carrier_rx_power (float)

  • data_rate (float)

  • eb_n0 (float)

  • eirp (float)

  • frequency (float)

  • fspl (float)

  • gt (float)

  • interference_stats (ephemerista.analysis.link_budget.InterferenceStats | None)

  • losses (ephemerista.analysis.link_budget.EnvironmentalLosses)

  • margin (float)

  • noise_power (float)

  • rx_angle (ephemerista.angles.Angle)

  • slant_range (float)

  • tx_angle (ephemerista.angles.Angle)

field bandwidth: float [Required]¶

Bandwidth, in Hz

field c_n0: float [Required] (alias 'cN0')¶

Carrier to noise density, in dB

field carrier_rx_power: float [Required] (alias 'carrierRxPower')¶

Power level at receiver input, in dBW

field data_rate: float [Required] (alias 'dataRate')¶

Data rate, in bit/s

field eb_n0: float [Required] (alias 'ebN0')¶

Bit energy to noise density, in dB

field eirp: float [Required]¶

Effective isotropic radiated power, in dBW

field frequency: float [Required]¶

Frequency, in Hz

field fspl: float [Required]¶

Free space path loss, in dB

field gt: float [Required]¶

Gain to noise temperature ratio, in dB/K

field interference_stats: InterferenceStats | None = None (alias 'interferenceStats')¶

Interference data (optional, only available after analyzing interference)

field losses: EnvironmentalLosses [Required]¶

Environmental losses

field margin: float [Required]¶

Link margin, in dB

field noise_power: float [Required] (alias 'noisePower')¶

Noise power, in dBW

field rx_angle: Angle [Required] (alias 'rxAngle')¶

Angle between the RX antenna boresight vector and the receiver to transmitter vector, in degrees

field slant_range: float [Required] (alias 'slantRange')¶

Range between transmit and receive antennas, in km

field tx_angle: Angle [Required] (alias 'txAngle')¶

Angle between the TX antenna boresight vector and the transmitter to receiver vector, in degrees

classmethod calculate(time, channel, link_type, target, observer, target_comms, observer_comms, losses, ensemble)¶

Calculate link statistics for a given time and link configuration.

Parameters:
  • time (Time) – Time at which to calculate link statistics

  • channel (Channel) – Communication channel configuration

  • link_type ({"uplink", "downlink"}) – Type of link direction

  • target (Asset) – Target asset (typically spacecraft)

  • observer (Asset) – Observer asset (typically ground station)

  • target_comms (CommunicationSystem) – Target communication system

  • observer_comms (CommunicationSystem) – Observer communication system

  • losses (EnvironmentalLosses) – Environmental losses to apply

  • ensemble (Ensemble) – Ensemble containing propagated trajectories

Returns:

Calculated link statistics including EIRP, G/T, margins, etc.

Return type:

LinkStats

add_interference(interference_power_w)¶

Add interference to previously computed link statistics.

Parameters:

interference_power_w (float) – Total interference power in Watts

Returns:

Updated link statistics including interference effects

Return type:

LinkStats

Next
Visibility – ephemerista.analysis.visibility
Previous
Coverage – ephemerista.analysis.coverage
Copyright © 2025, Libre Space Foundation
Made with Sphinx and @pradyunsg's Furo
On this page
  • Link Budgets – ephemerista.analysis.link_budget
    • EnvironmentalLosses
      • EnvironmentalLosses.atmospheric_attenuation
      • EnvironmentalLosses.cloud_attenuation
      • EnvironmentalLosses.depolarization_loss
      • EnvironmentalLosses.gaseous_attenuation
      • EnvironmentalLosses.rain_attenuation
      • EnvironmentalLosses.scintillation_attenuation
      • EnvironmentalLosses.calculate()
      • EnvironmentalLosses.no_losses()
      • EnvironmentalLosses.sum()
    • InterferenceStats
      • InterferenceStats.c_n0i0
      • InterferenceStats.eb_n0i0
      • InterferenceStats.interference_power_w
      • InterferenceStats.margin_with_interference
      • InterferenceStats.interference_power
    • Link
      • Link.link_type
      • Link.stats
      • Link.times
      • Link.window
      • Link.plot()
      • Link.plot_attenuations()
      • Link.to_dataframe()
      • Link.mean_c_n0
      • Link.mean_eb_n0
      • Link.mean_eirp
      • Link.mean_fspl
      • Link.mean_gt
      • Link.mean_losses
      • Link.mean_margin
      • Link.mean_rx_angle
      • Link.mean_slant_range
      • Link.mean_tx_angle
    • LinkBudget
      • LinkBudget.end_time
      • LinkBudget.min_elevation_deg
      • LinkBudget.percentage_exceed
      • LinkBudget.scenario
      • LinkBudget.start_time
      • LinkBudget.with_environmental_losses
      • LinkBudget.with_interference
      • LinkBudget.analyze()
    • LinkBudgetResults
      • LinkBudgetResults.links
      • LinkBudgetResults.results_type
      • LinkBudgetResults.get()
      • LinkBudgetResults.to_dataframe()
    • LinkStats
      • LinkStats.bandwidth
      • LinkStats.c_n0
      • LinkStats.carrier_rx_power
      • LinkStats.data_rate
      • LinkStats.eb_n0
      • LinkStats.eirp
      • LinkStats.frequency
      • LinkStats.fspl
      • LinkStats.gt
      • LinkStats.interference_stats
      • LinkStats.losses
      • LinkStats.margin
      • LinkStats.noise_power
      • LinkStats.rx_angle
      • LinkStats.slant_range
      • LinkStats.tx_angle
      • LinkStats.calculate()
      • LinkStats.add_interference()