Tere, Habr.
TÔenÀoliselt on paljud, kes ostavad kella vÔi ilmateatejaama, nÀinud pakendil logo Radio Controlled Clock vÔi isegi Atomic Clock. See on vÀga mugav, sest piisab, kui asetada kell lauale, ja see seadistub mÔne aja pÀrast automaatselt tÀpselt Ôigeks ajaks.

Selgitage, kuidas see töötab ja kirjutame dekoodri Pythonis.
Aja sĂŒnkroonimiseks on erinevaid sĂŒsteeme. Euroopas on kĂ”ige populaarsem saksa sĂŒsteem , Jaapanis on oma sĂŒsteem , Ameerika Ăhendriikides on sĂŒsteem , ja nii edasi. Edasi rÀÀgitakse DCF77-st, kuna see on kĂ”ige aktuaalsem ja kergesti vastuvĂ”etav mĂ”nes Euroopa Venemaa piirkonnas ja naabruses (Kaug-Ida elanikel vĂ”ib olla vastupidine arvamus, kuid nad omakorda vĂ”ivad vastu vĂ”tta ja analĂŒĂŒsida Jaapani signaali;).
KÔik, mis edasi kirjutatakse, kÀsitleb DCF77.
Signaali vastuvÔtt
DCF77 on pikalainejaam, mis töötab sagedusel 77,5 kHz ja edastab amplituudmodulatsiooniga signaale. 50 kW vĂ”imsusega jaam asub Frankfurtist 25 km kaugusel, alustas ta tööd juba 1959. aastal ning 1973. aastal lisati tĂ€psetele ajale ka kuupĂ€eva info. 77 kHz sagedusel on lainepikkus ĂŒsna suur, seega on ka antenni vĂ€lja suurus mĂ€rkimisvÀÀrne (foto Wikimedia Commons-ist):

Sellise antenni ja edastatava vÔimsusega 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. Pidada avama pilt umbes sellise:

Seal vajutame nupule alla laadida ja salvestame mitu minutit kestva lĂ”igu. Loomulikult vĂ”ib kasutada ka âpĂ€risâ vastuvĂ”tjat, mis suudab salvestada sagedust 77,5 kHz.
Muidugi, kui vĂ”tame Interneti kaudu tĂ€psete aja raadiosignaale, ei saa me tĂ”eliselt tĂ€pset aega â signaal edastatakse viivitusega. Kuid meie eesmĂ€rk on mĂ”ista signaali struktuuri, selleks on Interneti salvestused rohkem kui piisavad. Tegelikult kasutatavad spetsialiseeritud seadmed signaali vastuvĂ”tmiseks ja dekodeerimiseks, millest rÀÀgime allpool.
Nii saime salvestuse, alustame selle töötlemist.
Signaali dekodeerimine
Laadime faili Pythoniga 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()
NĂ€eme tĂŒĂŒpilist amplituudimodulatsiooni:

Dekodeerimise lihtsustamiseks vĂ”tame signaali ĂŒmbrise Hilberti transformatsiooni abil:
analytic_signal = signal.hilbert(data)
A = np.abs(analytic_signal)
plt.plot(A[:100000]) Tulemus suurendatud kujul:

Silume mĂŒra vĂ€lja viskamise puhul madalate sageduste filtri abil ja arvutame samal ajal keskmise, mis tuleb hiljem parsimiseks kasuks.
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): praktiliselt ristkĂŒlikukujuline signaal, mida on ĂŒsna lihtne analĂŒĂŒsida.

Andmete kogumine
Esialgu tuleb saada bittide jÀrjestus. Signaali struktuur on vÀga lihtne.

Impulsid on jagatud sekundi intervallideks. Kui impulsi vahemaa on 0,1 s (st impulsi pikkus 0,9 s), lisame bittide jÀrjestusse '0', kui vahemaa on 0,2 s (st pikkus 0,8 s), lisame '1'. Iga minuti lÔppu tÀhistatakse 'pika' impulssiga, mille pikkus on 2 s, mille kÀigus bittide jÀrjestus nullitakse ja tÀitmine algab uuesti.
Ălaltoodud on lihtne ĂŒles 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 bittide jÀrjestuse, meie nÀites nÀeb see vÀlja jÀrgmiselt kahe sekundi jooksul:
0011110110111000001011000001010000100110010101100010011000
0001111100110110001010100001010000100110010101100010011000
Ăldiselt 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 tegelikud andmed. Bitid edastatakse iga sekundi tagant, seega on meil kokku 59 bitti, milles on kodeeritud piisavalt teavet:

