DCF77: ki jan sistèm siyal tan an travay?

Bonjou Habr.

Pwobableman anpil moun ki achte yon mont oswa estasyon metewolojik te wè Revèy Radyo Kontwole oswa menm logo Revèy Atomik sou anbalaj la. Sa a se trè pratik, paske ou jis bezwen mete revèy la sou tab la, epi apre yon ti tan li pral otomatikman ajiste nan tan an egzak.
DCF77: ki jan sistèm siyal tan an travay?

Ann kalkile kijan li fonksyone epi ekri yon dekodeur nan Python.

Gen diferan sistèm senkronizasyon tan. Ki pi popilè an Ewòp se sistèm Alman an DCF-77, Japon gen pwòp sistèm li yo JJY, nan USA a gen yon sistèm WWVB, ak sou sa. Apre sa, istwa a pral sou DCF77, kòm pi enpòtan an ak aksesib pou resepsyon nan kèk kote nan pati Ewopeyen an nan Larisi ak peyi vwazen (rezidan nan Ekstrèm Oryan an ka gen opinyon opoze a, sepandan, yo, nan vire, ka resevwa. epi analize siyal Japonè a;).

Tout sa ki ekri anba a pral sou DCF77 la.

Resepsyon siyal

DCF77 se yon estasyon onn long k ap opere nan yon frekans 77.5 kHz ak transmèt siyal nan modulation anplitid. Estasyon 50KW a sitiye 25 km soti nan Frankfurt, li te kòmanse operasyon an 1959, ak nan 1973 enfòmasyon yo te ajoute nan tan egzak la. Longèdonn nan yon frekans 77 KHz trè long, kidonk dimansyon jaden antèn yo byen desan (foto ki soti nan Wikipedia):
DCF77: ki jan sistèm siyal tan an travay?

Avèk tankou yon antèn ak opinyon pouvwa, zòn resepsyon an kouvri prèske tout Ewòp, Byelorisi, Ikrèn ak yon pati nan Larisi.

DCF77: ki jan sistèm siyal tan an travay?

Nenpòt moun ka anrejistre yon siyal. Pou fè sa, jis ale nan reseptè a sou entènèt http://websdr.ewi.utwente.nl:8901/, chwazi frekans 76.5KHz ak USB modulation la. Yon imaj ta dwe louvri ki sanble yon bagay tankou sa a:

DCF77: ki jan sistèm siyal tan an travay?

Se la nou peze bouton telechaje a epi anrejistre yon fragman pandan plizyè minit. Natirèlman, si ou gen yon reseptè "reyèl" ki kapab anrejistre frekans 77.5KHz la, ou ka itilize sa.

Natirèlman, lè nou resevwa siyal tan radyo yo atravè Entènèt la, nou pa pral resevwa tan vrèman egzat - siyal la transmèt ak yon reta. Men, objektif nou se sèlman konprann estrikti siyal la; pou sa, anrejistreman sou entènèt la pi plis pase ase. Nan lavi reyèl, nan kou, aparèy espesyalize yo itilize pou resevwa ak dekode; yo pral diskite anba a.

Se konsa, nou te resevwa anrejistreman an, ann kòmanse trete li.

Dekodaj siyal

Ann chaje dosye a lè l sèvi avèk Python epi wè estrikti li yo:

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

Nou wè modil anplitid tipik:
DCF77: ki jan sistèm siyal tan an travay?

Pou senplifye dekodaj, ann pran anvlòp siyal la lè l sèvi avèk transfòmasyon Hilbert:

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

Rezilta elaji:
DCF77: ki jan sistèm siyal tan an travay?

Ann lis emisyon bri lè l sèvi avèk yon filtè ki ba-pase, epi an menm tan an kalkile valè an mwayèn, ki pral itil pita pou analiz.

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

Rezilta (liy jòn): yon siyal vag prèske kare ki byen fasil pou analize.
DCF77: ki jan sistèm siyal tan an travay?

Analiz

Premye ou bezwen jwenn sekans bit la. Èstrikti siyal tèt li trè senp.
DCF77: ki jan sistèm siyal tan an travay?

Puls yo divize an dezyèm entèval. Si distans ki genyen ant pulsasyon se 0.1s (sa vle di longè batman kè a se 0.9s), ajoute "0" nan sekans bit la; si distans la se 0.2s (sa vle di longè a se 0.8s), ajoute "1". Fen chak minit endike pa yon batman "long", 2s long, sekans bit la reset a zewo, epi ranpli kòmanse ankò.

Sa ki pi wo a fasil pou ekri nan Python.

sig_start, sig_stop = 0, 0
pos = 0
bits_str = ""
while pos < cnt - 4:
    if A[pos] < avg and A[pos+1] > avg:
        # Signal begin
        sig_start = pos
    if A[pos] > avg and A[pos+1] < avg:
        # Signal end
        sig_stop = pos

        diff = sig_stop - sig_start
    
        if diff < 0.85*sample_rate:
            bits_str += "1"
        if diff > 0.85*sample_rate and diff < 1.25*sample_rate:
            bits_str += "0"
        if diff > 1.5*sample_rate:
            print(bits_str)
            bits_str = ""

    pos += 1

Kòm yon rezilta, nou jwenn yon sekans Bits, nan egzanp nou an pou de segonn li sanble sa a:

