Konekäännös, jota äidinkielinen puhuja ei ole tarkistanut. Viitteenä on englanninkielinen versio.

AjoitusMuokkaa GitHubissaLähde: docs/CLOCK-LOG-FORMATS.md

Kellolokien formaatit

src/clock_log.rs lukee mitatun kellolokin yhdeksi normalisoiduksi vaihesarjaksi: tasavälinen (time_s, phase_s)-näytteiden ruudukko, jossa näytteenottoväli tau0 on annettu tai löydetty, jokainen aukko lasketaan ja lokin yksiköt nimetään. Kahdeksan formaattia luetaan, kukin dokumentoituna osajoukkona. Kaikki osajoukon ulkopuolinen hylätään virheellä, joka nimeää löydetyn, eikä sitä lueta likimääräisesti.

Lyhenteet. RINEX on Receiver Independent Exchange Format. TICC on TAPR:n (Tucson Amateur Packet Radio) aikavälilaskin. ADEV on limittäinen Allanin poikkeama, TDEV aikapoikkeama ja MTIE suurin aikavälivirhe. tau0 on näytteenottoväli sekunteina.

Missä lokia voi käyttää#

  • telecom-timing: [series.clock_log] korvaa kentän series.samples tai series.csv_path. Lokin vaihe, yksikkönä ns, on aikavirhesarja, jota verrataan maskeihin, ja raporttiin lisätään lohko clock_log, joka kertoo, miten loki luettiin.
  • Kellolaji: taulukko [clock_log] lisää ajoon lohkon measured: miten loki luettiin, taulukon SHA-256 (input_sha256; ajon scenario_hash ei kata taulukkoa) ja vaihenäytteiden tiiviste sekä limittäinen ADEV, TDEV ja MTIE oktaavikeskiarvoistuskertoimilla. Se vaatii runs = 1. Simuloitu holdover pysyy ennallaan.

Ilman taulukkoa molemmat lajit jäsennetään, tiivistetään ja raportoidaan täsmälleen kuten ennenkin.

[clock_log]                 # or [series.clock_log] in a telecom-timing scenario
format = "ticc"             # "rinex-clk", "timelab", "ticc", "ptp4l", "phc2sys", "ts2phc",
                            # "chrony-tracking" or "chrony-statistics"
path = "logs/ticc.txt"      # or text = "..." inline (the only choice in WebAssembly)
channel = "chA"             # TICC: needed when the log holds more than one channel
gaps = "linear"             # "refuse" (default), "longest" or "linear"
# clock = "G08"             # RINEX, linuxptp, chrony: needed when the log holds more than one clock or source
# tau0_s = 1.0              # overrides a header and the detected spacing
# units = "ns"              # TimeLab phase units: s (default), ms, us, ns, ps
# data = "phase"            # TimeLab: phase (default) or frequency

Formaatit#

rinex-clk: RINEX-kellotiedostot, versiot 2,00 ja 3,00–3,04 (mukaan lukien version 3,04 yhdeksänmerkkinen nimikenttä). Tietue RINEX VERSION / TYPE tarkistetaan ja mikä tahansa muu versio hylätään nimeämällä löydetty versio: IGS julkaisee kelloformaatin (rinex_clock300.txt, 302, 304) versioon 3,04 asti, ja dokumentit RINEX 4,00, 4,01 ja 4,02 määrittelevät vain havainto-, navigointi- ja meteorologiset tiedostot, joten kellotiedostosta ei ole luettavaa versiota 4,00. Otsikosta luetaan vain TIME SYSTEM ID, ja se ohitetaan rivin END OF HEADER saakka. Datatietueista säilytetään vain yhden kellon tietueet tyypeistä AS (satelliitti) ja AR (vastaanotin tai asema), valittuna nimen perusteella. Niiden ensimmäinen arvokenttä, kellon harha sekunteina, on vaihe. Jatkorivit ja tietueet CR, DR ja MS ohitetaan. Epookit ovat tietueen kalenterikentät sekunteina hetkestä 1980-01-06 00:00:00 tiedoston omassa aikajärjestelmässä ilman muunnosta.

