DCF77: kuidas töötab tĂ€pse aja edastamise sĂŒsteem?

Tere, Habr.

TÔenÀoliselt on paljud, kes ostavad kella vÔi ilmateadet, nÀinud pakendil logo Radio Controlled Clock vÔi isegi Atomic Clock. See on vÀga mugav, sest piisab, kui panna kell lauale ja see seadistab end automaatselt tÀpselt Ôigeks ajaks mÔne aja pÀrast.
DCF77: kuidas töötab tĂ€pse aja edastamise sĂŒsteem?

Selgitage vÀlja, kuidas see töötab ja kirjutame dekooderi Python'i keeles.

On olemas erinevaid ajasĂŒnkroonimise sĂŒsteeme. KĂ”ige populaarsem Euroopas on saksa sĂŒsteem DCF-77, Jaapanis on oma sĂŒsteem JJY, ning Ameerika Ühendriikides on sĂŒsteem WWVB, ja nii edasi. Edasi rÀÀgime DCF77-st, kui kĂ”ige asjakohasemast ja mĂ”nes Euroopa Venemaa osas ja naaberriikides vastuvĂ”etavast signaalist (Kaukaasia elanikud vĂ”ivad olla teistsugusel arvamusel, kuigi nad vĂ”ivad omakorda vastu vĂ”tta ja analĂŒĂŒsida Jaapani signaali;).

KÔik, mis edaspidi tuleb, on seotud DCF77-ga.

Signaali vastuvÔtt

DCF77 on pikkade laineide jaam, mis töötab sagedusel 77,5 kHz ja edastab signaale amplituudimodulatsiooniga. Jaama vĂ”imsus on 50 kW, see asub Frankfurdist 25 km kaugusel ja alustas tööd juba 1959. aastal; 1973. aastal lisati tĂ€psetele aegadele kuupĂ€eva teave. 77 kHz sagedusel on lainepikkus ĂŒsna suur, seega on ka antennide vĂ€ljakud ĂŒsna suured (pilt Wikipedia-st):
DCF77: kuidas töötab tĂ€pse aja edastamise sĂŒsteem?

Selle antenni ja sisendi vÔimsuse korral katab vastuvÔtuala praktiliselt kogu Euroopa, Valgevene, Ukraina ja osa Venemaast.

DCF77: kuidas töötab tĂ€pse aja edastamise sĂŒsteem?

Signaali saab salvestada igaĂŒks. Selleks piisab, kui minna veebivastuvĂ”tjale http://websdr.ewi.utwente.nl:8901/, valida seal sagedus 76,5 kHz ja USB-modulatsioon. Peaks avanema pilt umbes selline:

DCF77: kuidas töötab tĂ€pse aja edastamise sĂŒsteem?

Seal vajutame nuppu allalaadimiseks ja salvestame mitme minuti pikkuse fragmendi. Loomulikult, kui on olemas "pÀris" vastuvÔtja, mis suudab salvestada sagedust 77,5 kHz, saab kasutada ka seda.

Muidugi, kui vĂ”etakse tĂ€psete aegade raadi signaale ĂŒle Interneti, ei saa me tĂ”eliselt tĂ€pset aega — signaal edastatakse viivitusega. Aga meie eesmĂ€rk on lihtsalt mĂ”ista signaali struktuuri, selleks on internetisalvestused rohkem kui piisavad. Reaalses elus kasutatakse muidugi spetsialiseeritud seadmeid vastuvĂ”tmiseks ja dekodeerimiseks, millest allpool rÀÀgitakse.

Nii saime salvestuse, nĂŒĂŒd alustame selle töötlemist.

Signaali dekodeerimine

Laadime faili Python’i abil ja vaatame selle struktuuri:

from scipy.io import wavfile
from scipy import signal
import matplotlib.pyplot as plt
import numpy as np

sample_rate, data = wavfile.read("dcf_websdr_2019-03-26T20_25_34Z_76.6kHz.wav")
plt.plot(data[:100000])
plt.show()

Me nĂ€eme tĂŒĂŒpilist amplituudimodulatsiooni:
DCF77: kuidas töötab tĂ€pse aja edastamise sĂŒsteem?

Decoding'i lihtsustamiseks saame signaali katte Hilberti transformatsiooni abil:

analytic_signal = signal.hilbert(data)
A = np.abs(analytic_signal)
plt.plot(A[:100000])

Tulemus suurendatud vaates:
DCF77: kuidas töötab tĂ€pse aja edastamise sĂŒsteem?

Silume mĂŒras olevad ÀÀrmuslikud vÀÀrtused madalpÀÀsufiltri abil ning arvutame keskmise vÀÀrtuse, mida tarvitame hiljem parseerimisel.

