Tutoriel 2 — Holdover d'horloge : combien de temps pouvez-vous tenir en roue libre
Kind: clock · Scénario : scenarios/clock-holdover.toml (copie pédagogique : scenarios/clock.toml) · Difficulté : débutant · ~20 min
À la fin, vous aurez exécuté un holdover d'horloge avec les signaux GNSS (Global Navigation Satellite System) refusés, lu la figure de mérite de synchronisation temporelle, et compris la loi de dérive √(q_wf·T) qui explique pourquoi l'horloge optique tient plus longtemps que l'horloge à puce, avec une loi tirée du NIST (l'Institut national américain des normes et de la technologie), et non inventée.
Ce qu'est ce scénario#
Quand les signaux GNSS disparaissent, un système garde l'heure avec sa propre horloge embarquée. La phase de cette horloge dérive lentement, et dès que la dérive dépasse la spécification de synchronisation temporelle opérationnelle, vous êtes hors service. Le holdover est la durée pendant laquelle vous restez dans la spécification après la perte du GNSS — la figure de mérite d'autonomie par excellence.
Le scénario exécute une chronologie de 2 h : 10 min de synchronisation GNSS, puis 6600 s (1,83 h) de refus, par rapport à une spécification de synchronisation de 20 ns, échantillonnée toutes les 10 s. Il compare deux horloges avec un code identique et leur bruit propre publié :
- Quantique : une horloge optique à réseau de strontium, objectif spatial σ_y(1 s) = 1×10⁻¹⁵ (arXiv:1503,08457), une cible de démonstrateur au sol, jamais embarquée en vol. σ_y(τ) est l'écart type d'Allan, la mesure standard de la stabilité en fréquence d'une horloge à un temps de moyennage τ.
- Classique : une horloge atomique à puce (CSAC) Microchip SA.45s, σ_y(1 s) = 3×10⁻¹⁰ (fiche technique) — un composant commercial déployé.
L'exécuter#
cargo run -- scenarios/clock-holdover.toml
Python:
import json, kshana
r = json.loads(kshana.run(open("scenarios/clock-holdover.toml").read()))
print(r["quantum"]["fom"]["holdover_s"], r["classical"]["fom"]["holdover_s"])
Lire le résumé d'une ligne#
Avec seed = 42, la spécification de 20 ns et la panne de 6600 s :
scenario 5ba83a232b94 | quantum holdover 6600s p95 1.20e-4ns integrity 1.000 security n/a (no attack) | classical holdover 2610s p95 19.7ns integrity 1.000 security n/a (no attack)
quantum holdover 6600s— l'horloge optique tient toute la panne de 6600 s sans dépasser 20 ns. Son erreur de phase au 95e centile est de 1.20e-4 ns, environ un dix-millième de nanoseconde : elle bouge à peine.classical holdover 2610s— la CSAC dépasse la spécification de 20 ns à ~2610 s, soit moins de la moitié de la panne. Son erreur de phase p95 (19,7 ns) se situe juste sur la ligne de la spécification.security n/a (no attack)— ce scénario ne configure aucune attaque, il n'y a donc rien à détecter et le résumé n'affiche aucun nombre. Le JSON porte néanmoins la borne analytique de détectabilité du leurrage de chaque horloge dansfom.security(0,997 pour l'horloge optique ; 0,000 pour la CSAC, dont le propre bruit de marche libre sur la fenêtre dépasse déjà 20 ns), marquéeapplicable: falsedans le blocfigure_tiers. Évaluer la détection face à une véritable attaque est l'objet du Tutoriel 3.integrity 1.000— il s'agit ici d'une auto-cohérence du filtre (la fraction des échantillons de la panne situés dans la borne k-sigma propre au filtre de Kalman), et non d'un niveau de protection horizontal ou vertical aéronautique (HPL/VPL). Voirdocs/INTEGRITY.md.
La référence indépendante non circulaire : pourquoi 2610 s pour la CSAC ?#
Pour une horloge à modulation de fréquence blanche (white-FM), l'erreur de phase à 1 σ croît comme σ_x(T) ≈ √(q_wf · T), où q_wf = σ_y(1 s)² a pour unité s². Cette relation provient de la publication spéciale NIST 1065 (Riley, Handbook of Frequency Stability Analysis) — les relations σ_y(τ)↔phase — la même relation SP-1065 par rapport à laquelle tests/calibration.rs valide l'écart type d'Allan du moteur à ~2 % près.
Pour la CSAC, q_wf = (3×10⁻¹⁰)² = 9×10⁻²⁰ s². Résolvons pour le temps où la phase à 1 σ atteint 20 ns = 2×10⁻⁸ s :
T ≈ (2e-8)^2 / 9e-20 = 4e-16 / 9e-20 ≈ 4444 s (1-sigma crossing)
Les 2610 s du moteur ne sont pas ce temps à 1 σ, et ne doivent pas l'être. holdover_s est le premier point de la grille de 10 s (step_s = 10) auquel l'erreur de phase absolue de cette réalisation à graine fixée dépasse 20 ns (src/fom.rs). Le premier franchissement d'un niveau par une marche aléatoire survient souvent bien avant l'instant où son enveloppe à 1 σ atteint ce niveau, et la réalisation porte aussi l'erreur de fréquence résiduelle que le filtre conserve après les 600 s de synchronisation. La loi fixe donc l'échelle, quelques milliers de secondes pour une horloge de 3×10⁻¹⁰ face à 20 ns, et non la valeur exacte. Le test vérifie une bande de 2000 à 3200 s autour de celle-ci, et non le nombre.
Les ancrages de la fiche technique sont eux-mêmes externes, cités dans les chaînes provenance du scénario : objectif du réseau optique Sr 1×10⁻¹⁵ (arXiv:1503,08457) ; CSAC Microchip SA.45s 3×10⁻¹⁰ (fiche technique). Et la courbe adev_curve exportée correspond au σ_y(τ) de la fiche technique à ~2 % près (tests/calibration.rs, NIST SP 1065). Tracez-la sous forme de graphique log-log « Stabilité de l'horloge (ADEV, écart type d'Allan) » dans le playground.
Ce que le test fixe#
tests/tutorials.rs::tutorial2_clock_holdover_holds:
quantum holdover >= classical holdover(l'horloge optique doit tenir au moins aussi longtemps),quantum holdover ≈ 6600 s(tient toute la panne),classical holdover ∈ [2000, 3200] s— une bande de tolérance autour de l'échelle white-FM de la SP-1065, et non un nombre magique. La référence indépendante est la loi, pas la valeur.
Pièges et unités#
- Les figures de synchronisation temporelle sont en nanosecondes, jamais en mètres. (Le holdover de position est un paquet différent — voir la section inertielle du Tutoriel 3.)
q_wfa pour unité s² et vaut σ_y(1 s)². C'est le pont entre un nombre d'Allan de fiche technique et le modèle.- Le holdover est une borne inférieure quantifiée par la grille (
step_s). Ne surinterprétez pas la valeur exacte ; lisez la bande. integritydésigne ici l'auto-cohérence du filtre, et non l'intégrité aéronautique.
Pour aller plus loin#
- Niveau 2 : resserrez
threshold_nsde 20 à 10 et observez le holdover de la CSAC chuter (2610 s → 1300 s, mesuré avecexercises/tier2_sweep.py), ou utilisezkind = "sweep"pour tabuler le holdover en fonction du niveau de bruit de la CSACclassical_q_wf(scenarios/sweep-clock-stability.toml: 25 points de 10⁻²⁴ à 10⁻¹⁸ s², holdover classique 2610 s → 250 s). - Niveau 3 : ajoutez
runs = 200pour en faire un ensemble Monte-Carlo et lisez la bande de holdover [p05–p95] (scenarios/clock-ensemble.tomlafficheclassical holdover 844s [220-2130]). - Puis l'aboutissement : Tutoriel 3 — Résilience quantique contre classique.