timelab: TimeLab-tyyliset ASCII-vaihe- tai taajuuslokit, selväkielinen muoto, jonka TimeLab vie ja jonka sen ASCII-tuonti ja Stable32 lukevat. Rivillä on yksi lukema: joko yksi sarake tasavälillä tau0 tai kaksi saraketta time value. Sarakkeet voi erottaa tyhjemerkeillä, pilkuilla tai puolipisteillä.

  • Rivit, jotka alkavat merkillä #, ; tai %, ovat kommentteja. Muotoa key = value (tai key: value) oleva kommentti asettaa arvon tau0 (s), units (s, ms, us, ns tai ps, vaiheelle), data (phase tai frequency) tai time_units (s tai mjd, kahden sarakkeen ensimmäiselle).
  • Yksi alussa oleva ei-numeerinen rivi tulkitaan sarakeotsikoksi.
  • Taajuusdata (suhteellinen taajuus) hyväksytään vain yhtenä sarakkeena. Se integroidaan vaiheeksi muodossa x[i+1] = x[i] + y[i]·tau0 (NIST SP 1065, 2008, §4,1).
  • TimeLabin binääri- ja projektitiedostoja (.tim) ei lueta.

ticc: TAPR TICC -laskurin lokit (TICC Operation Manual, revisiot 23. marraskuuta 2016 ja 15. joulukuuta 2025, ”measurement modes”). Jokainen datakenttä on sekunteja 12 desimaalin tarkkuudella (11 oletuksena laiteohjelmistosta 20251101 alkaen: mikä tahansa määrä 15 asti luetaan). Aikaleima luetaan desimaalitekstistään kokonaislukuna femtosekunteja, ei binäärisenä liukulukuna, joten laskurin käynnistyksen jälkeen päiviä otetun lokin vaihe säilyttää laskurin oman erotuskyvyn: tyypin f64 aikaleiman väli arvolla 3.0e5 s on 5.8e-11 s, noin laskurin 60 ps.

  • Aikaleimatilan rivit (<seconds> chA, <seconds> chB) ja TimeLab-tilan pseudoaikaleimakanava (chC) ovat tapahtuma-aikaleimoja. Valitun kanavan vaihe on sen aikaleima miinus nimellinen tikitys: x[k] = t[k] − t[0] − n[k]·tau0, missä n[k] on ensimmäisen tapahtuman jälkeen kulunut kokonaislukumäärä jaksoja tau0. Puuttuva tapahtuma on aukko.
  • Välitilan rivit (<seconds> TI(A->B) tai mikä tahansa tunniste, joka alkaa TI) luetaan suoraan vaiheeksi, yksi lukema jokaista väliä tau0 kohden. Skenaarion on ilmoitettava tau0_s, koska rivi ei sisällä aikaa.
  • Paired Timestamp -tila tulostaa samat rivit kanavajärjestyksessä ja luetaan Timestamp-tilana; 3-Corner Hat -tila lisää synteettisen kanavan chC, joka luetaan kuten yllä.
  • Jaksotilan ja Debug-tilan tuloste hylätään. Kanava, jonka lukemat eivät kasva, raportoidaan jaksotilana. Binäärinen Timestamp-tila ei ole tekstiä, ja sen tiedosto hylätään viestillä, joka kertoo sen.
  • Rivit, jotka alkavat merkillä #, sekä rivit, jotka eivät ole muotoa <number> <label> (kuten käynnistysvalikko), ohitetaan ja lasketaan.

linuxptp- ja chrony-lokit#

Nämä viisi formaattia lukevat sen, mitä käynnissä oleva aikademoni kirjoittaa omasta kellostaan. Ne on tarkoitettu ajoitusketjun tarkistamiseen jälkikäteen (boundary clock, grandmaster-kellon PHC, chrony-asiakas) samoilla estimaattoreilla kuin muut lokit. Ne eivät lue demonin asetuksia, eikä mikään tässä keskustele demonin kanssa.

ptp4l, phc2sys, ts2phc: linuxptp:n servorivit, kukin formaatti lukee vain oman ohjelmansa rivejä. Lukema on seuraavan muotoinen rivi

