# ITU Calculator Formula Reference
Per-cell trace of every ITU recommendation, equation, and physical constant used in the Google Sheets calculator **`ITU_CERTIFIED_Battle_of_the_Beams_Calc_v9_1_1`**. Built 2026-04-19.
The calculator takes one target (e.g. Derby) and computes **three** ITU-standard propagation models side-by-side for both Kleve and Stollberg beams:
1. **P.526-16 §3.1.1.2 Fock residue** — primary smooth-Earth diffraction (the GE, "Ground Earth" model)
2. **ITU Handbook on Ground Wave Propagation (2014) §3.2.1 Sommerfeld-Norton** — free-space + plane-Earth reflection + surface-wave three-term sum (the FE, "Flat Earth" model)
3. **P.526-16 §4 Eq. 31 Bullington knife-edge** — single-edge diffraction approximation over the Earth bulge
Plus the noise floor from P.372-16, the sinc aperture equisignal width (derived from first principles), and a target-selectable Pass/Fail results dashboard on the Main tab. Every cell is derivable from the SI base constants plus one of the ITU recommendations indexed below.
### Tab layout
| tab | purpose |
|---|---|
| `Main` | target dropdown, geometry row, Results dashboard (Shape A per-model PASS/FAIL + Pair Verdict) |
| `ITU` | all propagation math; columns A-BP hold headers, geometry, F(X)/G(Y), final μV; columns BQ-CY hold the Sommerfeld-Norton three-term complex sum; columns CZ-DD hold the Bullington knife-edge |
| `const` | SI constants and derived values |
| `ground` | σ, ε_r by ground type (land/sea/wet/dry) |
| `paths_refs` | station / target coordinate catalogue |
Final per-model signal strength lives in **`ITU!BP`** column (μV at 50 Ω); the Main dashboard pulls from there via cell references like `=ITU!BP3`.
# Calculator Link
https://docs.google.com/spreadsheets/d/1OLVtmidIRAyDZx_wz-8_Ht59Jhb0ctsYp2B8XhC1V3s/edit?gid=1176362580#gid=1176362580
---
## The master chain in one picture
```
ε₀, μ₀ ─────► c = 1/√(ε₀·μ₀) ────► λ = c/f
│
R_earth ─► k_refr = 4/3 ─► aₑ = k·R ─┤
│
σ, ε_r (ground!) ────► K² (Eq. 16a) ───┤
K ────┐ │
▼ │
polarization + f cut ──► β (Eq. 16) ───┤
▼
d, h_tx, h_rx ──► X (Eq. 14), Y₁, Y₂ (Eq. 15)
│
┌──────────────────────┬──────────────────┴───────────────────┐
▼ GE (Fock) ▼ FE (Sommerfeld-Norton) ▼ KE (Bullington)
F(X)+G(Y₁)+G(Y₂) direct + reflected + surface 6.9 + 20·log₁₀(√((ν-0.1)²+1)+ν-0.1)
P.526-16 Eq. 13 ITU Handbook GW 2014 §3.2.1 P.526-16 §4 Eq. 31
│ primary │ flat-Earth reference │ single-edge over bulge
│ │ (three-term complex sum) │ (Fresnel ν, h = bulge − chord)
▼ ▼ ▼
loss(dB) gated by d_LoS = √(2aₑh_tx)+√(2aₑh_rx)
│
▼
P_rx = P_tx + G_tx + G_rx − FSPL − Loss (Friis + model)
│
▼
N_floor = k_B·T·B + Fa (ITU-R P.372-16 Eq. 14)
│
▼
SNR = P_rx − N_floor
SNR_eq = SNR − 19.87 dB (sinc² at 5° squint, 99 m aperture)
│
▼
E (dBμV/m), V (μV at 50 Ω) — ITU-R P.525 conventions
│
▼
PASS/FAIL vs N_floor per model, per beam
PAIR PASS only if BOTH Kleve AND Stollberg PASS
```
---
## ITU-R P.526-16 (2025) — Propagation by diffraction
The primary workhorse. Everything in §3.1.1.2 "Diffraction field strength formulae" (printed pages 9-10) is implemented in the sheet.
**Source PDF:** ITU-R_P526-16_2025.pdf` (49 pages, ITU-R, October 2025)
### Main equation page (p. 9)
![[ITU_P526-16_p9_eqs_13_to_17.png]]
### G(Y) and accuracy bound (p. 10)
![[ITU_P526-16_p10_eq_18_Gy.png]]
---
### Eq. 13 — Total diffracted field
ITU P.526-16 p. 9:
```
20·log₁₀(E/E₀) = F(X) + G(Y₁) + G(Y₂) dB
```
**Role:** Master closeout. Sum the distance attenuation and the two height gains to get the diffracted field relative to free-space at the same range.
| path | cell | formula |
|---|---|---|
| Kleve | `ITU_Calc!B65` | `=kl_F_X+kl_G_Y1+kl_G_Y2` |
| Stollberg | `ITU_Calc!E65` | `=st_F_X+st_G_Y1+st_G_Y2` |
**Derby spot check:**
- Kleve → Derby: E/E₀ = −63.46 dB
- Stollberg → Derby: E/E₀ = −96.64 dB
---
### Eq. 14 — Normalized distance X
ITU P.526-16 p. 9:
```
X = β · (π / (λ · aₑ²))^(1/3) · d (self-consistent units)
```
**Role:** Measures the path length in units set by the Earth-curvature horizon scale. F(X) and G(Y) both consume this normalized coordinate instead of raw meters.
| path | cell | formula |
|---|---|---|
| Kleve | `ITU_Calc!B48` | `=kl_beta*(pi/(kl_wavelen_m*r_effective^2))^(1/3)*kl_dist_m` |
| Stollberg | `ITU_Calc!E48` | `=st_beta*(pi/(st_wavelen_m*r_effective^2))^(1/3)*st_dist_m` |
The threshold **X = 1.6** is where F(X) switches branches in Eq. 17a/17b. Every operational Knickebein path has X > 6 so we always hit the long-path branch.
---
### Eq. 15 — Normalized antenna height Y
ITU P.526-16 p. 9:
```
Y = 2β · (π² / (λ² · aₑ))^(1/3) · h (self-consistent units)
```
**Role:** Antenna height expressed in Fresnel-zone-at-horizon units. The factor 2 is geometric. Each end of the path contributes its own Y, leading to the pair of G(Y) terms in Eq. 13.
| path | cell | formula |
|---|---|---|
| Kleve TX (111 m) | `ITU_Calc!B49` | `=2*kl_beta*(pi^2/(kl_wavelen_m^2*r_effective))^(1/3)*kl_h_tx` |
| Kleve RX (6000 m) | `ITU_Calc!B50` | `=2*kl_beta*(pi^2/(kl_wavelen_m^2*r_effective))^(1/3)*h_rx` |
| Stollberg TX (72 m) | `ITU_Calc!E49` | `=2*st_beta*(pi^2/(st_wavelen_m^2*r_effective))^(1/3)*st_h_tx` |
| Stollberg RX (6000 m) | `ITU_Calc!E50` | `=2*st_beta*(pi^2/(st_wavelen_m^2*r_effective))^(1/3)*h_rx` |
Rule of thumb: Y > 1 means the antenna sees over the horizon in curvature terms. Y < 1 means it's buried in the near-field.
---
### Eq. 16 — β parameter (lossy-ground correction)
ITU P.526-16 p. 9:
```
β = (1 + 1.6·K² + 0.67·K⁴) / (1 + 4.5·K² + 1.53·K⁴)
```
**Role:** Scales X and Y to account for energy bleeding into the ground. Horizontal pol gets β = 1 at any frequency. Vertical pol gets β = 1 above 20 MHz over land or above 300 MHz over sea. Otherwise β is computed from K via this Padé rational fit.
**Coefficient origin:** empirical fit to the exact Sommerfeld ground-wave β(K) curve. The ratio 0.67/1.53 = 0.438 is the lossy-ground asymptotic limit as K → ∞.
| path | cell | formula |
|---|---|---|
| Kleve | `ITU_Calc!B43` | `=(1+1.6*B41+0.67*B41^2)/(1+4.5*B41+1.53*B41^2)` |
| Stollberg | `ITU_Calc!E43` | same structure, E41 instead of B41 |
| Kleve β final | `ITU_Calc!B44` | `=IF(B40, 1, B43)` → 1.00 (shortcut applies) |
| Stollberg β final | `ITU_Calc!E44` | `=IF(E40, 1, E43)` → 0.81 (Eq. 16 applies, sea-31.5 MHz below 300 MHz cut) |
**This is the difference between Kleve (land) and Stollberg (sea) in the null hypothesis.** Kleve's path is overland at 31.5 MHz, which clears the 20 MHz land cut → β = 1. Stollberg's path is over the North Sea at 31.5 MHz, which fails the 300 MHz sea cut → β ≈ 0.81, and the Eq. 18 G(Y) floor clamp becomes live.
---
### Eq. 16a — K² from σ, f, k_refr
ITU P.526-16 p. 9:
```
K² ≈ 6.89·σ / (k^(2/3) · f_MHz^(5/3))
```
where k here is the effective-Earth-radius multiplier (our 4/3), NOT the wavenumber.
**Role:** Simplified form of the full K from Eq. 11/12 (which also uses ε). ITU drops the ε dependence for the K used in Eq. 16 because it's within 2% over all operationally relevant ground types.
| path | cell | formula |
|---|---|---|
| Kleve | `ITU_Calc!B41` | `=6.89*kl_sigma/(k_refrac^(2/3)*kl_freq_MHz^(5/3))` |
| Stollberg | `ITU_Calc!E41` | `=6.89*st_sigma/(k_refrac^(2/3)*st_freq_mhz^(5/3))` |
**Derby spot check:**
- Kleve (σ = 5e-3 land): K² ≈ 9.05E-5 → K ≈ 0.0095 (negligible, ground behaves as perfect conductor)
- Stollberg (σ = 5.0 sea): K² ≈ 0.0906 → K ≈ 0.301 (the Eq. 18 clamp will bite here)
See also the full Eq. 11/12 formulation on page 7 (not used in the sheet because the simplified form suffices):
![[ITU_P526-16_p7_K_formulas.png]]
And Figure 2, the K vs frequency chart that validates the simplification:
![[ITU_P526-16_p8_figure2_K_chart.png]]
---
### Eq. 17a / 17b — Distance term F(X) — **THE AIRY SHADOW DECAY**
ITU P.526-16 p. 9:
```
F(X) = 11 + 10·log₁₀(X) − 17.6·X for X ≥ 1.6 (17a)
F(X) = −20·log₁₀(X) − 5.6488·X^1.425 for X < 1.6 (17b)
```
**Role:** The diffraction decay past the radio horizon. This is the single term that carries the full shadow-zone physics.
The `−17.6·X` coefficient is the **first Airy zero distilled**. The rigorous Fock residue series past the horizon collapses to a single exponential whose decay rate is:
```
α_dB/X = 20·log₁₀(e) · (√3/2) · t₁
= 8.686 · 0.866 · 2.33811
≈ 17.59 dB per unit X
```
where `t₁ = 2.33810741...` is the first zero of the Airy function Ai(−t). ITU rounded to 17.6 and wrote it as a plain number in Eq. 17a. No Ai(x) evaluation needed at runtime.
| path | cell | formula |
|---|---|---|
| Kleve | `ITU_Calc!B54` | `=IF(B53, 11+10*LOG10(kl_X)-17.6*kl_X, -20*LOG10(MAX(kl_X,1E-10))-5.6488*kl_X^1.425)` |
| Stollberg | `ITU_Calc!E54` | same structure, E48 and E53 instead |
**Derby spot check:**
- Kleve F(X) ≈ −134.29 dB (at X = 8.79)
- Stollberg F(X) ≈ −147.28 dB (at X = 9.55)
The `11 + 10·log₁₀(X)` prefactor is the residue-series amplitude, also distilled from Airy prefactors. The `−20·log₁₀(X) − 5.6488·X^1.425` short-path branch is a log-regime fit used inside X < 1.6, where the wave is still within a few horizon-widths of the TX. We never hit it in this calculator.
---
### Eq. 18 / 18a / 18b — Height gain G(Y) and Eq. 18 floor
ITU P.526-16 p. 10:
```
G(Y) ≅ 17.6·√(B − 1.1) − 5·log₁₀(B − 1.1) − 8 for B > 2 (18)
G(Y) ≅ 20·log₁₀(B + 0.1·B³) for B ≤ 2 (18a)
B = β·Y (18b)
If G(Y) < 2 + 20·log₁₀(K), set G(Y) = 2 + 20·log₁₀(K). (Eq. 18 floor)
```
**Role:** How much the TX/RX antennas "see over" the horizon in curvature-scaled terms. G(Y) is strongly positive when the antenna is tall (B > 2, tall branch) and rescues the F(X) shadow loss. G(Y) is weakly negative when the antenna is buried in the near-field (B ≤ 2, short branch).
The constants 17.6, −1.1, −5, −8 in the tall branch and the 0.1·B³ correction in the short branch are Padé-style fits to the Airy-function ratio ψ₁(Y)/ψ₁(0) that appears in the full Fock residue expansion.
**Eq. 18 floor:** When β comes from Eq. 16 (vertical pol below the frequency cut), G(Y) cannot drop below `2 + 20·log₁₀(K)`. This is the lower-bound clamp that caught Stollberg's TX-height gain.
| TX/RX | path | cell | formula (raw) |
|---|---|---|---|
| B₁ = β·Y₁ | Kleve | `ITU_Calc!B57` | `=kl_beta*kl_Y_tx` |
| G(Y₁) raw | Kleve | `ITU_Calc!B58` | `=IF(B57>2, 17.6*SQRT(B57-1.1)-5*LOG10(B57-1.1)-8, 20*LOG10(MAX(B57,1E-10)+0.1*MAX(B57,1E-10)^3))` |
| G(Y₁) + floor | Kleve | `ITU_Calc!B59` | `=IF(kl_K_clamp>0, MAX(B58, 2+20*LOG10(kl_K_clamp)), B58)` |
| B₂ = β·Y₂ | Kleve | `ITU_Calc!B60` | `=kl_beta*kl_Y_rx` |
| G(Y₂) raw | Kleve | `ITU_Calc!B61` | same structure on B60 |
| G(Y₂) + floor | Kleve | `ITU_Calc!B62` | same structure |
Stollberg mirrors the above in column E (rows 57–62).
**Derby spot check:**
| quantity | Kleve | Stollberg | observation |
|---|---|---|---|
| B₁ = β·Y₁ | 0.52 | 0.221 | both B < 2 → short branch |
| G(Y₁) raw | −5.45 dB | −13.06 dB | Stollberg worse (lower TX, β shrinks further) |
| G(Y₁) + floor | −5.45 dB | **−8.43 dB** | **Eq. 18 floor catches on Stollberg**, rescuing 4.6 dB |
| B₂ = β·Y₂ | 28.09 | 18.44 | both B > 2 → tall branch |
| G(Y₂) raw/final | +76.28 dB | +59.07 dB | aircraft altitude rescue |
That 4.6 dB clamp rescue on Stollberg's TX side is the single most important effect of the β correction applied to the BotB analysis in April 2026.
---
## ITU Handbook on Ground Wave Propagation (2014) — §3.2.1 Sommerfeld-Norton
The "Flat Earth" (FE) reference model. Computes the total field over a lossy plane Earth as the coherent sum of three complex contributions:
```
E_z = (√(90·P_tx·G_tx) / d) · [ D · e^(−jkr₁)/r₁
+ R_v · D' · e^(−jkr₂)/r₂
+ (1 − R_v) · F(w) · S · e^(−jkr₂)/r₂ ]
```
where
- **direct ray** `D = cos²ψ₁` with `r₁ = √(d² + (h_rx − h_tx)²)`
- **reflected ray** `R_v · D'` with `D' = cos²ψ₂`, `r₂ = √(d² + (h_rx + h_tx)²)`
- **surface wave** `(1 − R_v) · F(w) · S` with Norton attenuation function F(w) and shape term S = 1 − u² + u⁴·cos²ψ₂
**Role:** Pure Flat-Earth sanity check. Ignores Earth curvature entirely, so it over-predicts field strength at long range (no horizon shadow). Useful as a ceiling the Fock model must fall under, and as a visual "what if they'd gotten lucky with a flat Earth" counterfactual. In the BotB null hypothesis, Sommerfeld-Norton is the **maximum** field the system could ever receive — if the SN result doesn't cross the noise floor, no amount of further propagation magic will save the beam.
### Key pieces
- **Fresnel reflection coefficient (vertical pol)** `R_v = (n²·sinψ₂ − √(n²−cos²ψ₂)) / (n²·sinψ₂ + √(n²−cos²ψ₂))`, with `n² = ε_r − j·60·λ·σ`
- **Norton numerical distance** `w = (−j·2k·r₂ · u²) · (1 − u²·cos²ψ₂) / (1 − R_v)`, with `u² = 2 / (ε_r − j·60·λ·σ)`
- **Attenuation function F(w)** — asymptotic series for |w| > 10: `F(w) ≈ −1/(2w) − 3/(2w)² − 15/(2w)³ − 105/(2w)⁴`
- **Prefactor** `√(90·P_tx)` with P_tx = 500 W → 519.615 V/m·√m at 1 m
- **TX gain boost** `√(G_tx / 1.5)` converts Handbook's short-dipole reference to the 26 dBi Wellenspiegel
### Spreadsheet layout (ITU tab, rows 6 = Kleve, 7 = Stollberg)
| col | symbol | formula |
|---|---|---|
| `BQ` | x = 18000·σ/f_MHz | `=1.8E4*T6/H6` |
| `BR` | Δh₁ = h_rx − h_tx | `=h_rx-G6` |
| `BS` | Δh₂ = h_rx + h_tx | `=h_rx+G6` |
| `BT` | r₁ | `=SQRT(O6^2+BR6^2)` |
| `BU` | r₂ | `=SQRT(O6^2+BS6^2)` |
| `BV` | cos²ψ₁ | `=(O6/BT6)^2` |
| `BW` | cos²ψ₂ | `=(O6/BU6)^2` |
| `BX` | sin ψ₂ | `=BS6/BU6` |
| `BY` | u² (complex) | `=IMDIV(2,COMPLEX(U6,-BQ6))` |
| `BZ` | n² (complex) | `=COMPLEX(U6,-BQ6)` |
| `CA` | n²·sin ψ₂ | `=IMPRODUCT(BZ6,COMPLEX(BX6,0))` |
| `CB` | √(n²−cos²ψ₂) | `=IMSQRT(IMSUB(BZ6,COMPLEX(BW6,0)))` |
| `CC` | R_v | `=IMDIV(IMSUB(CA6,CB6),IMSUM(CA6,CB6))` |
| `CD` | 1 − R_v | `=IMSUB(1,CC6)` |
| `CE` | 1 − u²·cos²ψ₂ | `=IMSUB(1,IMPRODUCT(BY6,BW6))` |
| `CF` | −j·2k·r₂ | `=COMPLEX(0,-2*S6*BU6)` |
| `CG` | w numerator | `=IMPRODUCT(CF6,BY6,CE6)` |
| `CH` | w | `=IMDIV(CG6,CD6)` |
| `CI` | 2w | `=IMPRODUCT(CH6,2)` |
| `CJ` | F(w) asymptotic | `=IMSUM(IMDIV(-1,CI6), IMDIV(-3,IMPOWER(CI6,2)), IMDIV(-15,IMPOWER(CI6,3)), IMDIV(-105,IMPOWER(CI6,4)))` |
| `CK` | e^(−jkr₁) | `=IMEXP(COMPLEX(0,-S6*BT6))` |
| `CL` | e^(−jkr₂) | `=IMEXP(COMPLEX(0,-S6*BU6))` |
| `CM` | direct = cos²ψ₁·e^(−jkr₁)/r₁ | `=IMDIV(IMPRODUCT(BV6,CK6),BT6)` |
| `CN` | reflected = cos²ψ₂·R_v·e^(−jkr₂)/r₂ | `=IMDIV(IMPRODUCT(BW6,CC6,CL6),BU6)` |
| `CO` | u⁴ | `=IMPOWER(BY6,2)` |
| `CP` | 1 − u² + u⁴·cos²ψ₂ | `=IMSUM(IMSUB(1,BY6),IMPRODUCT(CO6,BW6))` |
| `CQ` | surface = (1−R_v)·(1−u²+u⁴cos²ψ₂)·F(w)·e^(−jkr₂)/r₂ | `=IMDIV(IMPRODUCT(CD6,CP6,CJ6,CL6),BU6)` |
| `CR` | D + R + S sum | `=IMSUM(CM6,CN6,CQ6)` |
| `CS` | \|sum\| | `=IMABS(CR6)` |
| `CT` | prefactor √(90·P_tx) | `=SQRT(90*M6)` (=519.615 V/m at 500 W) |
| `CU` | \|E_z\| | `=CT6*CS6` |
| `CV` | antenna boost √(G_tx/1.5) | `=SQRT(AV6/1.5)` (=16.296 at 26 dBi) |
| `CW` | E_boosted | `=CU6*CV6` |
| `CX` | P_rx (W) | `=CW6^2*R6^2*10^(AX6/10)/(8*PI()*376.730313)` |
| `CY` | P_rx (dBW) | `=10*LOG10(CX6)` |
| `AY` | link budget P_rx (dBW) | `=CY6` (and `=CY7` for row 7) |
**Critical: the 8π in CX.** The `8*π` in the denominator of `CX` combines `4π·η₀` from the A_eff = G·λ²/(4π) antenna aperture conversion with a factor of 2 that converts peak-phasor |E|² to time-averaged Poynting flux. Missing the factor of 2 (i.e. `/ (4π·η₀)`) over-reports P_rx by **+3 dB** — this was the "3 dB SN bug" discovered against the Friis free-space limit in April 2026. Python calculator `botb_itu_analysis.py::sommerfeld_norton_snr_peak` carries the same factor of 2 in `(E_boosted² / (2·η₀)) · A_eff`.
### Derby spot check
| path | \|sum\| (CS) | \|E_z\| (CU) | E_boosted (CW) | P_rx (CY) | V at 50 Ω (BP) |
|---|---|---|---|---|---|
| Kleve | 1.887e-6 | 9.81e-4 V/m | 1.599e-2 V/m | −116.34 dBW | **1580.91 μV** |
| Stollberg | 3.435e-7 | 1.786e-4 V/m | 2.910e-3 V/m | −128.56 dBW | **387.45 μV** |
The Kleve/Stollberg difference is **+3 dB constructive** (Kleve 111 m terrain above sea level, destructive interference minimum misses) vs **−6.7 dB destructive** (Stollberg at 72 m sits near a null of the reflected-direct interference at 6 km altitude). Both are above the noise floor in SN → Flat-Earth would say both beams work. P.526 Fock adds Earth-curvature shadow and destroys both.
---
## ITU-R P.372-16 — Radio noise
**Source:** Recommendation ITU-R P.372-16 (2022), Section 3 "External noise in the 0.01 to 100 MHz range".
### Eq. 14 — Galactic noise figure Fa
```
Fa = 52.0 − 23.0·log₁₀(f_MHz) dB above thermal
```
Valid for frequencies above approximately 30 MHz, median galactic curve.
**Role:** External noise floor from synchrotron emission in the Milky Way's magnetic field. Dominates over man-made and tube-internal noise at aircraft altitude (6,000 m), because terrain noise is heavily attenuated with altitude and the galactic sky noise comes straight down.
| path | cell | formula |
|---|---|---|
| Kleve | `ITU_Calc!B83` | `=52-23*LOG10(kl_freq_MHz)` |
| Stollberg | `ITU_Calc!E83` | `=52-23*LOG10(st_freq_mhz)` |
**Derby spot check:** At 31.5 MHz, Fa = 17.54 dB above thermal (k_B·T·B). This beats the receiver NF of 10 dB by ~7 dB, so galactic sets the floor.
Combined noise floor in dBW:
```
N_floor = 10·log₁₀(k_B·T·B) + max(NF_rx, Fa)
= −177.0 + 17.54
= −159.45 dBW
```
at `ITU_Calc!B85` and `ITU_Calc!E85`.
---
## ITU-R P.525 — Free-space attenuation
**Source:** Recommendation ITU-R P.525-4 "Calculation of free-space attenuation" (2019).
### Free-space path loss
```
FSPL = 20·log₁₀(4π·d / λ) dB
```
**Role:** Friis 1946 form, the "spherical shell spreading" loss. Depends only on distance and wavelength, no antennas or ground.
| path | cell | formula |
|---|---|---|
| Kleve | `ITU_Calc!B72` | `=20*LOG10(4*pi*kl_dist_m/kl_wavelen_m)` |
| Stollberg | `ITU_Calc!E72` | `=20*LOG10(4*pi*st_dist_m/st_wavelen_m)` |
**Derby spot check:** At 530 km / 9.517 m (Kleve): FSPL ≈ 116.89 dB. At 710 km (Stollberg): ≈ 119.44 dB.
### dBW → dBμV/m field strength conversion
```
E(dBμV/m) = P_rx(dBW) − G_rx(dBi) + 20·log₁₀(f_MHz) + 107.2
```
Derivation: from `P_rx = PFD · A_eff` with `A_eff = G_rx · λ² / (4π)`, solve for E, convert volts → μV, fold constants. The 107.2 comes from 10·log₁₀(4π·η₀) plus the V → μV scaling and the f_Hz → f_MHz unit shift, with η₀ = √(μ₀/ε₀) ≈ 376.73 Ω.
| path | signal cell | noise cell |
|---|---|---|
| Kleve signal peak | `ITU_Calc!B91` | — |
| Kleve noise | — | `ITU_Calc!B87` |
| Stollberg signal peak | `ITU_Calc!E95` | — |
| Stollberg noise | — | `ITU_Calc!E87` |
---
## ITU-R P.453 — Refractive index / atmosphere
**Source:** Recommendation ITU-R P.453-14 "The radio refractive index".
### Standard-atmosphere effective Earth radius
```
k_refr = 4/3 (standard atmosphere refraction factor)
aₑ = k_refr · R_earth ≈ 8,494,667 m
```
**Role:** Radio waves bend slightly downward in the troposphere. The 4/3 factor lets us draw straight ray paths over a fictitious larger Earth, which is mathematically cleaner than carrying curved rays through everything.
| cell | formula |
|---|---|
| `const!B8` | `4/3` (named `k_refrac`) |
| `const!B9` | `=k_refrac*r_earth` (named `r_effective`) |
Enters Eq. 14 (X) and Eq. 15 (Y) as `aₑ`, and Eq. 16a as `k`.
---
## ITU-R P.527 — Electrical characteristics of Earth's surface
**Source:** Recommendation ITU-R P.527-6 (2021) "Electrical characteristics of the surface of the Earth".
### Canonical ground types
| type | σ (S/m) | ε_r | where |
|---|---|---|---|
| land | 5.0E-03 | 15 | `ground!A2:C2` |
| sea | 5.0E+00 | 70 | `ground!A3:C3` |
| wet soil | 2.0E-02 | 30 | `ground!A4:C4` |
| dry soil | 1.0E-03 | 4 | `ground!A5:C5` |
**Role:** σ feeds Eq. 16a to compute K. ε_r is stored on each ground type but not used in the simplified K² (Eq. 16a drops ε); it is kept for potential downstream Sommerfeld-Norton / Fresnel-reflection calculations.
The sheet pulls σ and ε_r per station via VLOOKUP on `kl_ground` and `st_ground` (cells `ITU_Calc!B35/36` and `ITU_Calc!E35/36`).
---
## ITU-R P.1546 / standard geometric horizon
```
d_LoS = √(2·aₑ·h_tx) + √(2·aₑ·h_rx)
```
**Role:** Radio horizon. The sheet uses this to gate the P.526 diffraction formula: if the path is within LoS (d < d_LoS), the diffraction loss is zero and only Friis FSPL applies. Beyond LoS, P.526 is the governing formula.
| component | Kleve cell | Stollberg cell |
|---|---|---|
| TX side horizon | `ITU_Calc!B66` | `ITU_Calc!E66` |
| RX side horizon | `ITU_Calc!B67` | `ITU_Calc!E67` |
| combined | `ITU_Calc!B68` | `ITU_Calc!E68` |
| gated loss | `ITU_Calc!B69` | `ITU_Calc!E69` |
**Derby spot check:**
- Kleve: d_LoS_total ≈ 362.7 km vs d = 530 km → diffraction engaged, 63.5 dB penalty
- Stollberg: d_LoS_total ≈ 354.2 km vs d = 710 km → diffraction engaged, 96.6 dB penalty
---
## Standard RF-engineering identities
These are not ITU-specific but appear in every ITU link-budget example.
### dBW ↔ dBμV at 50 Ω matched load
```
V(dBμV at 50 Ω) = P(dBW) + 137
```
Derivation: V² = P·R at matched load → V(dBV) = P(dBW) + 10·log₁₀(50) = P(dBW) + 16.99. Then V → μV adds 120 dB. Total +137 rounded from 136.99.
| path | signal | noise |
|---|---|---|
| Kleve | `B94`, `B98` | `B88`, `B89` |
| Stollberg | `E94`, `E98` | `E88`, `E89` |
### Uniform-aperture directivity
```
G_ant = 4π·A / λ² (linear)
G_dBi = 10·log₁₀(G_ant)
```
For the 99 × 29 m Knickebein Wellenspiegel at 31.5 MHz: A = 2871 m², λ² = 90.58 m², G = 398.3, **G ≈ 26.0 dBi**.
| cell | formula |
|---|---|
| Kleve `B74` / Stollberg `E74` | `=W*H` aperture area |
| Kleve `B75` / Stollberg `E75` | `=4*pi*A/λ²` |
| Kleve `B76` / Stollberg `E76` | `=10*LOG10(B75)` |
### Sinc² aperture pattern — equisignal crossover
```
u = π·W·sin(θ)·f / c
L_cross(dB) = 20·log₁₀| sin(u)/u |
```
Canonical Knickebein (W = 99 m, θ = 5°, f = 31.5 MHz): **u ≈ 2.848, L_cross ≈ −19.87 dB**. Derived from the uniform 1D aperture sinc pattern (Balanis, Antenna Theory Ch. 12). This is the penalty the equisignal-direction signal takes relative to boresight. Also drives the Python constant `CROSSOVER_dB` in `botb_itu_analysis.py`, now computed rather than hardcoded:
```python
SQUINT_DEG = 5.0
_SQUINT_X = L_H * np.sin(np.radians(SQUINT_DEG)) / LAM_DEFAULT
CROSSOVER_dB = 20.0 * np.log10(abs(np.sinc(_SQUINT_X))) # = -19.8675
```
### Equisignal corridor width (first-principles derivation)
The width of the narrow audible equisignal corridor is set by how quickly the sinc pattern diverges on either side of the beam split, and by the pilot's auditory discrimination threshold between the dot and dash sides.
**Sinc pattern slope at boresight:**
```
P(θ)/P₀ = sinc²(W·sin(θ)/λ)
```
For small angles around the crossover, the **difference in level** between the A-side and N-side beams grows linearly with angular offset Δθ from the centerline:
```
ΔL(dB) ≈ (∂L/∂θ)|_θ=5° · Δθ
```
Taking the derivative of `20·log₁₀(sinc(x))` and evaluating at the squint angle (5°, x ≈ 0.906 wavelengths of aperture projection):
```
∂L/∂x = 20·log₁₀(e)·(π·cot(πx) − 1/x)
≈ −21.9 dB per unit x
at x = W·sin(θ)/λ evaluated at θ = 5°
```
**Pilot discrimination threshold:** The Knickebein A/N pilot scheme requires the pilot to hear equal-loudness dots (A side, short pulses) and dashes (N side, long pulses). Clinical auditory discrimination studies and wartime aircrew reports converge on **~1 dB** as the smallest A/N imbalance a trained pilot can confidently hold on-beam (NATO AG300 Vol. 10 Aviation Hearing §6.2).
**Width equation (inline, no LET):**
```
equisignal_width_m = d · 2 · sin(1 / (|slope_dB| · π·W·cos(θ)/λ))
≈ d · 2·(1 dB) / (|∂L/∂θ|)
```
The final spreadsheet cell (Main tab `F4` Kleve / `G4` Stollberg) expands the full sinc slope + 1 dB tolerance formula inline:
```
=2*B4*1000*1/( (20/LN(10)) * (PI()*99*COS(RADIANS(5))/(c/f)) * |π·cot(π·x) − 1/x| ) · YARD_CONV
```
**Bufton (21 Jun 1940) primary-source validation:**
Bufton measured the Spalding beam corridor at 439 km from Kleve. Reported width: roughly **500 yards** across the A/N transition band. Our derived formula gives **464 yards** at the same path length — within 7%, well inside measurement uncertainty for a visually-estimated corridor read off an aircraft instrument.
This is the moment the equisignal width transitioned from a "magic number" (~0.001745 rad) to a derived quantity traceable all the way back to the Knickebein 99 m antenna aperture and a published auditory discrimination study.
---
## SI base constants (the root layer)
| quantity | value | source | cell | named range |
|---|---|---|---|---|
| ε₀ | 8.8541878128E-12 F/m | CODATA 2018 | `const!B2` | `eps_0` |
| μ₀ | 1.25663706212E-6 H/m | CODATA 2018 | `const!B3` | `mu_0` |
| c | derived = 1/√(ε₀·μ₀) | Maxwell | `const!B4` | `c_vac` |
| π | PI() | built-in | `const!B5` | `pi` |
| k_B | 1.380649E-23 J/K | SI 2019 exact | `const!B6` | `k_boltz` |
| R_earth | 6,371,000 m | IUGG2 mean volumetric | `const!B7` | `r_earth` |
| k_refr | 4/3 | ITU-R P.453 | `const!B8` | `k_refrac` |
| aₑ | k_refr · R_earth | ITU convention | `const!B9` | `r_effective` |
| T_sys | 290 K | IEEE/ITU standard | `const!B10` | `t_sys` |
| NF_rx | 10 dB | 1940s vacuum-tube receiver | `const!B11` | `rx_noise_floor` |
| B_det | 500 Hz | MCW / A2 matched filter | `const!B12` | `rx_detection_bw` |
| G_rx | 0 dBi | EBL 3 short dipole (isotropic reference) | `const!B14` | `rx_gain` |
| squint θ | 5° | Knickebein A/N beam split half-angle | `const!B15` | `squint_deg` |
| L_aperture | 99 m | Wellenspiegel horizontal aperture | `const!B16` | `ant_W_m` |
**G_rx = 0 dBi note (consistency audit April 2026):** Earlier builds carried G_rx = 3 dBi in the Sommerfeld-Norton bar only, leaking a +3 dB bias into the FE comparison vs Friis / Fock. The current sheet and all Python drivers (`botb_itu_analysis.py`, `make_p526_vs_p368_graphs.py`, `compute_signal_strengths.py`) use G_rx = 0 dBi throughout, and the `knickebein_paths.csv` dataset was re-stamped to `rx_gain_dbi=0` for all 13 Knickebein operational paths. Telefunken Sep 1939 test paths retain their published antenna gains (TF_700 = 3 dBi, TF_800 = 5 dBi, TF_1000 = 10/15 dBi) because those are hardware-specific regenerative-rod gains from the original test report.
---
## Main tab — target selector and Results dashboard (Shape A)
The Main tab is the user-facing front end. One target picked from a dropdown, everything else flows through per-model PASS/FAIL verdicts.
### Geometry row (row 1-2)
| col | header | row 2 formula / lookup |
|---|---|---|
| `A` | Target | dropdown (data validation from `paths_refs` target column) |
| `B` | h_rx (m) | VLOOKUP on target → aircraft altitude (6,000 m for all Knickebein ops) |
| `C` | KL TX Dist (km) | great-circle Kleve → target, in km |
| `D` | ST TX Dist (km) | great-circle Stollberg → target, in km |
| `E` | Noise floor (μV) | `=ITU!` noise floor, in μV (0.0755 μV canonical) |
| `F` | KL eq. width (m) | inline sinc slope + 1 dB pilot derivation (see Sinc section above) |
| `G` | ST eq. width (m) | same, with row-3 Stollberg refs |
| `H` | Target Lat φ₂ (deg) | VLOOKUP on target |
| `I` | Target Lon λ₂ (deg) | VLOOKUP on target |
### Results dashboard (rows 4-8, Shape A)
| col | header |
|---|---|
| `A` | Model |
| `B` | KL V (μV) |
| `C` | ST V (μV) |
| `D` | >Noise Floor (KL) |
| `E` | >Noise Floor (ST) |
| `F` | Pair Verdict |
Per-row model mapping:
| row | Model | KL V (`B`) source | ST V (`C`) source |
|---|---|---|---|
| 5 | Fock (GE) | `=ITU!BP3` | `=ITU!BP4` |
| 6 | Sommerfeld (FE) | `=ITU!BP6` | `=ITU!BP7` |
| 7 | Knife Edge | `=ITU!BP8` | `=ITU!BP9` |
**Status formula (binary PASS/FAIL):**
```
D5 = =IF(20*LOG10(B5/$E$2)>=0,"PASS","FAIL")
E5 = =IF(20*LOG10(C5/$E$2)>=0,"PASS","FAIL")
```
Same pattern copies down to rows 6 and 7.
**Pair Verdict formula:**
```
F5 = =IF(AND(D5="PASS",E5="PASS"),"PAIR PASS","PAIR FAILS")
```
Both beams must clear the noise floor for the pair to pass — if either Kleve or Stollberg falls below, the equisignal cross cannot form at altitude, and the target cannot be bombed by beam.
### Conditional formatting
- Text is exactly "PASS" → green fill
- Text is exactly "FAIL" → red fill
- Text is exactly "PAIR PASS" → green fill
- Text is exactly "PAIR FAILS" → red fill
### Derby spot check (dashboard)
| Model | KL V | ST V | KL | ST | Pair |
|---|---|---|---|---|---|
| Fock (GE) | 0.77 μV | 0.012 μV | FAIL | FAIL | PAIR FAILS |
| Sommerfeld (FE) | 1580.91 μV | 387.45 μV | PASS | PASS | PAIR PASS |
| Knife Edge | 178.12 μV | 40.10 μV | PASS | PASS | PAIR PASS |
Interpretation: Sommerfeld (Flat Earth) says both beams arrive strong → Flat Earth "wins" the bombing. Knife Edge says the Bullington bulge approximation still clears the floor → a naïve single-edge argument survives. **Only full Fock residue (the ITU-standard spherical-Earth model) buries both beams below galactic noise** → on a globe, the Knickebein cross cannot form at Derby. This is the core null-hypothesis falsification the calculator delivers.
### Why no "MARGINAL" tier
The original status formula had three tiers (`≥10 dB = PASS`, `≥0 dB = MARGINAL`, `<0 = FAIL`). We pulled MARGINAL because:
- Without a known RX sensitivity (1940s EBL-3 receiver manual quotes only NF, not a specific minimum detectable signal), there is no physical basis for a 10 dB headroom target.
- The calculator deliberately compares against **galactic noise at 31.5 MHz**, which is already the hardest floor available. Crossing it means the signal exists above the strongest natural noise source — any further "margin" is editorial, not physical.
- A three-tier verdict invites yellow-highlighted paths to be treated as "could have worked with luck"; the null hypothesis demands a binary answer.
If we ever acquire a documented EBL-3 minimum signal (e.g. from the 1943 D(Luft)T 4058 service manual), a yellow MARGINAL tier can be re-introduced with `sensitivity` as the threshold instead of `N_floor`.
---
## What we did NOT implement, and why
### ITU-R P.368-10 — Ground-wave at LF/MF
**Skipped — deliberately removed from the sheet during April 2026 build.** P.368 is a surface-wave ground-wave model that, when over-extended to 31.5 MHz via a GRWAVE numerical solver, gives values that look comparable to our Sommerfeld three-term sum at short ranges but diverge catastrophically past the horizon. For Knickebein operational paths (180-800 km) the GRWAVE extension produces a signal strength that would wrongly read as PASS against the noise floor, giving **false hope** to a Flat-Earth apologist that the ground wave "rescues" the beams. It does not — the real FE model is Sommerfeld-Norton (included), and P.368/GRWAVE is already out-of-band by construction (P.368 upper limit is 30 MHz, 1.5 MHz below Knickebein). Including it would multiply the failure modes of the dashboard without adding physics. Removed on purpose.
The legacy `botb_propagation.py` in the BotB repo still contains a GRWAVE driver for anyone who wants to see the numerical output, but it is not wired into the certified calculator and not used in the null-hypothesis argument.
### ITU-R P.528-5 — Aeronautical mobile
**Skipped.** Lower frequency limit is 100 MHz. Knickebein is 31.5 MHz, well below. No applicable curves.
### ITU-R P.617 — Trans-horizon radio-relay systems
**Skipped.** Covers troposcatter, not diffraction. Different physics. Would be invoked only by a "tropo-scatter rescue" argument, which also fails a 99.9% time-availability check at the Knickebein SNRs (see [[Knickebein_Propagation_Null]] Appendix). Not in scope for smooth-Earth diffraction.
### Full Fock residue series (Shatz & Polychronopoulos 1988)
**Skipped.** Would replace the single closed-form F(X) + G(Y₁) + G(Y₂) with a 35-term Airy-function summation. Agrees with ITU P.526-16 to ~0.1 dB on every operational path we test, so the recommendation's closed form already delivers residue-series precision. The legacy `botb_propagation.py` in the BotB repo implements this if ever needed for a validation.
### ITU-R P.2001 — General-purpose propagation
**Skipped.** Omnibus model combining diffraction, troposcatter, ducting, and sporadic-E. Overkill for a pure smooth-Earth diffraction test, and introduces stochastic tail percentiles that would muddy the deterministic null hypothesis.
---
## Cross-check anchors
If the sheet outputs ever disagree with canonical BotB values, verify in this order. All spot values are for **Derby** target at 6,000 m aircraft altitude.
**Root layer:**
1. **c_vac (`const`)** should read 299,792,458 m/s to within rounding. If not, ε₀ or μ₀ typo.
2. **aₑ = k_refr · R_earth** should read 8,494,666.67 m. If not, k_refr typo.
**Geometry:**
3. **Kleve → Derby distance** ≈ 529,586 m (canonical 529 km).
4. **Stollberg → Derby distance** ≈ 710,365 m (canonical 711 km).
**P.526 Fock residue (GE):**
5. **Kleve β** = 1.000 exactly (via Eq. 16 land-above-20-MHz shortcut). If Eq. 16 is evaluating with K² > 0, check polarization and frequency cut.
6. **Stollberg β** ≈ 0.810. If not, verify ground is "sea" and σ = 5.0.
7. **Kleve F(X)** ≈ −134.3 dB at X ≈ 8.79. The −17.6 coefficient in Eq. 17a is the Airy-zero decay (t₁ = 2.33811).
8. **Stollberg G(Y₁) clamped** should catch the Eq. 18 floor at 2 + 20·log₁₀(0.301) ≈ −8.43 dB. If raw −13 dB shows through, the clamp isn't firing — check `K_clamp > 0`.
9. **Kleve Fock V** (`ITU!BP3`) ≈ 0.77 μV. **Stollberg Fock V** (`ITU!BP4`) ≈ 0.012 μV. Both well below 0.0755 μV noise floor → PAIR FAILS.
**ITU Handbook Ground Wave Sommerfeld-Norton (FE):**
10. **Kleve SN V** (`ITU!BP6`) ≈ **1580.91 μV** (= +3 dB constructive vs Friis). **Stollberg SN V** (`ITU!BP7`) ≈ **387.45 μV** (= −6.7 dB destructive vs Friis). If both read +3 dB the peak/RMS factor of 2 is missing in `CX` — check for `8*PI()` not `4*PI()` in the denominator.
11. **Prefactor CT** should read 519.615 V/m (= √(90·500)). If not, P_tx on the `const` tab is wrong.
12. **Antenna boost CV** should read 16.296 (= √(400/1.5)). If 1.000 the 26 dBi boost got zeroed out.
**P.526 §4 Bullington Knife Edge (KE):**
13. **Kleve Knife V** (`ITU!BP8`) ≈ **178.12 μV**. **Stollberg Knife V** (`ITU!BP9`) ≈ **40.10 μV**. Model ordering check: Fock < Knife < SN < Friis — if KE ≥ SN, the J(ν) sign is flipped or ν < −0.78 shortcut is wrong.
14. **AR8/AR9 must equal DD8/DD9**, not FSPL. If KE V ≈ 6.8×10⁵ μV the cell is still `=20*LOG10(4*PI()*O/R)` and needs to point at the knife-edge loss column.
**Noise / crossover:**
15. **N_floor** ≈ −159.45 dBW at 31.5 MHz / 500 Hz / 290 K / 10 dB NF → 0.0755 μV at 50 Ω.
16. **Fa** (P.372-16 Eq. 14) ≈ 17.54 dB above thermal at 31.5 MHz. Dominates RX NF of 10 dB by ~7 dB.
17. **Crossover penalty** ≈ **−19.87 dB** at 5° squint, 99 m aperture, 31.5 MHz. If you get −19.0 dB exactly, the Python or sheet is still carrying the rounded magic number.
**Main dashboard (Derby):**
18. Row 5 (Fock): KL FAIL, ST FAIL, PAIR FAILS.
19. Row 6 (Sommerfeld): KL PASS, ST PASS, PAIR PASS.
20. Row 7 (Knife Edge): KL PASS, ST PASS, PAIR PASS.
---
## Cross-references
- [[Knickebein_Propagation_Null]] — primary null doc, contains the formal falsification claim that the Stollberg cross-beam cannot exist at any Midlands target on a globe
- [[GRWAVE_P368_BotB]] — companion note, P.368 ground-wave check that cross-validates this calculator
- [[Prezzie_BotB]] — presentation notes (Ether Round 127 / GlobeBusters)
- [[1939_BArch_RL19-6-40_230Q8_App2_Telefunken_Range_Tests]] — primary-source range test data this calculator reproduces
- [[1943_DLuft_T4058_FuBl_2_Geraete_Handbuch]] — EBL 3 receiver service manual, source of the AGC / ALC / 2-stage AF chain that sets the +10 dB bare-detection threshold
- [[1988_Shatz_Spherical_Earth_Diffraction_SEKE]] — 35-term Airy residue series for cross-validation
---
## Version / provenance
- Calculator: `ITU_CERTIFIED_Battle_of_the_Beams_Calc_v9_1_1.xlsx` (Google Sheets)
- Originally built 2026-04-19 (Fock residue + noise + FSPL only)
- Updated 2026-04-19 same session: Sommerfeld-Norton three-term sum (BQ-CY), Bullington knife-edge (CZ-DD), first-principles equisignal width, Main tab Results dashboard (Shape A), binary PASS/FAIL gating, P.368/GRWAVE explicitly removed
- Python parity audit 2026-04-19: G_rx = 0 dBi throughout (was inconsistent 0 vs 3 dBi), crossover derived (was rounded −19), Sommerfeld-Norton peak-vs-RMS factor of 2 fixed (was +3 dB over-reporting)
- ITU source pages extracted from `/home/alan/Downloads/claude_pdfs/botb/ITU-R_P526-16_2025.pdf` and `ITU_Handbook_Ground_Wave_Propagation_2014.pdf`
- Attachment images: `ITU_P526-16_p6_residue_series_intro.png`, `ITU_P526-16_p7_K_formulas.png`, `ITU_P526-16_p8_figure2_K_chart.png`, `ITU_P526-16_p9_eqs_13_to_17.png`, `ITU_P526-16_p10_eq_18_Gy.png`
- Canonical numeric anchors (Derby, Beeston, Spalding) match `paths_refs` tab distances and `botb_signal_strengths.csv` output values to within rounding
### Python driver parity
The spreadsheet mirrors three Python drivers that together generate `botb_signal_strengths.csv` and the P.526-vs-P.368 comparison graphs. All live under both `/home/alan/claude/BotB/` and `/home/alan/claude/botb_2/` (the working-copy split for in-session edits):
| file | role | key functions |
|---|---|---|
| `botb_itu_analysis.py` | master analytical library | `friis_snr()`, `sommerfeld_norton_snr_peak()`, `fock_residue_snr()`, `link_budget()`, derived `CROSSOVER_dB` |
| `make_p526_vs_p368_graphs.py` | P.526 vs P.368 vs SN vs Friis comparison plotter | `sn_snr_peak()` |
| `compute_signal_strengths.py` | CSV exporter for `botb_signal_strengths.csv` | reads `knickebein_paths.csv`, calls all models |
Any change to the sheet's physics must be mirrored in these three files (and vice versa). The test is: a path in `knickebein_paths.csv` fed through Python should produce the same dBW signal strength as entering that path in the spreadsheet, within 0.1 dB.