DCF77: si funksionon sistemi i transmetimit të sinjaleve të kohës précise?

Përshëndetje Habr.

Mënyra më e zakonshme për të rregulluar kohën është përmes orëve të kontrolluara nga radiot, të cilat janë të njohura si orë atomike. Kjo është shumë praktike, pasi mjafton të vendosni orën në një tryezë, dhe pas disa kohësh, ajo rregullohet automatikisht në kohën e saktë.
DCF77: si funksionon sistemi i transmetimit të sinjaleve të kohës précise?

Të shohim si funksionon kjo dhe të shkruajmë një dekoder në gjuhën Python.

Ekzistojnë sisteme të ndryshme për sinkronizimin e kohës. Sistemi më i njohur në Evropë është sistemi gjerman DCF-77, në Japoni ka sistemin e vet JJY, në SHBA ka sistemin WWVB, dhe kështu me radhë. Më pas do të flasim për DCF77, si sistemin më të rëndësishëm dhe të qasshëm për marrjen në disa zona të Europës, përfshirë një pjesë të Rusisë dhe vendeve përreth (banorët e Lindjes së Largët mund të kenë një mendim të kundërt, megjithatë ata gjithashtu mund të pranojnë dhe analizojnë sinjalin japonez;).

Çdo gjĂ« qĂ« do tĂ« shkruhet mĂ« poshtĂ« do tĂ« jetĂ« mbi DCF77.

Pranimi i sinjalit

DCF77 është një stacion me valë të gjatë që operon në frekuencën 77.5 kHz dhe dërgon sinjale në modulim amplitude. Stacioni ka një fuqizim prej 50 kW dhe ndodhet 25 km nga Frankfurt, duke filluar punën që nga viti 1959, dhe në vitin 1973 iu shtua informacioni mbi datën. Gjatësia e valës në frekuencën 77 kHz është shumë e madhe, prandaj dimensionet e fushës së antenës janë gjithashtu mjaft të konsiderueshme (foto nga Wikipedia):
DCF77: si funksionon sistemi i transmetimit të sinjaleve të kohës précise?

Me një antenë të tillë dhe fuqinë e përcaktuar, zona e pranimit mbulon pothuajse të gjithë Evropën, Bjellorusinë, Ukrainën dhe një pjesë të Rusisë.

DCF77: si funksionon sistemi i transmetimit të sinjaleve të kohës précise?

Çdo kush mund tĂ« regjistrojĂ« sinjalin. Mjafton tĂ« hyni nĂ« njĂ« marrĂ«s online http://websdr.ewi.utwente.nl:8901/, tĂ« zgjidhni frekuencĂ«n 76.5 kHz dhe modulimin USB. Duhet tĂ« hapet njĂ« imazh i ngjashĂ«m me kĂ«tĂ«:

DCF77: si funksionon sistemi i transmetimit të sinjaleve të kohës précise?

Atje klikoni në butonin download dhe regjistroni një pjesë që zgjat disa minuta. Natyrisht, nëse keni një 'marrës të vërtetë', i cili ka mundësinë të regjistrojë frekuencën 77.5 kHz, mund ta përdorni atë gjithashtu.

Sigurisht, duke marrĂ« sinjale tĂ« sakta tĂ« kohĂ«s pĂ«rmes Internetit, ne nuk do tĂ« marrim vĂ«rtet kohĂ«n e saktĂ« — sinjali kalon me vonesĂ«. Por qĂ«llimi ynĂ« Ă«shtĂ« thjesht tĂ« kuptojmĂ« strukturĂ«n e sinjalit, pĂ«r kĂ«tĂ« regjistrimet online janĂ« mĂ« se tĂ« mjaftueshme. NĂ« realitet, natyrisht, pĂ«rdoren pajisje tĂ« specializuara pĂ«r marrjen dhe dekodimin, pĂ«r to do tĂ« flasim mĂ« poshtĂ«.

Pra, kemi marrĂ« regjistrimin, le t’i kalojmĂ« pĂ«rpunimit.

Dekodimi i sinjalit

Le të ngarkohet skeda me Python dhe të shohim strukturën e saj:

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

Ne shohim modifikimin tipik të amplitudës:
DCF77: si funksionon sistemi i transmetimit të sinjaleve të kohës précise?

Për të thjeshtuar dekodimin, do të marrim enkurimin e sinjalit me anë të transformimit të Hilbertit:

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

Rezultati në formë të zmadhuar:
DCF77: si funksionon sistemi i transmetimit të sinjaleve të kohës précise?

