noIM₃ · HF Link Planner

Methodology & Accuracy

What the engine computes, which ITU-R recommendations it implements, where it deviates from the literal text, and its measured compliance against ITURHFProp, the ITU's own implementation of P.533-14.

Last updated: 2026-07-14 · Engine version: 2.9.0 · validated against ITURHFProp (P533 v14.2)

1. What the engine computes

Given a transmit/receive pair, date/time, and space-weather indices, the engine produces the frequency window that will support the link (MUF50, FOT, LUF), an expected time availability (reliability), and field-strength / SNR predictions per candidate frequency. The computation follows ITU-R P.533-14 as its top-level algorithm, with ionospheric inputs from CCIR P.1239-4 and noise from P.372-17.

  • Frequency window: MUF decile envelope (10 / 50 / 90 %), FOT = OWF per ITU-R P.1240-2 §7 (Fl · OPMUF, capped at MUF50; ≈ 0.85 · MUF50 in the typical case), absorption-and-SNR-limited LUF.
  • Ionospheric layers: foF2, foF1, foE, foEs, M(3000)F2, hmF2 at path midpoint and per-hop reflection points.
  • Per-hop integration: absorption accumulated along great-circle reflection points, not averaged.
  • Mode selection: P.533 §3.4 tiered elevation rule — 1F2 / 2F2 / 3F2, 1E / 2E, 1Es / 2Es, 1F1.
  • Reliability: ITU-R P.842-5 Table 1 Step 11 basic circuit reliability, the probability that the predicted SNR meets the SNR the circuit requires, given the upper and lower deciles of that SNR. It is quoted against a required SNR that you set, because a reliability figure without its threshold cannot be checked by the person reading it. The day to day spread of the maximum usable frequency is already carried inside the P.842 deciles and is not applied a second time.
  • Antennas: NEC-style image method for Yagi / LPDA / Rhombic over real ground, with height and frequency.
  • Path routing: short-path (great-circle) and long-path (antipodal) both supported.

2. ITU-R recommendations implemented

RecommendationScopeWhere
P.533-14HF propagation prediction (master algorithm)HFPropagationEngine.ts
P.1239-4Reference ionospheric characteristics — CCIR foF2 & M(3000)F2 Fourier maps (76/49 coeffs)ionosphericModel.ts, ccirEvaluation.ts
P.1239 Annex 2 (Bradley-Dudeney)hmF2 from M(3000)F2 + foF2 / foE ratioionosphericModel.ts::calculateHmF2
P.533 §5.2Non-deviative absorption (D & lower-E region)absorptionModel.ts::calculateNonDeviativeAbsorption
P.533 §5.3Deviative absorption at F-region reflection (1 dB per hop, literal)absorptionModel.ts::calculateDeviativeAbsorption
P.531-13SID / X-ray flare absorption (Davies 1990 calibration)absorptionModel.ts::calculateSIDAbsorption
P.533 §5.2.2 Table 2Auroral and other signal losses (Lh), averaged over the Table 1d control points as the Recommendation requires. A K-index storm increment is added on top as a documented non-ITU extension, because Table 2 carries no geomagnetic term.p533Auroral.ts, absorptionModel.ts
P.372-13Radio noise. Atmospheric noise uses the real worldwide numerical map (CCIR Report 322), ported from the ITU reference implementation and reproducing it to within 0.003 dB. Galactic and man-made noise are the P.372 curves.p372Atmospheric.ts, noiseModel.ts
P.842-5Basic circuit reliability, Table 1 Step 11 piecewise BCR, computed against a required SNR that you set. Validated unbiased against ITURHFProp.statisticalReliability.ts
P.525Free-space basic transmission lossfieldStrength.ts
IGRF-14 (epoch 2025)MODIP grid for ionospheric mappingmodipCalc.ts

3. Documented deviations from ITU-R literal

Every deviation is annotated in source with a ═══ ITU-R COMPLIANCE AUDIT ═══ block so the rationale is visible at the point it's applied. The list below is the complete set — there are no silent adjustments.

3.1 Equatorial Ionisation Anomaly (EIA) damping

CCIR P.1239 coefficients don't resolve the ±15-20° EIA crests of enhanced plasma density that dominate tropical daytime HF propagation. For paths whose midpoint falls within the crest region between 10:00 and 18:00 local time, the engine damps predicted foF2 by up to 8 % to bring MUF closer to observation. This is not part of ITU-R P.1239 and is flagged as empirical.