b, a = signal.butter(2, 20.0/sample_rate)
zi = signal.lfilter_zi(b, a)
A, _ = signal.lfilter(b, a, A, zi=zi*A[0])
avg = (np.amax(A) + np.amin(A))/2

Tulemus (kollane joon): peaaegu ristkĂŒlikukujuline signaal, mida on ĂŒsna lihtne analĂŒĂŒsida.
DCF77: kuidas töötab tĂ€pse aja edastamise sĂŒsteem?

Parseerimine

Esiteks tuleb saada bitijada. Signaali struktuur on vÀga lihtne.
DCF77: kuidas töötab tĂ€pse aja edastamise sĂŒsteem?

Impulssid on jagatud sekundilisteks intervallideks. Kui impulsside vahe on 0,1 s (st impulsi pikkus 0,9 s), lisame bitijadasse „0“, kui vahe on 0,2 s (st pikkus 0,8 s), lisame „1“. Iga minuti lĂ”pp tĂ€histatakse „pika“ impulssiga, pikkus 2 s, samal ajal nullitakse bitijada ja tĂ€itmine algab uuesti.

Üles kirjutatust ei ole keeruline kirjutada Pythonis.

sig_start, sig_stop = 0, 0
pos = 0
bits_str = ""
while pos < cnt - 4:
    if A[pos]  avg:
        # Signaali algus
        sig_start = pos
    if A[pos] > avg and A[pos+1] < avg:
        # Signaali lÔpp
        sig_stop = pos

        diff = sig_stop - sig_start
    
        if diff  0.85*sample_rate and diff  1.5*sample_rate:
            print(bits_str)
            bits_str = ""

    pos += 1

Tulemusena saame bitijada, meie nÀites kahe sekundi jooksul nÀeb see vÀlja jÀrgmiselt:

0011110110111000001011000001010000100110010101100010011000
0001111100110110001010100001010000100110010101100010011000

Muide, on huvitav, et signaalis on ka „teine kiht“ andmeid. Bitijada on samuti kodeeritud faasimodulatsiooniga. Teoreetiliselt peaks see tagama stabiilsema dekodeerimise isegi nĂ”rgenenud signaali korral.

Meie viimane samm: saada andmed. Bitid edastatakse iga sekundi jÀrel, seega on meil kokku 59 bitti, milles on kodeeritud palju teavet:
DCF77: kuidas töötab tĂ€pse aja edastamise sĂŒsteem?

Bitid on kirjeldatud Vikipeediad, ja nad on ĂŒsna huvitavad. Esimesed 15 bitti ei ole kasutuses, kuigi oli plaan neid kasutada hĂ€iresĂŒsteemide ja kodaniku kaitse jaoks. A1 bitt nĂ€itab, et jĂ€rgmisel korral kellad suveajale ĂŒleminekuks seadistatakse. A2 bitt nĂ€itab, et jĂ€rgmisel tunnil lisatakse tĂ€iendav sekundi, mida mĂ”nikord kasutatakse ajakorrektuuriks vastavalt Maa pöörlemisele. ÜlejÀÀnud bitid kodeerivad tunde, minuteid, sekundeid ja kuupĂ€eva.

DCF77: kuidas töötab tĂ€pse aja edastamise sĂŒsteem?

Neile, kes soovivad ise katsetada, on dekodeerimise kood pandud spoilerisse.
Allika kood

def decode(bits):
    if bits[0] != '0' or bits[20] != '1':
        return
    
    minutes, hours, day_of_month, weekday, month, year = map(convert_block,
                                                             (bits[21:28], bits[29:35], bits[36:42], bits[42:45],
                                                              bits[45:50], bits[50:58]))
    days = ('PĂŒhapĂ€ev', 'EsmaspĂ€ev', 'TeisipĂ€ev', 'KolmapĂ€ev', 'NeljapĂ€ev', 'Reede', 'LaupĂ€ev', 'PĂŒhapĂ€ev')
    print('{dow}, {dom:02}.{mon:02}.{y}, {h:02}:{m:02}'.format(h=hours, m=minutes, dow=days[weekday],
                                                               dom=day_of_month, mon=month, y=year))


def convert_ones(bits):
    return sum(2**i for i, bit in enumerate(bits) if bit == '1')


def convert_tens(bits):
    return 10*convert_ones(bits)


def right_parity(bits, parity_bit):
    num_of_ones = sum(int(bit) for bit in bits)
    return num_of_ones % 2 == int(parity_bit)


def convert_block(bits, parity=False):
    if parity and not right_parity(bits[:-1], bits[-1]):
        return -1
    
    ones = bits[:4]
    tens = bits[4:]
    return convert_tens(tens) + convert_ones(ones)