0011110110111000001011000001010000100110010101100010011000
0001111100110110001010100001010000100110010101100010011000

By wout la, li enteresan ke siyal la tou gen yon "dezyèm kouch" nan done. Se sekans nan ti jan tou kode lè l sèvi avèk modulation faz. Nan teyori, sa a ta dwe bay dekodaj pi solid menm nan ka yon siyal febli.

Dènye etap nou an: jwenn done aktyèl yo. Bits yo transmèt yon fwa pa segonn, kidonk nou gen yon total de 59 Bits, nan ki byen anpil enfòmasyon kode:
DCF77: ki jan sistèm siyal tan an travay?

Bits yo dekri nan Wikipedia, epi yo byen kirye. Premye 15 Bits yo pa itilize, byenke te gen plan yo sèvi ak yo pou sistèm avètisman ak defans sivil. Bit A1 endike ke revèy la pral chanje nan lè ekonomize lajounen nan pwochen èdtan an. Bit A2 endike ke yon adisyonèl leap dezyèm, ki pafwa itilize pou ajiste tan selon wotasyon Latè a. Bits ki rete yo kode èdtan, minit, segonn ak dat.

DCF77: ki jan sistèm siyal tan an travay?

Pou moun ki vle fè eksperyans poukont yo, yo bay kòd dekodaj anba spoiler la.
Kòd Sous

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 = ('Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday', 'Sunday')
    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)

Lè nou kouri pwogram nan, nou pral wè pwodiksyon ki sanble ak sa a:

0011110110111000001011000001010000100110010101100010011000
Tuesday, 26.03.19, 21:41
0001111100110110001010100001010000100110010101100010011000
Tuesday, 26.03.19, 21:42

Aktyèlman, se tout majik la. Avantaj nan yon sistèm sa a se ke dekodaj se trè senp epi yo ka fè sou nenpòt, menm mikwo-kontwolè ki pi senp. Nou senpleman konte longè pulsasyon yo, akimile 60 bit, epi nan fen chak minit nou jwenn tan egzak la. Konpare ak lòt metòd senkronizasyon tan (GPS, pou egzanp, oswa Bondye padon, entènèt la:), senkronizasyon radyo sa yo mande pou nòmalman pa gen elektrisite - pou egzanp, yon estasyon metewolojik regilye kouri pou apeprè yon ane sou 2 pil AA. Se poutèt sa, menm mont yo fèt ak senkronizasyon radyo, nou pa mansyone, nan kou, mont miray oswa mont estasyon lari.

Konvenyans ak senplisite DCF tou atire amater brikoleur. Pou jis $ 10-20 ou ka achte yon modil antèn pare ak yon reseptè pare-fè ak pwodiksyon TTL, ki ka konekte ak yon Arduino oswa lòt kontwolè.
DCF77: ki jan sistèm siyal tan an travay?

Deja ekri pou Arduino bibliyotèk pare yo. Sepandan, li deja konnen ke kèlkeswa sa ou fè sou yon mikrokontwolè, ou fini ak swa yon revèy oswa yon estasyon metewolojik. Avèk tankou yon aparèy, jwenn tan an egzak se reyèlman fasil, bay, nan kou, ke ou se nan zòn nan resepsyon. Oke, ou ka pann inscription "Atomic Clock" sou mont ou, epi an menm tan an eksplike tout moun ke aparèy la vrèman senkronize lè l sèvi avèk yon revèy atomik.

Moun ki vle ka menm amelyore ansyen mont grann yo lè yo enstale yon nouvo mekanis ak senkronizasyon radyo:

DCF77: ki jan sistèm siyal tan an travay?

Ou ka jwenn youn sou ebay lè l sèvi avèk mo kle yo "Radyo Kontwole Mouvman".

Epi finalman, yon Hack lavi pou moun ki te li sa a byen lwen. Menm si pa gen yon sèl transmetè siyal radyo nan pwochen de mil kilomèt, li pa difisil pou jenere yon siyal konsa tèt ou. Gen yon pwogram sou Google Play ki rele "DCF77 Emulator" ki bay siyal la nan kas ekoutè. Dapre otè a, si ou vlope fil la nan kas ekoutè yo alantou mont lan, yo pral ranmase siyal la (li enteresan ki jan, paske kas ekoutè òdinè pa pral pwodwi yon siyal 77KHz, men resepsyon se pwobableman akòz Harmony). Sou Android 9, pwogram nan pa t 'travay ditou pou mwen - pa te tou senpleman pa gen okenn son (oswa petèt mwen pa t' tande li - li nan 77KHz, apre tout:), men petèt yon moun pral gen pi bon chans. Gen kèk, sepandan, fè tèt yo yon dèlko siyal DCF plen véritable, ki fasil pou fè sou menm Arduino oswa ESP32:

DCF77: ki jan sistèm siyal tan an travay?
(sous sgfantasytoys.wordpress.com/2015/05/13/synchronize-radio-controlled-watch-without-access)

Konklizyon

Sistèm DCF la te vrèman senp epi pratik. Avèk èd nan yon reseptè senp ak bon mache, ou ka gen tan egzak la toujou ak tout kote, nan kou nan zòn nan resepsyon. Li sanble ke menm malgre dijitalizasyon toupatou ak entènèt la nan bagay sa yo, solisyon senp sa yo pral nan demann pou yon tan long.

Sous: www.habr.com

Add nouvo kòmantè