3.2 Tropical reliability ceiling (REMOVED)

This engine used to cap reliability between 75 and 95 per cent, graded on latitude, for paths whose midpoint sat within 20 degrees of the equator. That cap has been removed.

It was not a refinement, it was a defect. ITU-R P.533 Attachment 1 correctly returns zero probability of equatorial scattering in daylight, and the engine was reading that correct zero as "no value supplied" and falling back to the empirical ceiling. On a daytime equatorial path the reliability the tool reported was the ceiling itself, not a prediction: it did not respond to power, antenna, frequency or noise. Equatorial scattering is now applied only where P.533 says it occurs.

3.3 Grayline reduction

For paths whose great-circle crosses the solar terminator, LUF is reduced by 8 / 5 / 4 / 2 dB in a piecewise function of the crossing angle. This matches operator observation but is not directly an ITU-R formula.

3.4 Multi-mode Rayleigh fading σ

P.842 prescribes a single-path Rayleigh variance. When the engine identifies multiple co-present propagation modes (e.g. 1F2 + 2F2 + 1Es), σ is scaled to 4.5 / 6.5 / 8 dB for 2 / 3 / 4+ active modes to reflect the measured multipath penalty. Single-mode paths use the P.842 literal.

3.5 Sporadic-E probability multiplier

foEs and its occurrence probability (seasonal + diurnal + latitude Gaussian) aren't prescribed in P.533. The engine uses a literature-calibrated model that is multiplied into the joint reliability. This extends P.533 rather than contradicting it.

3.6 LUF ≥ 25 MHz semantic

VOACAP emits LUF ≥ 25 MHz as a "no frequency meets the required reliability" sentinel. Our LUF is defined differently — the lowest frequency where absorption plus noise still permits a 10 dB SNR margin — so the two are not directly comparable above ~25 MHz. The benchmark in §4 drops LUF comparisons above that threshold rather than pretending they're comparable.

3.7 Above-MUF experimental extrapolation

The engine reports a tentative availability curve above MUF50 using a scattering-loss estimator. This is marked experimental in the UI with a hatched band — ITU-R P.533 stops at MUF50.

3.8 D-region sec(φ) cap and cosp exponent

ITU-R P.533-14 §5.2 specifies the non-deviative D-layer absorption with a literal sec(φD) factor at the ~100 km D-region entry point and a latitude-graded cosp exponent (Table 1, p ∈ [1.1, 1.4]). At grazing incidence (< 6° elevation) the literal sec(I) grows to 6–10, which over-attenuates long F2 hops because the ray exits the D-region laterally before traversing the full column. P.531-13 §3.4.2 acknowledges this and VOACAP empirically caps the effect; we match VOACAP at sec ≤ 3.5 and fix the cos exponent at the mid-latitude p = 1.3. This is documented in source as a calibration; uncapped runs over- attenuate the 30-path benchmark by 10–20 dB.

3.9 Sudden Ionospheric Disturbance (SID) calibration

ITU-R P.531-13 §4.3 acknowledges D-region absorption boost during X-ray flares but does not publish a dB-vs-flux fit. The engine uses an empirical Davies (1990, Fig 10.4) fit: +12 dB at 10 MHz per decade of flux above 10⁻⁷ W/m², gated by cos(χ) so only the dayside is affected, and scaled f−1.5 to account for the same frequency dependence as quiet D-region absorption. C-class peaks ≈ +12 dB; M-class ≈ +24 dB; X1 ≈ +36 dB on directly sub-solar paths, fading to zero at the terminator.

3.10 Auroral absorption

P.533 mentions auroral D-region enhancement during particle precipitation but does not publish a formula. The engine uses an empirical K-index-driven model with non-linear scaling above K=5 (storm) and K=7 (major storm), latitude-banded so polar > 70° gets the full effect, sub-auroral 55–60° only during disturbances, and mid-latitudes are unaffected unless K ≥ 7. Frequency dependence is f−1.5. Calibrated against Davies (1990) §10.3 observed-event tables.

3.11 P.842 reliability — piecewise BCR and multiplicative decomposition

