1---
2app_version: 0.1.0
3precision: 3
4form_title: Free-Space Path Loss & Satellite Link Budget
5form_description: Will your signal make it through? Enter frequency, distance and station gear on both ends — get the path loss, EIRP, received power and your margin above the receiver's noise floor.
6form_inputs: Frequency (MHz)|freq_mhz, Distance (km)|distance_km, TX power (W)|tx_power_w, TX antenna gain (dBi)|tx_gain_dbi, TX cable loss (dB)|tx_cable_loss_db, RX antenna gain (dBi)|rx_gain_dbi, RX cable loss (dB)|rx_cable_loss_db, RX sensitivity (dBm)|rx_sensitivity_dbm
7form_outputs: Free-space path loss (dB)|fspl_db, EIRP (dBm)|eirp_dbm, Received power (dBm)|rx_power_dbm, Link margin (dB)|margin_db
8---
9# Free-Space Path Loss & Satellite Link Budget
10// "Will this actually make it to the satellite — and back?"
11
12# Free-space path loss
13// FSPL(dB) = 20 log(d_km) + 20 log(f_MHz) + 32.44 — the standard form for
14// distance in km and frequency in MHz.
15freq_mhz = 145.825 // e.g. an FM easy-sat downlink
16distance_km = 2000 // a typical LEO satellite slant range
17
18fspl_db = 20 * log10(distance_km) + 20 * log10(freq_mhz) + 32.44
19
20"Free-space path loss (dB)": fspl_db
21
22# Link budget
23tx_power_w = 5 // a handheld at typical output
24tx_gain_dbi = 0 // e.g. a rubber-duck or roll-up J-pole
25tx_cable_loss_db = 0.5
26
27rx_gain_dbi = 12 // e.g. a hand-held Yagi
28rx_cable_loss_db = 1
29rx_sensitivity_dbm = -120 // typical FM satellite receiver sensitivity
30
31eirp_dbm = dbm(tx_power_w) + tx_gain_dbi - tx_cable_loss_db
32rx_power_dbm = eirp_dbm - fspl_db + rx_gain_dbi - rx_cable_loss_db
33margin_db = rx_power_dbm - rx_sensitivity_dbm
34
35"EIRP (dBm)": eirp_dbm
36"Received power (dBm)": rx_power_dbm
37"Receiver sensitivity (dBm)": rx_sensitivity_dbm
38"Link margin (dB)": margin_db
39
40// Positive margin: the signal should be readable with room to spare.
41// Close to zero: expect it to be scratchy right at the pass edges.
42