ptp4l[5003.000]: master offset         40 s2 freq   +1480 path delay       497
phc2sys[7000.000]: CLOCK_REALTIME phc offset       -30 s2 freq    +100 delay   1200
ts2phc[8000.000]: /dev/ptp0 offset          3 s2 freq         -2
  • Aikaleima on rivin ensimmäinen [seconds.fraction] (demonin monotoninen kello). Se luetaan myös syslog-etuliitteen jälkeen, jossa prosessitunnus kuten ptp4l[812]: ei sisällä desimaaliosaa eikä sitä oteta.
  • Vaihe on kirjattu arvo offset nanosekunteina, muunnettuna sekunneiksi. Se on demonin mittaama orjakellon aikavirhe viitettään vastaan sellaisena kuin se on kirjattu: positiivinen, kun orja on edellä. Se on servo-ohjauksen jälkeen jäljelle jäävä virhe, ei vapaasti käyvän kellon ajautuminen.
  • Aikaleiman ja sanan offset väliset sanat nimeävät lähteen (master, eth0 master etuliitteelle [eth0], CLOCK_REALTIME phc, /dev/ptp0). Loki, jossa on useampi kuin yksi lähde, tarvitsee clock = "<that text>"; virhe listaa ne.
  • Lukemat ennen kuin servo ensimmäisen kerran ilmoittaa tilan s2 (lukittu) jätetään pois ja lasketaan kenttään n_skipped_lines: s0 ja s1 ovat lukitsematon ja askeltila, joiden poikkeamat ovat sisäänvetotransientteja. Servo, joka ei koskaan saavuta tilaa s2, hylätään. Rivi, jossa ei ole tilakenttää, luetaan sellaisenaan.
  • Yhteenvetorivit (rms ... max ...), viestit delay ja selected best master sekä muiden ohjelmien rivit ohitetaan ja lasketaan.
  • Taaksepäin menevät aikaleimat (uudelleenkäynnistetty demoni) hylätään; jaa loki osiin.

chrony-tracking, chrony-statistics: chronyn tiedostot log tracking ja log statistics, luetaan sarakepaikan mukaan. Lukema on rivi, jossa on vähintään 14 saraketta (tracking) tai 13 (statistics) ja joka alkaa UTC-päivämäärällä ja -ajalla muodossa YYYY-MM-DD HH:MM:SS. Sarakeotsikkorivi ohitetaan ja lasketaan; sen alla oleva viiva ==== ohitetaan laskematta.

  • Tracking: sarake 7, paikallinen poikkeama kellon päivityksessä, sekunteina. IP-osoite tai viitetunnus vaihtuu valitun lähteen mukana, joten ilman clock jokainen rivi luetaan yhtenä paikallisena kellona. clock = "<id>" säilyttää yhden viitetunnuksen.
  • Statistics: sarake 5, lähteen arvioitu poikkeama sekunteina. Jokaista lähdeosoitetta kohden on yksi sarja, ja loki tarvitsee clock = "<address>", jos siinä on useampi kuin yksi.
  • Epookit ovat sekunteja hetkestä 1980-01-06 00:00:00 UTC, ilman karkaussekuntien käsittelyä. Chrony kirjoittaa rivin jokaista päivitystä tai lähdenäytettä kohden, joten väli ei ole tasainen. tau0 on mediaaniväli; lukema, joka tulee alle puolta tau0 aikaisemmin säilytetyn lukeman jälkeen, pudotetaan ja lasketaan kenttään n_duplicates, ja pidempi väli on aukko, jonka asetus gaps = "refuse" raportoi. Anna tau0_s ja gaps = "linear" lokille, jonka kyselyväli on vakaa.

Chronyn sarakkeet ja linuxptp:n rivirakenteet ovat demonien julkisen dokumentaation mukaisia. Hakemiston tests/fixtures/clock_log/linuxptp_chrony/ fixturet on kirjoitettu Kshanaa varten keksityin arvoin (ks. NOTICE.md); mitään todellista lokia ei ole luettu, joten rakenne, joka eroaa demonin versioiden välillä, voidaan silti hylätä tai tulkita väärin. Riviä, joka ei täsmää, ei arvata, vaan se ohitetaan ja lasketaan.

tau0 ja aukot#

Kun lokissa on aikaleimat eikä arvoa tau0 ole annettu, tau0 on peräkkäisten aikaleimojen mediaaniväli pyöristettynä neljään merkitsevään numeroon, ja lähteeksi raportoidaan median-spacing. Laskurin väli poikkeaa nimellisestä viitteen taajuuspoikkeaman verran, osia per 10^6 tai vähemmän. Skenaarion arvo tau0_s voittaa aina (lähde input), sitten otsikkokommentti tau0 (lähde header).