The per-mode SNR-margin term P(SNR > req) is computed by default from the P.842-5 Table 1 Step 11 piecewise basic-circuit-reliability (BCR) curve — the literal asymmetric sigmoid, not a symmetric Gaussian CDF. The Gaussian-CDF form is used only in the voacap-compatible calibration mode. That BCR term is then combined multiplicatively into R = P(SNR > req) · P(MUFday > f) · P(Es open) · (1 − P(Es blanket)), attributing each variance source to exactly one factor so they remain orthogonal. This decomposition surfaces each failure mode separately in the UI (which helps operators diagnose "why was my link down?") and lowered mean-absolute REL error on the 30-path benchmark from 17 to 15 pts vs the single-term form using the same data. The MUF-day and Es factors are engine extensions beyond P.842's single-circuit formula; collapsing to the bare P.842 BCR is a one-line change (omit muf10 / muf90 / esPresenceProb).

3.12 Additional σ contributions: TID and EIA spread-F

Beyond the multi-mode Rayleigh σ in §3.4, the engine root-sum-squares two further independent variance sources into σSNR: a Travelling Ionospheric Disturbance contribution (~2 dB quiet, rising to ~4 dB at K=7) per Hunsucker (1982), and a tropical Equatorial Ionisation Anomaly / spread-F contribution (peak 5 dB at the geographic equator, falling linearly to 0 at ±35°) per Abdu (1997) and ITU-R P.531 §3.4. These are extensions, not contradictions, of P.842 — neither is published with dB values in the recommendation.

4. Compliance with the ITU reference implementation

The engine is measured against ITURHFProp, the ITU's own implementation of Recommendation P.533-14, published by ITU-R Study Group 3 (source). This is the benchmark that matters. Our engine implements the same Recommendation, so a disagreement is a defect in one of the two, and it is overwhelmingly likely to be ours. It is a compliance measurement, not a similarity measurement.

30 international paths across 29 frequencies (1 MHz grid, 2 to 30 MHz), isotropic antennas at both ends so the antenna model is removed from the comparison entirely, 1 kW, 3 kHz, rural noise, required SNR 10 dB. Measured on the 624 vectors where the Recommendation predicts a real signal.

QuantityMean abs errorMedianP90Bias
Basic MUF2.09 MHz0.95 MHz4.90 MHz−0.50 MHz
Field strength6.98 dB4.80 dB17.25 dB−0.23 dB
Noise (P.372)0.52 dB0.30 dB1.23 dB+0.01 dB
SNR7.16 dB5.11 dB17.56 dB−1.20 dB
Basic circuit reliability20.4 pts16.1 pts42.8 pts+0.7 pts

Read the bias column. Scatter is expected on a model with a cliff in it: close to the MUF, a fraction of a megahertz of disagreement swings field strength by tens of decibels. A systematic offset is the thing that reveals a missing, doubled or misapplied term, and that is what the engine is now centred on. Reliability is compared only where the reference figure sits between 10 and 90 per cent, because vectors on which both models say zero agree trivially and would flatter the average.

Of the 246 vectors on bands the Recommendation calls closed, the number on which this engine claims the circuit meets its required grade of service is zero, and that is gated in the test suite. Recommending a frequency that does not work is the worst thing a planning tool can do.

The full report is regenerated from the same numbers the suite gates on (docs/hf/itu-compliance-report.md, npm run hf:benchmark). It is never hand maintained.

4.1 Secondary check against VOACAPL

VOACAPL is not P.533. It is the Lucas-Haydon and ICEPAC lineage, a different model with a different reliability definition. Divergence from it is expected and is not, on its own, evidence of a defect. It is kept only as a sanity check, and the figures below should be read in that light rather than as an error budget.

QuantityMean abs errorMedianP90Max
MUF502.7 MHz2.0 MHz5.3 MHz10.2 MHz
FOT1.5 MHz0.9 MHz4.2 MHz6.3 MHz
Reliability (peak-across-freqs)17 pts19 pts33 pts37 pts

4.2 What is not validated here

  • LUF is not an ITU quantity. P.533 does not define it and ITURHFProp does not report it. It is defensible only as a derived figure: the lowest frequency whose P.842 basic circuit reliability meets the required reliability, at the required SNR. That rule is stated with every LUF the tool produces, and the required SNR and required reliability are both inputs you set.
  • Sporadic-E, the above-MUF model, and the geomagnetic storm absorption increment are documented extensions. They are not part of P.533 and are not claimed to be.

4.1 Ionospheric layer accuracy vs PyIRI / IRI-2020

The ionospheric layer model is separately benchmarked against 384 reference vectors from PyIRI (IRI-2020). This isolates the CCIR layer model from downstream propagation physics.