Do të nivelizojmë shqetësimet me anë të një filtri low-pass, për njëkohësisht do të llogarisim vlerën mesatare, e cila do të na nevojitet më vonë për përpunim.

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

Rezultati (vija e verdhĂ«): njĂ« sinjal pothuajse katror, i cili Ă«shtĂ« mjaft i lehtĂ« pĂ«r t’u analizuar.
DCF77: si funksionon sistemi i transmetimit të sinjaleve të kohës précise?

Parsing

Së pari, duhet të marrim sekuencën e bitëve. Struktura vetë e sinjalit është shumë e thjeshtë.
DCF77: si funksionon sistemi i transmetimit të sinjaleve të kohës précise?

Impulset janë të ndara në intervale sekondash. Nëse distanca midis impulsit është 0.1s (dmth. gjatësia e impulsit është 0.9s), ne shtojmë '0' në sekuencën e bitëve, nëse distanca është 0.2s (dmth. gjatësia është 0.8s), shtojmë '1'. Fundi i çdo minute shenohet me një impuls 'të gjatë', që zgjat 2s, ndërsa sekuenca e bitëve resetohë dhe fillon nga e para.

E gjithë kjo e shkruar nuk është e komplikuar për të realizuar në gjuhën Python.

sig_start, sig_stop = 0, 0
pos = 0
bits_str = ""
while pos < cnt - 4:
    if A[pos]  avg:
        # Fillimi i sinjalit
        sig_start = pos
    if A[pos] > avg and A[pos+1] < avg:
        # Fundi i sinjalit
        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

Si rezultat, ne marrim sekuencën e bitëve, në shembullin tonë për dy sekonda ajo duket kështu:

0011110110111000001011000001010000100110010101100010011000
0001111100110110001010100001010000100110010101100010011000

Dhe është interesante, që në sinjal ka gjithashtu një 'të dytë' nivel të dhënash. Sekuenca e bitëve është gjithashtu e koduar përmes modulim fazor. Teorikisht, kjo duhet të sigurojë dekodim më të qëndrushëm edhe në rastin e një sinjali të dobësuar.

Hapi ynë i fundit: të marrim të dhënat vetë. Bitët dërgohen një herë në sekondë, kështu që kemi gjithsej 59 bit, në të cilat është koduar një informacion mjaft i madh:
DCF77: si funksionon sistemi i transmetimit të sinjaleve të kohës précise?

Bitët janë të përshkruar në Wikipedia, dhe ato janë mjaft interesante. 15 bitët e parë nuk përdoren, megjithatë kishte plane për t'i përdorur për sistemet e alarmit dhe mbrojtjes civile. Bit A1 tregon se në orën e ardhshme, orët do të kalojnë në orën verore. Bit A2 tregon se në orën e ardhshme do të shtohet sekonda shtesë, e cila shpesh përdoret për të korrigjuar kohën sipas rrotullimit të Tokës. Bits e tjera kodojnë orët, minutat, sekondat dhe datën.

DCF77: si funksionon sistemi i transmetimit të sinjaleve të kohës précise?

Për ata që dëshirojnë të eksperimentojnë vetë, kodi për dekodimin është dhënë nën spoiler.
Kod i burimit

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 = ('E premte', 'E shtunë', 'E diel', 'E hënë', 'E martë', 'E mërkurë', 'E enjte', 'E premte')
    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)

Duke e ekzekutuar programin, do të shohim një output të tillë:

0011110110111000001011000001010000100110010101100010011000
E martë, 26.03.19, 21:41
0001111100110110001010100001010000100110010101100010011000
E martë, 26.03.19, 21:42

Ja, kjo Ă«shtĂ« gjithçka qĂ« ndodh. Avantazhi i kĂ«tij sistemi Ă«shtĂ« se dekodimi Ă«shtĂ« shumĂ« i thjeshtĂ« dhe mund tĂ« bĂ«het nĂ« çdo mikro-kontroler tĂ« thjeshtĂ«. Thjesht matni gjatĂ«si e impulsit, akumuloni 60 bits dhe nĂ« fund tĂ« çdo minute merrni kohĂ«n e saktĂ«. Krahasuar me mĂ«nyrat e tjera pĂ«r sinjalizimin e kohĂ«s (si GPS, ose, mos ndoshta, Interneti:), kjo radio-sinjalizim kĂ«rkon thuajse asnjĂ« energji elektrike — pĂ«r shembull, njĂ« stacion meteorologjik standard funksionon rreth njĂ« vit me 2 bateri AA. Prandaj, madje edhe orĂ«t dore bĂ«hen me radio-sinjalizim, e tĂ« mos flasim pĂ«r orĂ«t e murit apo ato tĂ« stacioneve.