Näytteet sijoitetaan ruudukkoon t0 + i·tau0, ja puuttuva epookki on aukko. Lukemat, jotka poikkeavat ruudukosta yli 1 % arvosta tau0, pudotetaan ja lasketaan, samoin kaksoiskappaleet (ensimmäinen säilytetään). Aukkokäytäntö on jokin seuraavista:

  • refuse (oletus): mikä tahansa aukko on virhe, joka laskee aukot;
  • longest: säilytetään pisin aukoton jakso;
  • linear: täytetään sisäiset aukot lineaarisella interpoloinnilla ja raportoidaan täytettyjen määrä.

Estimaattorit tarvitsevat aukottoman aineiston, minkä vuoksi aukot ratkaistaan tässä.

Oma kello#

Kellotyypin taulukko [clock_log] raportoi, kuinka vakaa oma kello oli, simulaation rinnalla: scenarios/clock-measured-log.toml (kshana example clock-measured-log) on clock-holdover.toml, johon on lisätty IGS-satelliittikellon 96 lukeman ote rivinsisäisenä TimeLab-lokina. Korvaa text avaimilla path ja format omaa tiedostoa varten. Lohko measured tuloksessa sisältää sen, miten loki luettiin (formaatti, tau0 ja mistä se tuli, jokainen aukko) sekä sen ADEV, TDEV ja MTIE; se ei muuta simulaatiota.

Holdoverin ajaminen omalla kellolla: [clock_fit]#

[clock_log]                      # the measured series, as above
format = "ticc"
path = "my-clock.txt"
channel = "chA"

[clock_fit]
replaces = "classical"           # or "quantum": the simulated clock whose noise the log replaces

Loki sovitetaan tiedoston src/clock_library/card.rs laitekorttimenettelyllä (ehdollistaminen, neliöllinen termi poistettu, lag-1-kohinan tunnistus, painotettu pienimmän neliösumman menetelmä white PM-, white FM-, flicker FM- ja random-walk FM -kohinoilla keskiarvoistusajoilla, joilla on vähintään 30 vapausastetta). Nimetty kello ottaa sitten arvot q_wf = h_0 / 2, q_rw = 2 pi^2 h_-2, flicker_floor = sqrt(2 ln 2 h_-1) ja sovitetun drift; y0 pysyy sellaisena kuin skenaariossa on, koska loki sisältää viitteensä siirtymän, ei kellon siirtymää kurinalaistuksen jälkeen. Valkoinen vaihekohina sovitetaan ja raportoidaan mutta sitä ei simuloida. Tulos saa lohkon fitted (kertoimet, sovituspisteet, ajon käyttämät arvot, mikä jätettiin pois, lokin SHA-256) ja kello saa tunnisteen measured:<12 hex of the phase hash>. Arvolla runs > 1 ensemble ottaa otoksensa sovitetusta kellosta (lohko measured vaatii arvon runs = 1). Sovitus ilman taajuuskohinaa, liian lyhyt loki sovitettavaksi ja avain replaces, jonka arvo ei ole quantum eikä classical, ovat virheitä, jotka sanovat niin. scenarios/clock-fitted-log.toml on esimerkki (6 tuntia IGS-satelliittikelloa).

Mitä vertailu tunnetulla kohinalla (tests/fixtures/clock_fit/RESULTS.md) osoittaa ja mitä pitää muistaa:

  • Täyttyi: white-FM-taso palautetaan tarkkuudella 5 % jokaisella synteettisellä tietueella, jossa se on; sovitettu kortti toistaa todellisen Allanin poikkeaman kertoimen 1,35 sisällä jokaisella keskiarvoistusajalla, jolla se sovitettiin; sovituksen tunnistama kohinaeksponentti on sama kuin allantoolsin joka pisteessä (5071A-tietueella sen jälkeen, kun ehdollistamisen poistama vaiheaskel poistetaan myös allantoolsin syötteestä).
  • Ei täyttynyt, ja testi kiinnittää sen: random-walk FM palautetaan vain, kun se hallitsee tietueen pisimpiä keskiarvoistusaikoja, ja silloinkin vain yhdessä kolmesta 131 072 s sarjan tietueesta; ylityskohdalla 3 000 s sovitus antoi sen flicker FM:lle ja ajautumalle. Random-walk FM:n ja flicker FM:n jako ei ole luotettava yhdestä tietueesta. Ajo toistaa lokin vakauden niillä keskiarvoistusajoilla, jotka loki kattaa; niiden ulkopuolella kaksi valintaa eroavat (flicker FM on vakio lattia, random-walk FM kasvaa keskiarvoistusajan neliöjuurena).
  • MODELLED: vaihtoehtotarkastelu kellon kohinalle sellaisena kuin loki sen näyttää, ei kellon kalibrointi eikä ennuste sen tulevasta käyttäytymisestä.

