Skip to main content
Ctrl+K
engineeringkit logo engineeringkit logo
  • Subpackages
  • History
  • Examples
  • API
  • Subpackages
  • History
  • Examples
  • API

Section Navigation

  • Examples
    • Buckling and effective length
    • Beam deflection under a uniform load
  • Examples
    • Oscillator energy balance
    • Damping and vibration histories
  • Examples
    • Carnot engine and heat-pump limits
    • Ideal power-cycle efficiency
  • Examples
    • Poiseuille profile and volume flow
    • Darcy friction across two flow regimes
  • Examples
    • Cooling and the lumped time constant
    • Parallel and counterflow heat exchangers
  • Examples
    • Airfoils
    • Standard atmosphere
    • Boundary layers
    • Circulation
    • Compressible flow
    • Forces and coefficients
    • Performance
    • Finite wings
  • Examples
    • RC charge and energy accounting
    • RLC current after a voltage step
  • Examples
    • Feedback
    • Frequency response
    • Optimal control and estimation
    • Root locus
    • Sampled-data control
    • Stability
    • State space
    • Time response
  • Examples
    • Aliasing before reconstruction
    • Sampling and a signal spectrum
  • Examples
    • Coding
    • Decibels
    • Detection
    • Information and capacity
    • Modulation
    • Multiplexing
    • Noise
    • Propagation
  • Examples
    • Crack size and fracture threshold
    • Voigt and Reuss composite bounds
  • Examples
    • Redundancy under independent failures
    • Weibull survival and shape
  • Tutorials
    • A beam from load to fatigue life
    • A feedback loop in the time and frequency domains
    • A power plant from cycle to cooling tower
    • A radio link from antenna to bit errors
  • Exercises
    • Structural engineering exercises
    • Mechanical engineering exercises
    • Thermodynamics exercises
    • Fluid engineering exercises
    • Heat transfer exercises
    • Aerodynamics exercises
    • Electrical engineering exercises
    • Control systems exercises
    • Signal processing exercises
    • Communications exercises
    • Materials exercises
    • Reliability exercises
  • Installation and quickstart
  • Numerical methods and inspectable histories
  • Structural engineering: loads, signs and linear elasticity
  • Mechanical engineering: power, vibration and mechanism geometry
  • Thermodynamics: total versus specific quantities and cycle states
  • Fluid engineering: flow regimes and signed quantities
  • Heat transfer: absolute temperatures and resistance accounting
  • Aerodynamics: incompressible limits and compressible conservation
  • Electrical engineering: passive components and circuit responses
  • Control systems: matrix contracts and numerical stability
  • Signal processing: sampled energy, spectra and quantization
  • Communications: linear ratios, modulation phase and channel scope
  • Materials: elasticity, fracture and fatigue conventions
  • Reliability: distributions, independence and rate units
  • Examples
  • Examples
  • Propagation
  • The Telstar satellite link budget

Note

Go to the end to download the full example code or to run this example in your browser via JupyterLite.

The Telstar satellite link budget#

Telstar 1 (1962) relayed the first live transatlantic television. Engineers planned such links with a link budget: transmitter power, antenna gains, path loss and miscellaneous losses added in decibels (link_budget_db()), then compared with the receiver noise floor. The figures below are representative of the 4 GHz Andover-Telstar downlink, not archival values.

import matplotlib.pyplot as plt
import numpy as np

from engineeringkit.communications import (
    db,
    dbm,
    free_space_path_loss_db,
    friis_received_power,
    from_dbm,
    link_budget_db,
    thermal_noise_power,
)

Budget at the closest and farthest points of the orbit#

pt_w, gt, gr, f = 2.25, 1.0, 10 ** (58 / 10), 4.17e9
bandwidth, t_sys = 25e6, 60.0
noise_dbm = float(dbm(thermal_noise_power(bandwidth, t_sys)))
ranges = np.linspace(1000e3, 6000e3, 60)
received = link_budget_db(float(dbm(pt_w)), float(db(gt)), float(db(gr)), free_space_path_loss_db(ranges, f), losses_db=3.0)
assert np.allclose(from_dbm(received + 3.0), friis_received_power(pt_w, gt, gr, ranges, f))
for r, p in [(ranges[0], received[0]), (ranges[-1], received[-1])]:
    print(f"range {r / 1e3:5.0f} km: received {p:6.1f} dBm, SNR {p - noise_dbm:5.1f} dB")
range  1000 km: received  -76.3 dBm, SNR  30.5 dB
range  6000 km: received  -91.9 dBm, SNR  14.9 dB

The decibel ledger#

items = {
    "Pt": float(dbm(pt_w)),
    "Gt": float(db(gt)),
    "Gr": float(db(gr)),
    "path loss": -float(free_space_path_loss_db(ranges[-1], f)),
    "other": -3.0,
}
fig, axes = plt.subplots(1, 2, figsize=(10, 3.6))
running = np.cumsum(list(items.values()))
axes[0].bar(list(items), list(items.values()), bottom=np.r_[0, running[:-1]], color=["C0", "C2", "C2", "C3", "C3"])
axes[0].axhline(noise_dbm, color="k", ls="--", label="noise floor")
axes[0].set(ylabel="level [dBm]", title=f"Downlink at {ranges[-1] / 1e3:.0f} km")
axes[0].legend()
axes[1].plot(ranges / 1e3, received - noise_dbm)
axes[1].set(xlabel="slant range [km]", ylabel="SNR [dB]", title="SNR over the pass")
fig.tight_layout()

plt.show()
Downlink at 6000 km, SNR over the pass

Total running time of the script: (0 minutes 0.192 seconds)

Launch JupyterLite

Download Jupyter notebook: plot_03_telstar_link_budget.ipynb

Download Python source code: plot_03_telstar_link_budget.py

Download zipped: plot_03_telstar_link_budget.zip

Gallery generated by Sphinx-Gallery

previous

The Friis transmission formula

next

Examples

On this page
  • Budget at the closest and farthest points of the orbit
  • The decibel ledger
Show Source

Created using Sphinx 9.1.0.

Built with the PyData Sphinx Theme 0.23.0.