Lehtësia dhe thjeshtësia e DCF tërheqin gjithashtu entuziastët e DIY. Vetëm për 10-20$ mund të blini një modul të përfunduar nga antena me një marrës të gatshëm dhe një dalje TTL, e cila mund të lidhet me Arduino ose një kontroler tjetër.
DCF77: si funksionon sistemi i transmetimit të sinjaleve të kohës précise?

PĂ«r Arduino tashmĂ« janĂ« shkruar dhe biblioteka tĂ« gatshme. MegjithatĂ«, Ă«shtĂ« e njohur — çfarĂ«do qĂ« tĂ« bĂ«ni nĂ« mikro-kontroler, do tĂ« rezultojĂ« ose nĂ« orĂ«, ose nĂ« stacion meteorologjik. Me njĂ« pajisje tĂ« tillĂ« Ă«shtĂ« vĂ«rtet e lehtĂ« tĂ« merrni kohĂ«n e saktĂ«, nĂ«se jeni natyrisht nĂ« zonĂ«n e marrjes. Po ashtu, mund tĂ« vendosni nĂ« orĂ« etiketĂ«n "OrĂ« Atomike" dhe tĂ« shpjegoni pĂ«r tĂ« gjithĂ« qĂ« pajisja vĂ«rtet synchronizohet me orĂ«t atomike.

Ata që dëshirojnë mund të përmirësojnë madje orët e vjetra të gjyshes duke instaluar një mekanizëm të ri me radio-sinjalizim:

DCF77: si funksionon sistemi i transmetimit të sinjaleve të kohës précise?

Një të tillë mund të gjeni në ebay me fjalët kyçe "Lëvizje e Kontrolluar nga Radio".

Dhe pĂ«rfundimisht, njĂ« hack pĂ«r ata qĂ« e lexuan deri kĂ«tu. Edhe nĂ«se nuk ka asnjĂ« transmetues radiokohore nĂ« njĂ« distancĂ« disa mijĂ«ra kilometrash, njĂ« sinjal tĂ« tillĂ« nuk Ă«shtĂ« e vĂ«shtirĂ« ta genereoni vetĂ«. NĂ« Google Play ka njĂ« program me emrin "DCF77 Emulator", i cili jep sinjalin nĂ« kufje. Sipas autorit, nĂ«se e mbuloni kabllon e kufjeve rreth orĂ«s, ato do tĂ« kapin sinjalin (Ă«shtĂ« interesante se si, sepse kufjet standarde nuk do tĂ« emitojnĂ« njĂ« sinjal 77 KHz, por ndoshta prania vjen pĂ«rmes harmonikave). Mua nĂ« Android 9 programi nuk funksionoi fare — thjesht nuk kishte zĂ« (ndoshta nuk e dĂ«gjova — 77 KHz, natyrisht:), por ndoshta dikush do tĂ« ketĂ« mĂ« shumĂ« fat. MegjithatĂ«, disa krijojnĂ« madje dhe njĂ« gjenerator sinjalesh DCF tĂ« plotĂ«, i cili Ă«shtĂ« e thjeshtĂ« tĂ« bĂ«het po ashtu nĂ« Arduino ose ESP32:

DCF77: si funksionon sistemi i transmetimit të sinjaleve të kohës précise?
(burimi sgfantasytoys.wordpress.com/2015/05/13/synchronize-radio-controlled-watch-without-access)

Përfundimi

Sistemi DCF, doli vërtet të jetë mjaft i thjeshtë dhe praktik. Me një marrës të thjeshtë dhe të lirë mund të keni kohën e saktë gjithmonë dhe kudo, natyrisht në zonën e marrjes. Mendoj se, edhe përkundër digitalizimit të gjërë dhe "internetit të gjërave", këto zgjidhje të thjeshta do të kërkohen për një kohë të gjatë.

Burimi: habr.com

Bleni hostim tĂ« besueshĂ«m pĂ«r faqe me mbrojtje nga DDoS, serverĂ« VPS VDS đŸ”„ Bleni hostim tĂ« besueshĂ«m pĂ«r faqe me mbrojtje nga DDoS, serverĂ« VPS VDS | ProHoster