Virheellinen loki on virhe, joka nimeää löydetyn (rivin, version, puuttuvan valitsimen), ei koskaan osittainen tulos: tests/clock_log_real_allantools.rs kiinnittää 24 tällaista tapausta.

Todisteet#

MODELLED. Tämä on jäsennin, ja sen tuloste syöttää estimaattoreita, jotka on validoitu muualla allantoolsia vastaan. Tiedoston src/clock_log.rs yksikkötestit käyttävät pieniä käsin kirjoitettuja lokeja, ja linuxptp- ja chrony-formaateille hakemiston tests/fixtures/clock_log/linuxptp_chrony/ fixtureja. tests/clock_log_allantools.rs ajaa tiedostossa tests/fixtures/clock_log/PREREGISTRATION.md ennakkorekisteröidyn vertailun: kolme siemenluvulla tuotettua synteettistä lokia, yksi per formaatti, jotka riippumaton, tämän sivun pohjalta saman tekijän kirjoittama lukija lukee takaisin, ja ADEV, TDEV ja MTIE tarkistetaan allantoolsia 2024,6 vastaan; vertailu kattaa vain kolme ensimmäistä formaattia, ja linuxptp- ja chrony-lukijoilla on jäsennystestit mutta ei oraakkelivertailua. Tämän vertailun lokit ovat synteettisiä, joten mikään siinä ei kuvaa todellista kelloa tai laskuria; vertailu mitatuilla sarjoilla kuvataan alla.

Mitatulla datalla#

tests/clock_log_real_allantools.rs ajaa tiedostossa tests/fixtures/clock_log_real/PREREGISTRATION.md ennalta rekisteröidyn vertailun (kirjattu ennen yhtäkään testiaineistoa tai ajoa) neljällä mitatulla sarjalla: Stable32-tiedosto PHASE.DAT, 5071A-cesiumkellon 65 536 ensimmäistä lukemaa vetymaseria vasten sekä IGS-satelliitin G01 (30 s) ja aseman ABMF (300 s) kellot päivän 2026-08-02 IGS-lopullisesta kellotiedostosta, vendoroituna leikkeenä NOTICE-tiedostoineen. Kahdella ensimmäisellä ei ole uudelleenjakolupaa: niistä kirjoitetut lokit ovat git-ohitetussa hakemistossa realdata-cache/ (scripts/gen_clock_log_real_ref.py), ja testi sanoo sen ja menee läpi, kun ne puuttuvat, ellei aseteta KSHANA_REQUIRE_REALDATA=1. Moottori ja riippumaton lukija lukevat kumpikin jokaisen lokin, ja ADEV, TDEV ja MTIE verrataan allantoolsiin 2024,6. Kirjattu tiedostoon tests/fixtures/clock_log_real/RESULTS.md: toimitetulla lukijalla TICC-lokit, otsikon versio ja viisi virheviestiä alittivat ennalta rekisteröidyt kynnykset; ne korjattiin ja vertailu ajettiin uudelleen muuttumattomana. Täyttyi, yhtä paria lukuun ottamatta: taajuuslokin MTIE eroaa allantoolsin vastaavasta, koska allantools integroi taajuuden miinus sen keskiarvon (kiinnitetty tilaan NOT MET; vertailukelpoinen vertailu täyttyy). Rivi pysyy MODELLED: TICC-lokit ovat mitattua kellodataa, jonka skriptimme on koodannut uudelleen laskurin asetteluun (todellista TICC-tallennetta ei löytynyt), ja viitelukijalla on sama tekijä kuin moottorin lukijalla.