Learned LEO-NTN Doppler Prediction and Beam Handover#
Goal#
Train a causal portable tracker from six noisy Doppler/azimuth observations. At a fixed one-second horizon, the model predicts future Doppler and scores one of nine fixed beam sectors. Future state and the correct next beam are captured separately and never enter runtime inference.
The paired comparison contains hold-last, linear extrapolation, the learned tracker, and a simulation-future-state oracle.
CLI training summary#
(
set -euo pipefail
ROOT="$(git rev-parse --show-toplevel)"
BUNDLE="$ROOT/.noema/training_exports/leo_ntn_tracking"
cd "$ROOT"
uv sync --extra onnx
uv run --project "$ROOT" --extra onnx noema differentiable export \
"$ROOT/recipes/leo_ntn_doppler_beam_tracking.yaml" \
--training-plan "$ROOT/demo_trainings/leo_ntn_tracking_mlp/training_plan.yaml" \
--out "$BUNDLE" --force
uv run --project "$ROOT" --extra onnx python \
"$ROOT/demo_trainings/prepare_example.py" leo-ntn-tracking "$BUNDLE" \
--project-root "$ROOT"
uv run --project "$ROOT" --extra onnx noema dataset-capture run \
"$BUNDLE/capture_train_recipe.yaml" --out "$BUNDLE/data/train" --force
uv run --project "$ROOT" --extra onnx noema dataset-capture run \
"$BUNDLE/capture_validation_recipe.yaml" --out "$BUNDLE/data/validation" --force
uv run --project "$ROOT" --extra onnx noema dataset-capture run \
"$BUNDLE/capture_test_recipe.yaml" --out "$BUNDLE/data/test" --force
cd "$BUNDLE"
uv run --project "$ROOT" --extra onnx python validate_contract.py
uv run --project "$ROOT" --extra onnx python train_demo.py
uv run --project "$ROOT" --extra onnx python evaluate_demo.py
cd "$BUNDLE/reference_training"
uv run --project "$ROOT" --extra onnx python build_benchmark.py
cd "$ROOT"
uv run --project "$ROOT" --extra onnx noema benchmark validate \
"$BUNDLE/reference_training/benchmark_pack.yaml"
uv run --project "$ROOT" --extra onnx noema benchmark run \
"$BUNDLE/reference_training/benchmark_pack.yaml"
)
1. Export and capture#
Select Train/replace for Tracker. Capture track_features from data.problem and
future_state from data.truth. The default plan uses 4,096 disjoint records across five
observation-SNR settings.
2. Train and return the tracker#
The starter jointly minimizes normalized future-Doppler error and next-beam cross entropy. Validation data selects the checkpoint. Its ONNX output contains one Doppler estimate followed by nine beam logits; Noema performs the same deterministic argmax projection for every run.
3. Compare causal handover rules#
The generated campaign reports both Doppler MAE and beam-handover accuracy at the same fixed horizon. Hold-last and linear extrapolation see exactly the same history as the learned model. The oracle consumes future simulator state and is only an upper bound.
Completed benchmark result#
The completed paired campaign contains 24 runs: four causal handover rules, two held-out SNRs, and three fresh track/noise seeds. Points are means over the three seeds; bands are two-sided Student-t 95% confidence intervals.
Note
Three paired seeds make this a compact workflow result, not a publication-strength population claim.
The learned tracker has higher mean next-beam accuracy than hold-last at 0 dB (0.719 versus 0.635), while hold-last is slightly better at 15 dB (0.911 versus 0.896). Linear extrapolation is weaker at both points; the future-state oracle is 1.0 by construction. This is a mixed result, not a universal learned-tracker win.
SNR (dB) |
Method |
Role |
Mean Beam accuracy |
Mean Doppler MAE (Hz) |
Primary 95% CI low |
Primary 95% CI high |
|---|---|---|---|---|---|---|
0 |
Hold last observation |
baseline |
0.635416666667 |
39884.9576071 |
0.478549119222 |
0.792284214111 |
0 |
Linear Doppler/angle extrapolation |
baseline |
0.203125 |
141720.374735 |
0.10043108425 |
0.30581891575 |
0 |
True future state |
oracle |
1 |
0 |
1 |
1 |
0 |
Learned causal tracker |
candidate |
0.71875 |
3345.04196172 |
0.651521051095 |
0.785978948905 |
15 |
Hold last observation |
baseline |
0.911458333333 |
7148.88633108 |
0.889048683698 |
0.933867982968 |
15 |
Linear Doppler/angle extrapolation |
baseline |
0.739583333333 |
25198.6066006 |
0.627535085159 |
0.851631581508 |
15 |
True future state |
oracle |
1 |
0 |
1 |
1 |
15 |
Learned causal tracker |
candidate |
0.895833333333 |
1359.41611798 |
0.851014034063 |
0.940652632603 |
Download the run-level projection, chart data, or provenance manifest.
This bounded kinematic generator is not an orbital propagator, ephemeris product, 3GPP NTN channel model, link budget, beam-management protocol, or conformance test.