THE MACHINE · IN THE OPEN · FROM THE WITNESSED RUN OF 2026-10-09
linkbudget.py, every command showing its working.
A small Python program, standard library only. Your AI runs it; you can too. Every block below is pasted from the card’s own WITNESS.md, as printed.
fspl | free-space path loss; slant range; the Fresnel zone |
|---|
rf | the whole budget: received power, noise, C/N, Eb/N0, the margin and the verdict; the highest rate that closes |
|---|
dish | a dish's gain, beamwidth and far field, or the dish a gain needs |
|---|
shannon | hannon capacity, or the SNR a rate needs |
|---|
optical | a laser link: the spot, the capture, pointing loss, received power, photons per second and per bit |
|---|
delay | light time, one way and there and back |
|---|
noise | the thermal noise floor, noise figure and temperature, a cascade |
|---|
selftest | 42 checks that prove the machine; it must print 42/42 |
|---|
fspl · FREE-SPACE PATH LOSS; SLANT RANGE; THE FRESNEL ZONE
$ linkbudget.py fspl --freq-ghz 5.8 --km 3
free-space path loss at 5.8 GHz over 3.000 km: 117.26 dB
= 20·log10(3.000) + 20·log10(5.8) + 92.45 = 9.54 + 15.27 + 92.45
wavelength 0.05169 m; doubling the distance or the frequency adds 6.02 dB.
a ground link: the first Fresnel zone is 6.23 m in radius at the middle of the path; keep at least 60% of it (3.74 m) clear of trees, roofs and terrain, and allow for the Earth's bulge on long paths (ITU-R P.530).
formula: L = 20·log10(4π·d/λ) = 20·log10(d km) + 20·log10(f GHz) + 92.45 dB (32.45 with f in MHz)
source: ITU-R P.525 (in force: P.525-5, 2024), free-space basic transmission loss L = 20·log10(4πd/λ); slant range on a spherical Earth of radius 6378.137 km (WGS 84 equatorial)
limit: free space only: no rain, gas, cloud, foliage, multipath, buildings or ground reflection. Add them as losses (ITU-R P.618 for Earth-space, P.530 for ground links, P.676 for gases).
rf · THE WHOLE BUDGET: RECEIVED POWER, NOISE, C/N, EB/N0, THE MARGIN AND THE VERDICT; THE HIG
$ linkbudget.py rf --freq-ghz 5.8 --km 3 --tx-dbm 20 --tx-gain-dbi 23 --rx-gain-dbi 23 --losses-db 2 --sensitivity-dbm -74 --want-margin-db 10
THE BUDGET · 5.8 GHz over 3.000 km
transmit power 20.00 dBm (100 mW)
+ transmit antenna gain 23.00 dBi (as given)
= EIRP 43.00 dBm (+13.00 dBW)
− free-space path loss -117.26 dB (ITU-R P.525)
− other losses -2.00 dB (as given: cables, pointing, rain, gas, polarisation)
+ receive antenna gain 23.00 dBi (as given)
= received power C -53.26 dBm (4.72 nW)
needed: the receiver's sensitivity -74.00 dBm
= MARGIN (have − needed) 20.74 dB
VERDICT: the link closes with 20.74 dB to spare (10.74 dB above the 10.00 dB you want to carry).
note: a ground link: keep 60% of the first Fresnel zone clear, 3.74 m of its 6.23 m radius at the middle of the path (fspl prints it)
formula: C = P_t + G_t − L_fs − L_other + G_r (dB); N0 = k·T; C/N0 = EIRP − L + G/T + 228.6 (dBW); Eb/N0 = C/N0 − 10·log10(R); C/N = C/N0 − 10·log10(B)
source: Friis, "A Note on a Simple Transmission Formula", Proc. IRE 34:254 (1946); ITU-R P.525 (in force: P.525-5, 2024), free-space basic transmission loss L = 20·log10(4πd/λ); Johnson and Nyquist (1928): N = k·T·B; Friis, "Noise Figures of Radio Receivers", Proc. IRE 32:419 (1944); k exact (SI 2019); JPL, DSN Telecommunications Link Design Handbook, 810-005 (the design-control-table method)
limit: free space plus the losses you name; the required Eb/N0 or sensitivity comes from your modulation, code or datasheet, and real receivers lose a few dB to implementation. Not a licence, power limit or safety distance.
noise · THE THERMAL NOISE FLOOR, NOISE FIGURE AND TEMPERATURE, A CASCADE
$ linkbudget.py noise --bw-mhz 20 --nf-db 5
thermal noise density at 290 K: k·T = 4.004e-21 W/Hz = -173.98 dBm/Hz (-203.98 dBW/Hz)
over 20 MHz: N = k·T·B = -100.96 dBm
a noise figure of 5.00 dB is a noise temperature of 627.1 K (Te = 290·(F − 1)); the receiver's noise floor is -168.98 dBm/Hz, -95.96 dBm over 20 MHz
(the floor with a 290 K source at its input; a dish looking at cold sky sees far less than 290 K)
formula: N0 = k·T; N = k·T·B; Te = 290·(F − 1); F_total = F1 + (F2 − 1)/G1 + (F3 − 1)/(G1·G2) + …
source: Johnson and Nyquist (1928): N = k·T·B; Friis, "Noise Figures of Radio Receivers", Proc. IRE 32:419 (1944); k exact (SI 2019); T0 = 290 K by the noise-figure definition
limit: white thermal noise only: no interference, phase noise, intermodulation or man-made noise; a real receiver also loses a few dB to its implementation.
rf · THE WHOLE BUDGET: RECEIVED POWER, NOISE, C/N, EB/N0, THE MARGIN AND THE VERDICT; THE HIG
$ linkbudget.py rf --freq-ghz 12 --alt-km 550 --elev-deg 30 --tx-w 2 --tx-gain-dbi 25 --rx-dish-m 0.6 --nf-db 1 --ant-temp-k 50 --bw-mhz 100 --rate-mbps 100 --required-ebn0-db 4 --losses-db 2 --want-margin-db 3
THE BUDGET · 12 GHz over 992.9 km slant range (a satellite at 550 km seen at 30° elevation)
transmit power 33.01 dBm (2 W)
+ transmit antenna gain 25.00 dBi (as given)
= EIRP 58.01 dBm (+28.01 dBW)
− free-space path loss -173.97 dB (ITU-R P.525)
− other losses -2.00 dB (as given: cables, pointing, rain, gas, polarisation)
+ receive antenna gain 35.33 dBi (a 0.60 m dish at efficiency 0.6)
= received power C -82.62 dBm (5.46 pW)
noise density N0 = k·T -177.63 dBm/Hz (T = 125.1 K = antenna 50 K + receiver 75.1 K (NF 1.00 dB))
G/T of the receiver 14.36 dB/K
C/N0 95.00 dB-Hz
noise power N = k·T·B -97.63 dBm (B = 100 MHz)
C/N 15.00 dB
Eb/N0 at 100 Mbps 15.00 dB (Eb/N0 = C/N0 − 10·log10(R))
needed: the required Eb/N0 4.00 dB
= MARGIN (have − needed) 11.00 dB
VERDICT: the link closes with 11.00 dB to spare (8.00 dB above the 3.00 dB you want to carry).
the highest rate that closes with 3.00 dB of margin at the required 4.00 dB Eb/N0: 631.4 Mbps (power-limited: R = C/N0 − Eb/N0 − margin)
but 631.4 Mbps is above the Shannon ceiling of 100 MHz (502.9 Mbps): here the bandwidth binds, not the power. A faster rate needs more bandwidth, or a modulation and code that pack more bits per hertz and need a higher Eb/N0 to do it.
the Shannon ceiling of this C/N in 100 MHz: 502.9 Mbps (no code can carry more, Shannon 1948).
note: the rx dish: 0.60 m at efficiency 0.6 gives 35.33 dBi (G = η·(πD/λ)²); the efficiency is an assumption
formula: C = P_t + G_t − L_fs − L_other + G_r (dB); N0 = k·T; C/N0 = EIRP − L + G/T + 228.6 (dBW); Eb/N0 = C/N0 − 10·log10(R); C/N = C/N0 − 10·log10(B)
source: Friis, "A Note on a Simple Transmission Formula", Proc. IRE 34:254 (1946); ITU-R P.525 (in force: P.525-5, 2024), free-space basic transmission loss L = 20·log10(4πd/λ); Johnson and Nyquist (1928): N = k·T·B; Friis, "Noise Figures of Radio Receivers", Proc. IRE 32:419 (1944); k exact (SI 2019); JPL, DSN Telecommunications Link Design Handbook, 810-005 (the design-control-table method)
limit: free space plus the losses you name; the required Eb/N0 or sensitivity comes from your modulation, code or datasheet, and real receivers lose a few dB to implementation. Not a licence, power limit or safety distance.
rf · THE WHOLE BUDGET: RECEIVED POWER, NOISE, C/N, EB/N0, THE MARGIN AND THE VERDICT; THE HIG
$ linkbudget.py rf --freq-ghz 12 --alt-km 550 --elev-deg 10 --tx-w 2 --tx-gain-dbi 25 --rx-dish-m 0.6 --nf-db 1 --ant-temp-k 50 --bw-mhz 100 --rate-mbps 100 --required-ebn0-db 4 --losses-db 8 --want-margin-db 3
THE BUDGET · 12 GHz over 1,815.7 km slant range (a satellite at 550 km seen at 10° elevation)
transmit power 33.01 dBm (2 W)
+ transmit antenna gain 25.00 dBi (as given)
= EIRP 58.01 dBm (+28.01 dBW)
− free-space path loss -179.21 dB (ITU-R P.525)
− other losses -8.00 dB (as given: cables, pointing, rain, gas, polarisation)
+ receive antenna gain 35.33 dBi (a 0.60 m dish at efficiency 0.6)
= received power C -93.87 dBm (410 fW)
noise density N0 = k·T -177.63 dBm/Hz (T = 125.1 K = antenna 50 K + receiver 75.1 K (NF 1.00 dB))
G/T of the receiver 14.36 dB/K
C/N0 83.76 dB-Hz
noise power N = k·T·B -97.63 dBm (B = 100 MHz)
C/N 3.76 dB
Eb/N0 at 100 Mbps 3.76 dB (Eb/N0 = C/N0 − 10·log10(R))
needed: the required Eb/N0 4.00 dB
= MARGIN (have − needed) -0.24 dB
VERDICT: the link does NOT close. It is 0.24 dB short.
the highest rate that closes with 3.00 dB of margin at the required 4.00 dB Eb/N0: 47.42 Mbps (power-limited: R = C/N0 − Eb/N0 − margin)
the Shannon ceiling of this C/N in 100 MHz: 175.6 Mbps (no code can carry more, Shannon 1948).
note: the rx dish: 0.60 m at efficiency 0.6 gives 35.33 dBi (G = η·(πD/λ)²); the efficiency is an assumption
formula: C = P_t + G_t − L_fs − L_other + G_r (dB); N0 = k·T; C/N0 = EIRP − L + G/T + 228.6 (dBW); Eb/N0 = C/N0 − 10·log10(R); C/N = C/N0 − 10·log10(B)
source: Friis, "A Note on a Simple Transmission Formula", Proc. IRE 34:254 (1946); ITU-R P.525 (in force: P.525-5, 2024), free-space basic transmission loss L = 20·log10(4πd/λ); Johnson and Nyquist (1928): N = k·T·B; Friis, "Noise Figures of Radio Receivers", Proc. IRE 32:419 (1944); k exact (SI 2019); JPL, DSN Telecommunications Link Design Handbook, 810-005 (the design-control-table method)
limit: free space plus the losses you name; the required Eb/N0 or sensitivity comes from your modulation, code or datasheet, and real receivers lose a few dB to implementation. Not a licence, power limit or safety distance.
delay · LIGHT TIME, ONE WAY AND THERE AND BACK
$ linkbudget.py delay --alt-km 550 --elev-deg 10
a satellite at 550 km seen at 10° elevation is 1,815.7 km away: 6.1 ms one way, 12.1 ms up and down through it (one hop, both ends at that elevation).
formula: t = d / c
source: c = 299,792,458 m/s exact (SI)
limit: the straight-line light time in vacuum; relays, processing, queues and the ground network add their own.
dish · A DISH'S GAIN, BEAMWIDTH AND FAR FIELD, OR THE DISH A GAIN NEEDS
$ linkbudget.py dish --freq-ghz 8.42 --diameter-m 34 --eff 0.77
a 34.000 m dish at 8.42 GHz (λ = 0.0356 m), efficiency 0.77: gain 68.41 dBi (6,929,966 times an isotropic antenna)
effective area 699.099 m² of 907.920 m² of aperture
half-power beamwidth about 0.073° (the rule of thumb 70·λ/D for a tapered feed); 0.062° for a uniformly lit aperture (1.029·λ/D rad)
the first null of a uniformly lit aperture is 0.073° off the axis (1.22·λ/D rad); the far field begins about 64.9 km away (2·D²/λ)
pointing loss ≈ 12·(θe/θ_3dB)² dB: half the beamwidth off costs 3 dB, a tenth of it 0.12 dB.
formula: G = η·(π·D/λ)², D = (λ/π)·√(G/η); θ_3dB ≈ 70·λ/D degrees; far field 2·D²/λ; pointing loss ≈ 12·(θe/θ_3dB)² dB
source: aperture antenna theory (Kraus, Antennas; Balanis, Antenna Theory): G = η·(πD/λ)², A_e = η·πD²/4; the 70·λ/D rule of thumb and the parabolic pointing-loss approximation from the same texts
limit: an ideal paraboloid: surface error, blockage by the feed, radome loss and mispointing lower the gain; the beamwidth constant depends on the feed's taper.
rf · THE WHOLE BUDGET: RECEIVED POWER, NOISE, C/N, EB/N0, THE MARGIN AND THE VERDICT; THE HIG
$ linkbudget.py rf --freq-ghz 8.42 --km 299195741.4 --tx-w 20 --tx-dish-m 3 --rx-gain-dbi 68.41 --sys-temp-k 20.70 --rate-mbps 0.2 --required-ebn0-db 2.5 --want-margin-db 3
THE BUDGET · 8.42 GHz over 299,195,741 km
transmit power 43.01 dBm (20 W)
+ transmit antenna gain 46.24 dBi (a 3.00 m dish at efficiency 0.6)
= EIRP 89.25 dBm (+59.25 dBW)
− free-space path loss -280.47 dB (ITU-R P.525)
− other losses 0.00 dB (none given)
+ receive antenna gain 68.41 dBi (as given)
= received power C -122.82 dBm (523 aW)
noise density N0 = k·T -185.44 dBm/Hz (T = 20.7 K, as given)
G/T of the receiver 55.25 dB/K
C/N0 62.62 dB-Hz
Eb/N0 at 200 kbps 9.61 dB (Eb/N0 = C/N0 − 10·log10(R))
needed: the required Eb/N0 2.50 dB
= MARGIN (have − needed) 7.11 dB
VERDICT: the link closes with 7.11 dB to spare (4.11 dB above the 3.00 dB you want to carry).
the highest rate that closes with 3.00 dB of margin at the required 2.50 dB Eb/N0: 515.6 kbps (power-limited: R = C/N0 − Eb/N0 − margin)
note: the tx dish: 3.00 m at efficiency 0.6 gives 46.24 dBi (G = η·(πD/λ)²); the efficiency is an assumption
formula: C = P_t + G_t − L_fs − L_other + G_r (dB); N0 = k·T; C/N0 = EIRP − L + G/T + 228.6 (dBW); Eb/N0 = C/N0 − 10·log10(R); C/N = C/N0 − 10·log10(B)
source: Friis, "A Note on a Simple Transmission Formula", Proc. IRE 34:254 (1946); ITU-R P.525 (in force: P.525-5, 2024), free-space basic transmission loss L = 20·log10(4πd/λ); Johnson and Nyquist (1928): N = k·T·B; Friis, "Noise Figures of Radio Receivers", Proc. IRE 32:419 (1944); k exact (SI 2019); JPL, DSN Telecommunications Link Design Handbook, 810-005 (the design-control-table method)
limit: free space plus the losses you name; the required Eb/N0 or sensitivity comes from your modulation, code or datasheet, and real receivers lose a few dB to implementation. Not a licence, power limit or safety distance.
delay · LIGHT TIME, ONE WAY AND THERE AND BACK
$ linkbudget.py delay --au 2
2 AU is 299.2 million km: 16.6 minutes one way, 33.3 minutes there and back.
formula: t = d / c
source: AU = 149,597,870,700 m exact (IAU 2012 Resolution B2); c = 299,792,458 m/s exact (SI)
limit: the straight-line light time in vacuum; relays, processing, queues and the ground network add their own.
optical · A LASER LINK: THE SPOT, THE CAPTURE, POINTING LOSS, RECEIVED POWER, PHOTONS PER SECOND A
$ linkbudget.py optical --wavelength-nm 1550 --tx-w 1 --divergence-urad 15 --rx-aperture-cm 10 --km 4000 --pointing-error-urad 2 --losses-db 3 --rate-mbps 10000
THE LASER LINK · 1550 nm, 1 W, over 4,000 km
the beam: 15 µrad full angle (1/e²) → half angle 7.5 µrad; a beam this narrow needs a waist of 13.2 cm (2·w0, w0 = λ/(π·θ)), whose near field ends at 8.8 km (z_R = π·w0²/λ)
the spot at range: 60.00 m across (2·w at 1/e²)
the capture: a 10 cm receiver at the beam's centre catches 5.56e-06 of the power (-52.55 dB) = 1 − exp(−2a²/w²)
as gains, the same thing: G_t 111.53 dBi + G_r 106.14 dBi − free-space loss 270.22 dB = -52.55 dB
pointing: 2 µrad off the axis costs 0.62 dB = exp(−2·(θe/θ)²)
other losses: 3.00 dB (as given: optics, atmosphere, detector)
RECEIVED: 2.42 µW = -26.17 dBm
photons: one at 1550 nm carries 1.28e-19 J (0.7999 eV); 1.88e+13 photons a second arrive
at 10 Gbps that is 1.88e+03 photons a bit. Photon-counting receivers are built to work with a handful of photons a bit; ordinary photodiode receivers need far more.
formula: P_r = P_t · (1 − exp(−2a²/w²)) · exp(−2θe²/θ²) · L; w = w0·√(1 + (z/z_R)²), w0 = λ/(π·θ); G_t = 8/θ², G_r = (π·D/λ)²; photons/s = P_r·λ/(h·c)
source: Gaussian beam optics (Kogelnik and Li, Applied Optics 5:1550, 1966): w(z) = w0·√(1 + (z/z_R)²), θ = λ/(π·w0); Friis, "A Note on a Simple Transmission Formula", Proc. IRE 34:254 (1946); h and c exact (SI 2019)
limit: a Gaussian beam in vacuum and a receiver at its centre: no atmosphere, turbulence, cloud, jitter spectrum or detector efficiency unless given as losses. Not a laser eye-safety figure: that belongs to the laser's maker and a qualified engineer.
optical · A LASER LINK: THE SPOT, THE CAPTURE, POINTING LOSS, RECEIVED POWER, PHOTONS PER SECOND A
$ linkbudget.py optical --wavelength-nm 1550 --tx-w 1 --divergence-urad 15 --rx-aperture-cm 10 --km 5400 --pointing-error-urad 2 --losses-db 3 --rate-mbps 10000
THE LASER LINK · 1550 nm, 1 W, over 5,400 km
the beam: 15 µrad full angle (1/e²) → half angle 7.5 µrad; a beam this narrow needs a waist of 13.2 cm (2·w0, w0 = λ/(π·θ)), whose near field ends at 8.8 km (z_R = π·w0²/λ)
the spot at range: 81.00 m across (2·w at 1/e²)
the capture: a 10 cm receiver at the beam's centre catches 3.05e-06 of the power (-55.16 dB) = 1 − exp(−2a²/w²)
as gains, the same thing: G_t 111.53 dBi + G_r 106.14 dBi − free-space loss 272.83 dB = -55.16 dB
pointing: 2 µrad off the axis costs 0.62 dB = exp(−2·(θe/θ)²)
other losses: 3.00 dB (as given: optics, atmosphere, detector)
RECEIVED: 1.33 µW = -28.78 dBm
photons: one at 1550 nm carries 1.28e-19 J (0.7999 eV); 1.03e+13 photons a second arrive
at 10 Gbps that is 1.03e+03 photons a bit. Photon-counting receivers are built to work with a handful of photons a bit; ordinary photodiode receivers need far more.
formula: P_r = P_t · (1 − exp(−2a²/w²)) · exp(−2θe²/θ²) · L; w = w0·√(1 + (z/z_R)²), w0 = λ/(π·θ); G_t = 8/θ², G_r = (π·D/λ)²; photons/s = P_r·λ/(h·c)
source: Gaussian beam optics (Kogelnik and Li, Applied Optics 5:1550, 1966): w(z) = w0·√(1 + (z/z_R)²), θ = λ/(π·w0); Friis, "A Note on a Simple Transmission Formula", Proc. IRE 34:254 (1946); h and c exact (SI 2019)
limit: a Gaussian beam in vacuum and a receiver at its centre: no atmosphere, turbulence, cloud, jitter spectrum or detector efficiency unless given as losses. Not a laser eye-safety figure: that belongs to the laser's maker and a qualified engineer.
optical · A LASER LINK: THE SPOT, THE CAPTURE, POINTING LOSS, RECEIVED POWER, PHOTONS PER SECOND A
$ linkbudget.py optical --wavelength-nm 1550 --tx-w 4 --tx-aperture-cm 22 --rx-aperture-cm 510 --km 31000000 --rate-mbps 267
THE LASER LINK · 1550 nm, 4 W, over 31,000,000 km
the beam: a 22 cm transmit aperture at efficiency 1 gives 112.98 dBi, the gain of a Gaussian beam with a 6.34 µrad half angle (θ = √(8/G)); efficiency 1 is the ideal, the upper bound
the spot at range: 393.3 km across (2·w at 1/e²)
the capture: a 5.1 m receiver at the beam's centre catches 3.36e-10 of the power (-94.73 dB) = 1 − exp(−2a²/w²)
as gains, the same thing: G_t 112.98 dBi + G_r 140.29 dBi − free-space loss 348.00 dB = -94.73 dB
pointing: no error given, so no loss counted; real terminals hold the beam to a fraction of its width, and every µrad off costs exp(−2·(θe/θ)²)
other losses: none given (optics, atmosphere, clouds and the detector all take some)
RECEIVED: 1.35 nW = -58.71 dBm
photons: one at 1550 nm carries 1.28e-19 J (0.7999 eV); 1.05e+10 photons a second arrive
at 267 Mbps that is 39.3 photons a bit. Photon-counting receivers are built to work with a handful of photons a bit; ordinary photodiode receivers need far more.
formula: P_r = P_t · (1 − exp(−2a²/w²)) · exp(−2θe²/θ²) · L; w = w0·√(1 + (z/z_R)²), w0 = λ/(π·θ); G_t = 8/θ², G_r = (π·D/λ)²; photons/s = P_r·λ/(h·c)
source: Gaussian beam optics (Kogelnik and Li, Applied Optics 5:1550, 1966): w(z) = w0·√(1 + (z/z_R)²), θ = λ/(π·w0); Friis, "A Note on a Simple Transmission Formula", Proc. IRE 34:254 (1946); h and c exact (SI 2019)
limit: a Gaussian beam in vacuum and a receiver at its centre: no atmosphere, turbulence, cloud, jitter spectrum or detector efficiency unless given as losses. Not a laser eye-safety figure: that belongs to the laser's maker and a qualified engineer.
optical · A LASER LINK: THE SPOT, THE CAPTURE, POINTING LOSS, RECEIVED POWER, PHOTONS PER SECOND A
$ linkbudget.py optical --wavelength-nm 1550 --tx-w 4 --tx-aperture-cm 22 --rx-aperture-cm 510 --km 390000000 --rate-mbps 6.25
THE LASER LINK · 1550 nm, 4 W, over 390,000,000 km
the beam: a 22 cm transmit aperture at efficiency 1 gives 112.98 dBi, the gain of a Gaussian beam with a 6.34 µrad half angle (θ = √(8/G)); efficiency 1 is the ideal, the upper bound
the spot at range: 4,947.6 km across (2·w at 1/e²)
the capture: a 5.1 m receiver at the beam's centre catches 2.13e-12 of the power (-116.73 dB) = 1 − exp(−2a²/w²)
as gains, the same thing: G_t 112.98 dBi + G_r 140.29 dBi − free-space loss 370.00 dB = -116.73 dB
pointing: no error given, so no loss counted; real terminals hold the beam to a fraction of its width, and every µrad off costs exp(−2·(θe/θ)²)
other losses: none given (optics, atmosphere, clouds and the detector all take some)
RECEIVED: 8.5 pW = -80.71 dBm
photons: one at 1550 nm carries 1.28e-19 J (0.7999 eV); 6.63e+07 photons a second arrive
at 6.25 Mbps that is 10.6 photons a bit. Photon-counting receivers are built to work with a handful of photons a bit; ordinary photodiode receivers need far more.
formula: P_r = P_t · (1 − exp(−2a²/w²)) · exp(−2θe²/θ²) · L; w = w0·√(1 + (z/z_R)²), w0 = λ/(π·θ); G_t = 8/θ², G_r = (π·D/λ)²; photons/s = P_r·λ/(h·c)
source: Gaussian beam optics (Kogelnik and Li, Applied Optics 5:1550, 1966): w(z) = w0·√(1 + (z/z_R)²), θ = λ/(π·w0); Friis, "A Note on a Simple Transmission Formula", Proc. IRE 34:254 (1946); h and c exact (SI 2019)
limit: a Gaussian beam in vacuum and a receiver at its centre: no atmosphere, turbulence, cloud, jitter spectrum or detector efficiency unless given as losses. Not a laser eye-safety figure: that belongs to the laser's maker and a qualified engineer.
delay · LIGHT TIME, ONE WAY AND THERE AND BACK
$ linkbudget.py delay --km 30577536
30,577,536 km: 102.00 s one way, 3.4 minutes there and back.
formula: t = d / c
source: c = 299,792,458 m/s exact (SI)
limit: the straight-line light time in vacuum; relays, processing, queues and the ground network add their own.
delay · LIGHT TIME, ONE WAY AND THERE AND BACK
$ linkbudget.py delay --km 460000000
460,000,000 km: 25.6 minutes one way, 51.1 minutes there and back.
formula: t = d / c
source: c = 299,792,458 m/s exact (SI)
limit: the straight-line light time in vacuum; relays, processing, queues and the ground network add their own.
shannon · HANNON CAPACITY, OR THE SNR A RATE NEEDS
$ linkbudget.py shannon --bw-mhz 20 --snr-db 15
a 20 MHz channel at 15.00 dB SNR (31.62 times): capacity 100.6 Mbps, 5.028 bit/s per Hz
at that rate Eb/N0 = SNR − 10·log10(C/B) = 7.99 dB; no scheme reliably goes below -1.59 dB Eb/N0 (ln 2), however wide the band
real systems run below the ceiling: modern codes come within about a dB of it, simple ones several dB short.
formula: C = B·log2(1 + S/N); S/N = 2^(R/B) − 1; Eb/N0 → ln 2 = −1.59 dB as B grows without limit
source: Shannon, "A Mathematical Theory of Communication", Bell System Technical Journal 27 (1948)
limit: a ceiling for a channel with white Gaussian noise and an ideal code; fading, interference and a finite block length all lower what is reached.
shannon · HANNON CAPACITY, OR THE SNR A RATE NEEDS
$ linkbudget.py shannon --bw-mhz 20 --rate-mbps 300
to carry 300 Mbps in 20 MHz takes an SNR of at least 45.15 dB (15.000 bit/s per Hz); that is the floor, before any real code's gap
formula: C = B·log2(1 + S/N); S/N = 2^(R/B) − 1; Eb/N0 → ln 2 = −1.59 dB as B grows without limit
source: Shannon, "A Mathematical Theory of Communication", Bell System Technical Journal 27 (1948)
limit: a ceiling for a channel with white Gaussian noise and an ideal code; fading, interference and a finite block length all lower what is reached.
noise · THE THERMAL NOISE FLOOR, NOISE FIGURE AND TEMPERATURE, A CASCADE
$ linkbudget.py noise --cascade 1:20,10:0
thermal noise density at 290 K: k·T = 4.004e-21 W/Hz = -173.98 dBm/Hz (-203.98 dBW/Hz)
cascade of 2 stages (NF dB : gain dB, in order): 1:20 → 10:0
total noise figure 1.300 dB (101.2 K), total gain 20.00 dB. The first stage sets most of it: put the low-noise amplifier first.
formula: N0 = k·T; N = k·T·B; Te = 290·(F − 1); F_total = F1 + (F2 − 1)/G1 + (F3 − 1)/(G1·G2) + …
source: Johnson and Nyquist (1928): N = k·T·B; Friis, "Noise Figures of Radio Receivers", Proc. IRE 32:419 (1944); k exact (SI 2019); T0 = 290 K by the noise-figure definition
limit: white thermal noise only: no interference, phase noise, intermodulation or man-made noise; a real receiver also loses a few dB to its implementation.
delay · LIGHT TIME, ONE WAY AND THERE AND BACK
$ linkbudget.py delay --geo
a geostationary satellite is 35,786 km above the equator (from the sidereal day and the Earth's GM).
one way, ground to satellite: 119.4 ms straight overhead, 139.0 ms at 0° elevation (41,679 km)
one hop, ground → satellite → ground: 238.7 ms to 278.1 ms; a question and its answer over one hop each way: 477.5 ms to 556.1 ms, before any processing.
that is why a call over a geostationary link lags, and why low orbits (a few hundred km) cut it to a few milliseconds a hop.
formula: t = d / c
source: GEO radius = (GM·T²/4π²)^(1/3), GM and R from WGS 84, sidereal day 86,164.0905 s; c = 299,792,458 m/s exact (SI)
limit: the straight-line light time in vacuum; relays, processing, queues and the ground network add their own.
delay · LIGHT TIME, ONE WAY AND THERE AND BACK
$ linkbudget.py delay --mars --date 2026-10-09
on 2026-10-09 the Earth and Mars are about 240.2 million km apart: 13.4 minutes one way, 26.7 minutes there and back.
it runs from about 3.0 minutes at the closest (54.6 million km) to 22.3 minutes at the farthest (401.4 million km).
what it means for a link: no conversation and no real-time control; a link protocol must wait out the round trip before it can ask for a lost frame again.
formula: t = d / c
source: JPL Solar System Dynamics, Approximate Positions of the Planets, Table 1 (1800-2050 AD); extremes from the NASA Mars Fact Sheet; c = 299,792,458 m/s exact (SI)
limit: mean orbital elements: good to about 50,000 km, a fraction of a second of light time; the Earth taken at the Earth-Moon barycentre; the straight-line light time in vacuum; relays, processing, queues and the ground network add their own.
THE RUNS ARE PASTED FROM THE CARD’S OWN WITNESS.MD AS PRINTED. FIGURES MARKED FAKE ARE THE STUDIO’S OWN EXAMPLES, INVENTED FOR THE RECORD; PUBLISHED FIGURES ARE NAMED WITH THEIR SOURCES. NO PRIVATE PERSON IS NAMED.