Programmi kÀivitamisel nÀeme umbes sellist vÀljundit:

0011110110111000001011000001010000100110010101100010011000
TeisipÀev, 26.03.19, 21:41
0001111100110110001010100001010000100110010101100010011000
TeisipÀev, 26.03.19, 21:42

Tegelikult on kogu maagia siin. Selle sĂŒsteemi eeliseks on see, et dekodeerimine on ÀÀrmiselt lihtne ja seda saab teha mis tahes, isegi kĂ”ige lihtsama mikrokontrolleriga. Lihtsalt loeme impulsside pikkuse, kogume 60 bitti ja iga minuti lĂ”pus saame tĂ€pset aega. VĂ”rreldes teiste ajasĂŒnkroonimise viisidega (nĂ€iteks GPS-i vĂ”i jumal hoidku, internetiga :), vajab selline raadiosĂŒnkroonimine praktiliselt mitte mingit energiat — nĂ€iteks, tavaline kodune ilmajaam töötab umbes aasta kahe AA patareiga. SeetĂ”ttu kasutatakse raadiosĂŒnkroonimist isegi kĂ€ekellades, rÀÀkimata muidugi seinakelladest vĂ”i tĂ€navate jaamade kelladest.

DCF mugavus ja lihtsus köidavad ka DIY entusiastide tĂ€helepanu. Ainult 10-20 dollari eest saab osta valmis mooduli antenniga ja valmis vastuvĂ”tjaga, millel on TTL-vĂ€ljund, mida saab ĂŒhendada Arduino vĂ”i muu kontrolleriga.
DCF77: kuidas töötab tĂ€pse aja edastamise sĂŒsteem?

Arduino jaoks on juba kirjutatud ja valmis raamatukogudKuid nagu ikka, on selge, et kui midagi teha mikrokontrolleriga, saadakse kas kell vĂ”i ilmateade. Sellise seadmega on tĂ”epoolest lihtne tĂ€pset aega saada, kui oled loomulikult vastuvĂ”tualas. Ja vĂ”id kellale riputada kiire kirjutise „Aatomikell“, selgitades soovijatele, et seade tĂ”esti sĂŒnkroniseerib aatomikellade abiga.

Soovijad vĂ”ivad isegi vanaema kellasid ĂŒles uuendada, paigaldades neisse uue raadio sĂŒnkroniseerimise mehhanismi:

DCF77: kuidas töötab tĂ€pse aja edastamise sĂŒsteem?

Seda saab leida eBay's ots fraasidega „Raadio juhtimise mehaanika”.

Ja lĂ”puks, vihje neile, kes siia vĂ€lja lugesid. Isegi kui lĂ€hima paarikĂŒmne tuhande kilomeetri raadiuses ei ole ĂŒhtegi raadiovastuvĂ”tjat, on sellise signaali iseseisvalt genereerimine lihtne. Google Play's on rakendus nimega „DCF77 Emulator“, mis edastab signaali kĂ”rvaklappidesse. Toote autori sĂ”nul, kui keerata kĂ”rvaklappide juhe kellade ĂŒmber, saavad nad signaali (huvitav, kuidas, sest tavalised kĂ”rvaklappid ei genereeri 77KHz signaali, kuid tĂ”enĂ€oliselt saadakse vastuvĂ”tt harmoonikute kaudu). Minu Android 9 seadmes ei töötanud rakendus ĂŒldse — lihtsalt ei olnud heli (vĂ”ib-olla ei kuulnud ma seda — 77KHz on ju :), kuid vĂ”ib-olla on kellegil rohkem Ă”nne. MĂ”ned teevad endale ka korraliku DCF signaaligeneraatori, mille tegemine ei ole keeruline ka sama Arduino vĂ”i ESP32 peal:

DCF77: kuidas töötab tĂ€pse aja edastamise sĂŒsteem?
(allikas sgfantasytoys.wordpress.com/2015/05/13/synchronize-radio-controlled-watch-without-access)

KokkuvÔte

DCF sĂŒsteem osutus tĂ”eliselt lihtsaks ja mugavaks. Odava ja lihtsa vastuvĂ”tja abil on alati ja igal pool vĂ”imalik saada tĂ€pset aega, muidugi vastuvĂ”tuala piires. Tundub, et isegi vaatamata ulatuslikule digitaliseerimisele ja „asjade internetile” on sellised lihtsad lahendused veel pikaks ajaks nĂ”utud.

Allikas: habr.com

Osta usaldusvÀÀrne hostimine veebilehtede jaoks DDoS-i kaitsega, VPS VDS serverid đŸ”„ Osta usaldusvÀÀrne hostimine veebilehtede jaoks DDoS-i kaitsega, VPS VDS serverid | ProHoster