Skip to content

linkbudget.summary

summary

summary.py

Structured link-budget results plus the standard figures of merit, produced by LinkContainer.summary().

BudgetSummary dataclass

BudgetSummary(stages: StageList = list(), signal_power_w: float = 0.0, signal_power_dbw: float = float('-inf'), noise_power_w: float = 0.0, noise_power_dbw: float = float('-inf'), snr: float = float('inf'), snr_db: float = float('inf'), noise_bandwidth_hz: float | None = None, data_rate_bps: float | None = None, symbol_rate_bd: float | None = None, carrier_frequency_hz: float | None = None, cn_db: float | None = None, cn0_dbhz: float | None = None, ebno_db: float | None = None, esno_db: float | None = None, eirp_dbw: float | None = None, total_propagation_loss_db: float | None = None, system_noise_temp_k: float | None = None, g_over_t_db: float | None = None, shannon_capacity_bps: float | None = None, spectral_efficiency_bps_per_hz: float | None = None, margin_db: float | None = None, closes: bool | None = None)

The computed result of a link budget.

The power / SNR fields are always populated. The figure-of-merit fields are populated only when the container was given enough information (noise_bandwidth, data_rate / symbol_rate), when a propagation stage is present (eirp_dbw, total_propagation_loss_db), when a role="rx" antenna is present (g_over_t_db) or when a LinkMargin stage is present (margin_db / closes).

stages class-attribute instance-attribute

stages: StageList = field(default_factory=list)

signal_power_w class-attribute instance-attribute

signal_power_w: float = 0.0

signal_power_dbw class-attribute instance-attribute

signal_power_dbw: float = float('-inf')

noise_power_w class-attribute instance-attribute

noise_power_w: float = 0.0

noise_power_dbw class-attribute instance-attribute

noise_power_dbw: float = float('-inf')

snr class-attribute instance-attribute

snr: float = float('inf')

snr_db class-attribute instance-attribute

snr_db: float = float('inf')

noise_bandwidth_hz class-attribute instance-attribute

noise_bandwidth_hz: float | None = None

data_rate_bps class-attribute instance-attribute

data_rate_bps: float | None = None

symbol_rate_bd class-attribute instance-attribute

symbol_rate_bd: float | None = None

carrier_frequency_hz class-attribute instance-attribute

carrier_frequency_hz: float | None = None

cn_db class-attribute instance-attribute

cn_db: float | None = None

cn0_dbhz class-attribute instance-attribute

cn0_dbhz: float | None = None

ebno_db class-attribute instance-attribute

ebno_db: float | None = None

esno_db class-attribute instance-attribute

esno_db: float | None = None

eirp_dbw class-attribute instance-attribute

eirp_dbw: float | None = None

total_propagation_loss_db class-attribute instance-attribute

total_propagation_loss_db: float | None = None

system_noise_temp_k class-attribute instance-attribute

system_noise_temp_k: float | None = None

g_over_t_db class-attribute instance-attribute

g_over_t_db: float | None = None

shannon_capacity_bps class-attribute instance-attribute

shannon_capacity_bps: float | None = None

spectral_efficiency_bps_per_hz class-attribute instance-attribute

spectral_efficiency_bps_per_hz: float | None = None

margin_db class-attribute instance-attribute

margin_db: float | None = None

closes class-attribute instance-attribute

closes: bool | None = None

as_dict

as_dict() -> dict[str, Any]

The summary as a plain dict (stages included).

Source code in linkbudget/summary.py
def as_dict(self) -> dict[str, Any]:
    """The summary as a plain dict (stages included)."""
    return asdict(self)

summarize

summarize(data_list: StageList, components: Sequence[Component] | None = None, noise_bandwidth: float | None = None, data_rate: float | None = None, symbol_rate: float | None = None, carrier_frequency: float | None = None) -> BudgetSummary

Build a BudgetSummary from a computed data_list and the component list that produced it.

Source code in linkbudget/summary.py
def summarize(data_list: StageList, components: Sequence[Component] | None = None,
              noise_bandwidth: float | None = None, data_rate: float | None = None,
              symbol_rate: float | None = None,
              carrier_frequency: float | None = None) -> BudgetSummary:
    """Build a `BudgetSummary` from a computed ``data_list`` and the
    component list that produced it."""
    components = list(components or [])
    summary = BudgetSummary(stages=list(data_list),
                            noise_bandwidth_hz=noise_bandwidth,
                            data_rate_bps=data_rate,
                            symbol_rate_bd=symbol_rate,
                            carrier_frequency_hz=carrier_frequency)
    if not data_list:
        return summary

    last = data_list[-1]
    summary.signal_power_w = last["signal_power_out"]
    summary.signal_power_dbw = convert.linear_to_db(last["signal_power_out"])
    summary.noise_power_w = last["noise_power_out"]
    summary.noise_power_dbw = convert.linear_to_db(last["noise_power_out"])
    summary.snr = last["snr"]
    summary.snr_db = convert.linear_to_db(last["snr"])

    if noise_bandwidth:
        summary.cn_db = summary.snr_db
        summary.cn0_dbhz = fom.cn0_from_snr(summary.snr_db, noise_bandwidth)
        if summary.snr not in (float("inf"), float("-inf")):
            summary.shannon_capacity_bps = fom.shannon_capacity_bps(
                noise_bandwidth, summary.snr)
        if data_rate:
            summary.ebno_db = fom.ebno_db(summary.cn0_dbhz, data_rate)
            summary.spectral_efficiency_bps_per_hz = fom.spectral_efficiency(
                data_rate, noise_bandwidth)
        if symbol_rate:
            summary.esno_db = fom.esno_db(summary.cn0_dbhz, symbol_rate)

    _propagation_metrics(summary, data_list, components)
    _noise_metrics(summary, data_list, components, noise_bandwidth)

    margin_stage = next((stage for stage in data_list if "margin_db" in stage), None)
    if margin_stage is not None:
        summary.margin_db = margin_stage["margin_db"]
        summary.closes = margin_stage["closes"]

    return summary