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.

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 , Jaapanis on oma sĂŒsteem , ning Ameerika Ăhendriikides on sĂŒsteem , 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):

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

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

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:

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:

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.

Parseerimine
Esiteks tuleb saada bitijada. Signaali struktuur on vÀga lihtne.

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 . 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:

Bitid on kirjeldatud , 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 , mida mĂ”nikord kasutatakse ajakorrektuuriks vastavalt Maa pöörlemisele. ĂlejÀÀnud bitid kodeerivad tunde, minuteid, sekundeid ja kuupĂ€eva.

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.

Arduino jaoks on juba kirjutatud ja Kuid 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:

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:

(allikas )
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