QuantityMean abs errorP95MaxWithin tolerance
foF20.13 MHz0.91 MHz2.24 MHz99.0 %
foE0.23 MHz0.58 MHz0.94 MHz97.4 %
foF11.40 MHz3.92 MHz4.43 MHz100.0 %
M(3000)F20.0010.000.01100.0 %
MODIP0.07°0.29°0.40°100.0 %

foF1 tolerance is wider because our foF1 < foE ⇒ 0 truncation differs from IRI's behaviour of reporting a raw value; the downstream impact on mode selection is marginal (F1 contributes only to mid-lat daytime sub-MUF absorption).

5. Known outliers

Five of the 30 benchmark paths sit at or beyond the P95 envelope. All have a documented physical cause:

  • Hanoi → Manila (MUF +4.0 MHz): tropical daytime over the EIA crest region. The §3.1 EIA damping pulls this from the previous +11.5 MHz bug, but it remains at the upper end of the envelope — we under-resolve the crest structure without a full EIA model.
  • Moscow → Vladivostok (REL +58 pts, MUF +0.5 MHz): Asian mid-lat summer morning. Root cause is not an Asian-sector foF2 calibration issue (MUF agrees) — it is a systematic difference in reliability definition. VOACAP bakes a conservative man-made noise margin into its REL output; our engine treats noise environment as a user input (rural / residential / industrial) and applies it separately. For a given site where the user knows the noise floor, our engine's REL is more actionable. For comparing against VOACAP's default output the gap is real. Four other paths show the same pattern (Boulder → Berlin +36, Iceland → Cape Town +36, Cape Town → Rio +26, Anchorage → Houston +25).
  • London → Sydney solar MIN (MUF −5.2 MHz, REL −31 pts): at R12 near zero our foF2 decile scaling runs thinner than VOACAP's, over-predicting MUF drop.
  • Singapore → Nairobi, Hawaii → Auckland (MUF ±5-6 MHz): long trans-equatorial and trans-Pacific paths that integrate multiple EIA regions — compounded version of the Hanoi → Manila story.
  • Boulder → Berlin / Iceland → Cape Town / Cape Town → Rio / Anchorage → Houston (REL +25-36 pts): same man-made noise-margin difference described for Moscow → Vladivostok. Not per-path errors — a methodology choice.

6. When to trust this tool (and when not to)

An honest three-tier answer for an RF engineer evaluating whether to use this in a workflow:

Use caseSuitable?Why
Pre-planning and band selection (which bands to try, at what hours, which season) Yes, confidently Basic MUF sits within a median of 0.95 MHz of the ITU reference implementation, well inside any allocation width. The frequency window recommendation is the strongest thing this tool does.
Engineering design with documented uncertainty (antenna sizing, power budget, availability targets) Yes, with the envelope shown Use MUF90 and MUF10 as design bounds rather than MUF50 as a point estimate. Quote reliability with the required SNR it was computed against, and with its envelope: "80 per cent at a required SNR of 10 dB in 3 kHz, plus or minus 20 points".
Regulatory and tender submissions (spectrum licensing, ACMA coordination, client deliverables) Yes, with the compliance report attached The engine implements ITU-R P.533-14 and reproduces the ITU's own implementation of it, unbiased, with the envelope in section 4. That is a traceable claim: same normative method, same reference software, published error budget, and a run hash and engine version stamped on every result. Attach docs/hf/itu-compliance-report.md. Two caveats belong in the submission: reliability carries roughly 20 points of scatter, and the non-ITU extensions listed in section 4.2 are extensions, not the Recommendation.
Safety-of-life circuits (aviation HF, maritime distress) No No monthly median HF prediction, this one or any other, should be the sole basis for a safety-of-life circuit. Day to day conditions routinely depart from the median by more than ten decibels. Design with real margin and a fallback band.

7. Regenerating the benchmark

The numbers on this page come from the test suite, not hand-edited values. Two scripts refresh the reference vectors and a bundled npm script runs end-to-end:

# regenerate PyIRI layer vectors (requires python3 + PyIRI)
npm run test:hf:regen-pyiri

# regenerate VOACAPL path vectors (requires local voacapl build)
npm run test:hf:regen-voacap

# full pipeline: regen + run benchmark + emit docs/hf/benchmark-report.md
npm run hf:benchmark

The emitted docs/hf/benchmark-report.md is the per-path table of engine vs VOACAP deltas that backs the summary statistics in §4. It is regenerable and should be checked in alongside engine changes.

Questions or corrections? Contact us — if you find an outlier with a physical explanation we haven't documented, we'll credit the fix.