Traducción automática, no revisada por un hablante nativo. El inglés es la referencia.

Primeros pasosEditar en GitHubFuente: docs/tutorials/02-clock-holdover.md

Tutorial 2 — Holdover del reloj: cuánto tiempo puede mantenerse a la deriva

Kind: clock · Escenario: scenarios/clock-holdover.toml (copia didáctica: scenarios/clock.toml) · Dificultad: principiante · ~20 min

Al terminar habrá ejecutado un holdover de reloj con las señales GNSS (Sistema Global de Navegación por Satélite) denegadas, habrá leído la cifra de mérito de temporización y habrá comprendido la ley de deriva √(q_wf·T) que explica por qué el reloj óptico dura más que el de escala de chip, con la ley procedente del NIST (el Instituto Nacional de Estándares y Tecnología de EE. UU.), no inventada.

Qué es este escenario#

Cuando las señales GNSS desaparecen, un sistema mantiene la hora con su propio reloj de a bordo. La fase de ese reloj deriva lentamente y, cuando la deriva supera la especificación operativa de temporización, queda fuera de servicio. El holdover es el tiempo que se permanece dentro de la especificación tras perder GNSS: la cifra de mérito de autonomía principal.

El escenario ejecuta una línea temporal de 2 h: 10 min de sincronización GNSS y luego 6600 s (1,83 h) denegado, frente a una especificación de temporización de 20 ns, muestreada cada 10 s. Compara dos relojes con el mismo código y con su propio ruido publicado:

  • Cuántico: un reloj óptico de red de estroncio, objetivo espacial σ_y(1 s) = 1×10⁻¹⁵ (arXiv:1503,08457), un objetivo de demostrador en tierra, no volado. σ_y(τ) es la desviación de Allan, la medida estándar de la estabilidad de frecuencia de un reloj para un tiempo de promediado τ.
  • Clásico: un reloj atómico a escala de chip (CSAC) Microchip SA.45s, σ_y(1 s) = 3×10⁻¹⁰ (hoja de datos): una pieza comercial desplegada.

Ejecútelo#

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"])

Lea el resumen de una línea#

Con semilla = 42, la especificación de 20 ns y la interrupción 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: el reloj óptico mantiene toda la interrupción de 6600 s sin rebasar 20 ns. Su error de fase del percentil 95 es de 1.20e-4 ns, aproximadamente una diezmilésima de nanosegundo: apenas se mueve.
  • classical holdover 2610s: el CSAC rebasa la especificación de 20 ns a ~2610 s, menos de la mitad de la interrupción. Su error de fase p95 (19,7 ns) queda justo en la línea de la especificación.
  • security n/a (no attack): este escenario no configura ningún ataque, de modo que no hay nada que detectar y el resumen no imprime ningún número. El JSON sigue llevando, en fom.security, la cota analítica de detectabilidad de suplantación de cada reloj (0,997 para el reloj óptico; 0,000 para el CSAC, cuyo propio ruido de deriva a lo largo de la ventana ya supera 20 ns), marcada applicable: false en el bloque figure_tiers. Puntuar la detección frente a un ataque real es la historia del Tutorial 3.
  • integrity 1.000: aquí es la autoconsistencia del filtro (la fracción de muestras de la interrupción dentro de la propia cota de k sigmas del filtro de Kalman), no un nivel de protección horizontal o vertical de aviación (HPL/VPL). Véase docs/INTEGRITY.md.

La referencia independiente no circular: ¿por qué 2610 s para el CSAC?#

Para un reloj de modulación de frecuencia blanca (white-FM), el error de fase de 1-σ crece como σ_x(T) ≈ √(q_wf · T), donde q_wf = σ_y(1 s)² tiene unidades de s². Esta relación procede de la Publicación Especial 1065 del NIST (Riley, Handbook of Frequency Stability Analysis) —las relaciones entre σ_y(τ) y la fase—, la misma relación de SP-1065 frente a la que tests/calibration.rs valida la desviación de Allan del motor con una diferencia de ~2 %.

Para el CSAC, q_wf = (3×10⁻¹⁰)² = 9×10⁻²⁰ s². Despeje el tiempo en que la fase de 1-σ alcanza 20 ns = 2×10⁻⁸ s:

T ≈ (2e-8)^2 / 9e-20 = 4e-16 / 9e-20 ≈ 4444 s   (1-sigma crossing)

Los 2610 s del motor no son ese tiempo de 1-σ, y no deben serlo. holdover_s es el primer punto de la rejilla de 10 s (step_s = 10) en el que el error de fase absoluto de esta realización con semilla supera 20 ns (src/fom.rs). El primer cruce de un nivel por un paseo aleatorio suele producirse bastante antes del momento en que su envolvente de 1-σ alcanza ese nivel, y la realización arrastra además el error de frecuencia residual con el que queda el filtro tras la sincronización de 600 s. Así pues, la ley fija la escala, unos pocos miles de segundos para un reloj de 3×10⁻¹⁰ frente a 20 ns, no el valor exacto. La prueba afirma una banda de 2000–3200 s alrededor de él, no el número.

Los anclajes de las hojas de datos son en sí externos, citados en las cadenas provenance del escenario: objetivo de red óptica de Sr 1×10⁻¹⁵ (arXiv:1503,08457); CSAC Microchip SA.45s 3×10⁻¹⁰ (hoja de datos). Y la adev_curve exportada coincide con σ_y(τ) de la hoja de datos con una diferencia de ~2 % (tests/calibration.rs, NIST SP 1065). Represéntela como un gráfico log-log “Clock stability (ADEV, Allan deviation)” en el playground.

Qué fija la prueba#

tests/tutorials.rs::tutorial2_clock_holdover_holds:

  • quantum holdover >= classical holdover (el reloj óptico debe mantenerse al menos tanto tiempo),
  • quantum holdover ≈ 6600 s (mantiene toda la interrupción),
  • classical holdover ∈ [2000, 3200] s: una banda de tolerancia alrededor de la escala white-FM de SP-1065, no un número mágico. La referencia independiente es la ley, no el valor.

Errores frecuentes y unidades#

  • Las cifras de temporización están en nanosegundos, nunca en metros. (El holdover de posición es un paquete distinto: véase la sección inercial del Tutorial 3.)
  • q_wf tiene unidades de s² y es igual a σ_y(1 s)². Ese es el puente entre un número de Allan de una hoja de datos y el modelo.
  • El holdover es una cota inferior cuantizada por la rejilla (step_s). No interprete en exceso el valor exacto; lea la banda.
  • integrity aquí es autoconsistencia del filtro, no integridad aeronáutica.

Siguientes pasos#

  • Nivel 2: reduzca threshold_ns de 20 a 10 y observe cómo el holdover del CSAC cae (2610 s → 1300 s, medido con exercises/tier2_sweep.py), o use kind = "sweep" para tabular el holdover frente al nivel de ruido del CSAC classical_q_wf (scenarios/sweep-clock-stability.toml: 25 puntos de 10⁻²⁴ a 10⁻¹⁸ s², holdover clásico de 2610 s → 250 s).
  • Nivel 3: añada runs = 200 para convertir esto en un conjunto Monte Carlo y leer la banda de holdover [p05–p95] (scenarios/clock-ensemble.toml imprime classical holdover 844s [220-2130]).
  • Después, el colofón: Tutorial 3 — Resiliencia cuántica frente a clásica.