Bitid on kirjeldatud , ja need on ĂŒsna huvitavad. Esimesi 15 bitti ei kasutata, ehkki oli plaan kasutada neid hĂ€iresĂŒsteemide ja tsiviilkaitse jaoks. Bit A1 nĂ€itab, et jĂ€rgmisel tunnil kellad seatakse suveajale. Bit A2 nĂ€itab, et jĂ€rgmisel tunnil lisatakse , mida mĂ”nikord kasutatakse aja korrigeerimiseks vastavalt Maa pöörlemisele. ĂlejÀÀnud bitid kodeerivad tunde, minuteid, sekundeid ja kuupĂ€eva.

Neile, kes soovivad ise katsetada, on dekodeerimise kood toodud spoileris.
Allikasood
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)
KÀivitades programmi, nÀeme umbkaudu sellist vÀljundit:
0011110110111000001011000001010000100110010101100010011000
TeisipÀev, 26.03.19, 21:41
0001111100110110001010100001010000100110010101100010011000
TeisipÀev, 26.03.19, 21:42
Siin on kogu maagia. Sellise sĂŒsteemi eeliseks on see, et dekodeerimine on ÀÀrmiselt lihtne ja seda saab teostada igasugustes, isegi kĂ”ige lihtsamates mikrokontrollerites. Lihtsalt loeme impulsi pikkuse, kogume 60 bitti ja iga minuti lĂ”pus saame tĂ€pse aja. VĂ”rreldes teiste ajasĂŒnkroniseerimise meetoditega (nĂ€iteks GPS-i vĂ”i, jumala kaitse, Internetiga :), vajab selline raadiotehnika energiat praktiliselt mitte midagi â nĂ€iteks tavaline kodune ilmateade töötab umbes aasta kahe AA patareiga. SeetĂ”ttu kasutatakse raadiotehnika vĂ”imalusi isegi kĂ€ekellades, rÀÀkimata seinalehtedest vĂ”i vĂ€ljakute kelladest.
DCF mugavus ja lihtsus meeldivad ka DIY entusiastidele. Ainult 10-20 dollari eest saab osta valmis mooduli antenniga koos valmis vastuvĂ”tja ja TTL-vĂ€ljundiga, mida saab ĂŒhendada Arduino vĂ”i muu kontrolleriga.

Arduino jaoks on juba kirjutatud ja . Kuid on juba ammu teada, et ĂŒkskĂ”ik mida mikrokontrolleriga teha, tulevad vĂ€lja kas kell vĂ”i ilmateade. Sellise seadmega on tĂ”epoolest lihtne tĂ€pset aega saada, kui olla vastuvĂ”tualas. Ja kellale vĂ”ib lisada sildi âAatomikellâ, ning seletada kĂ”igile, kes soovivad, et seade tĂ”epoolest sĂŒnkroniseerub aatomikelladega.
Soovijad vĂ”ivad isegi vanaema kella uuendada, paigaldades sinna uue raadio sĂŒnkroniseerimise mehhanismi:

Sellist vĂ”ib leida ebay's otsesĂ”nadega âRaadio juhitav mehhanismâ.
Ja lĂ”puks, nip neile, kes on siiani saanud. Isegi kui lĂ€hima paari tuhande kilomeetri raadiovastuvĂ”tjat ei ole, on sellise signaali genereerimine ĂŒsna lihtne. Google Play's on rakendus nimega âDCF77 Emulatorâ, mis edastab signaali kĂ”rvaklappidesse. Autori kinnitusel, kui mĂ€hkida kĂ”rvaklappide juhe kellade ĂŒmber, peaksid need signaali saama (huvitav, kuidas, sest tavalised kĂ”rvaklapid ei tooda 77 kHz signaali, aga tĂ”enĂ€oliselt toimub vastuvĂ”tt harmoonikate kaudu). Minu Android 9 seadmest see rakendus ei töötanud â lihtsalt ei olnud heli (vĂ”ib-olla ei kuulnud ma seda â 77 kHz ju :), aga Ă€kki mĂ”nedele see rohkem Ă”nnestub. MĂ”ned, muide, teevad endale ka korraliku DCF-signaaligeneraatori, mille valmistamine on lihtne sama Arduino vĂ”i ESP32 peal.

(allikas )
KokkuvÔte
DCF sĂŒsteem osutus tĂ”eliselt lihtsaks ja mugavaks. Lihtsa ja odava vastuvĂ”tjaga on vĂ”imalik alati ja igal pool tĂ€pset aega saada, muidugi vastuvĂ”tu alas. Usun, et isegi vaatamata laialdasele digitaliseerimisele ja âasjade internetileâ jÀÀvad sellised lihtsad lahendused seriaalmasiinaks veel pikaks ajaks.
Allikas: habr.com
