I-DCF77: lusebenza kanjani uhlelo lokusayina isikhathi?

Sawubona Habr.

Cishe abaningi abathenga iwashi noma isiteshi sezulu baye babona uphawu lwewashi le-Radio Controlled noma i-Atomic Clock emaphaketheni. Lokhu kulula kakhulu, ngoba kwanele ukubeka iwashi etafuleni, futhi ngemva kwesikhashana lizozivumelanisa ngokuzenzakalelayo nesikhathi esiqondile.
I-DCF77: lusebenza kanjani uhlelo lokusayina isikhathi?

Ake sithole ukuthi kusebenza kanjani futhi sibhale i-decoder kuPython.

Kukhona amasistimu okuvumelanisa isikhathi ahlukene. Okudume kakhulu eYurophu uhlelo lwaseJalimane I-DCF-77I-Japan inesistimu yayo JJY, e-USA kukhona uhlelo I-WWVB, njalo njalo. Ngaphezu kwalokho, indaba izoba mayelana ne-DCF77, njengoba ifaneleka kakhulu futhi ifinyeleleka ukwamukelwa kwezinye izindawo zengxenye yaseYurophu yaseRussia namazwe angomakhelwane (izakhamuzi zaseMpumalanga Ekude zingase zibe nombono ophambene, kodwa-ke, nazo, zingaba nombono ohlukile. thola futhi uhlaziye isignali yaseJapane;).

Konke okubhalwe ngezansi kuzoba mayelana ne-DCF77.

Ukwamukela isignali

I-DCF77 iyisiteshi se-longwave esisebenza ku-77.5KHz futhi sidlulisela amasiginali we-AM. Isiteshi esinamandla angu-50 kW sitholakala ku-25 km ukusuka eFrankfurt, saqala ukusebenza ngo-1959, ngo-1973 ulwazi mayelana nosuku lwanezelwa esikhathini esiqondile. Ubude begagasi bemvamisa engu-77 kHz bukhulu kakhulu, ngakho-ke ubukhulu benkambu ye-antenna buhloniphekile kakhulu (isithombe esivela ku-Wikipedia):
I-DCF77: lusebenza kanjani uhlelo lokusayina isikhathi?

Ngamandla anjalo e-antenna namandla okokufaka, indawo yokwamukela izivakashi ihlanganisa cishe lonke elaseYurophu, Belarus, Ukraine kanye nengxenye yeRussia.

I-DCF77: lusebenza kanjani uhlelo lokusayina isikhathi?

Noma ubani angarekhoda. Ukuze wenze lokhu, vele uye kumamukeli aku-inthanethi http://websdr.ewi.utwente.nl:8901/, khetha imvamisa engu-76.5KHz kanye nokushintshashintsha kwe-USB lapho. Isithombe kufanele sivele kanje:

I-DCF77: lusebenza kanjani uhlelo lokusayina isikhathi?

Endaweni efanayo, sicindezela inkinobho yokulanda futhi sirekhode isiqeshana imizuzu embalwa ubude. Yiqiniso, uma unomamukeli "wangempela" okwazi ukurekhoda imvamisa engu-77.5 kHz, ungayisebenzisa.

Impela, lapho sithola amasignali erediyo esikhathi esinembile nge-inthanethi, ngeke sithole isikhathi esinembile ngempela - isignali idluliselwa ngokubambezeleka. Kodwa umgomo wethu uwukuqonda kuphela ukwakheka kwesiginali, ngoba lokhu ukurekhoda kwe-inthanethi kungaphezu kokwanele. Empilweni yangempela, yiqiniso, kusetshenziselwa amadivaysi akhethekile ukwamukela nokukhipha amakhodi, kuzoxoxwa ngakho ngezansi.

Ngakho, silitholile irekhodi, ake siqale ukulicubungula.

Ukukhipha ikhodi yesiginali

Masilayishe ifayela ngePython futhi sibone ukwakheka kwalo:

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

Sibona ukuguquguquka kwe-amplitude okujwayelekile:
I-DCF77: lusebenza kanjani uhlelo lokusayina isikhathi?

Ukwenza lula ukukhishwa kwekhodi, sithatha imvilophu yesignali sisebenzisa i-Hilbert transform:

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

Umphumela onwetshiwe:
I-DCF77: lusebenza kanjani uhlelo lokusayina isikhathi?

Masenze bushelelezi ukukhishwa komsindo sisebenzisa isihlungi sephasi eliphansi, ngesikhathi esifanayo sibale inani elimaphakathi, lizofika liwusizo kamuva ukuze lihlukaniswe.

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

Umphumela (umugqa ophuzi): isignali cishe engunxande okulula ukuyihlaziya.
I-DCF77: lusebenza kanjani uhlelo lokusayina isikhathi?

Ukuhlahlela

Okokuqala udinga ukuthola ukulandelana kwebhithi. Isakhiwo sesignali ngokwayo silula kakhulu.
I-DCF77: lusebenza kanjani uhlelo lokusayina isikhathi?

Ama-pulses ahlukaniswe abe yizikhawu zesibili. Uma ibanga eliphakathi kwama-pulses liyi-0.1s (okungukuthi, ubude be-pulse ngokwayo buyi-0.9s), sengeza "0" ngokulandelana kancane, uma ibanga liyi-0.2s (okungukuthi, ubude buyi-0.8s), singeza β€œ1”. Ukuphela komzuzu ngamunye kuboniswa ishayela "elide", 2 s ubude, ukulandelana kwebhithi kusethwe kabusha ku-zero, futhi ukugcwaliswa kuqala futhi.

Okungenhla kulula ukubhala ngePython.

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

Njengomphumela, sithola ukulandelana kwamabhithi, esibonelweni sethu imizuzwana emibili kubukeka kanje:

0011110110111000001011000001010000100110010101100010011000
0001111100110110001010100001010000100110010101100010011000

Ngendlela, kuyathakazelisa ukuthi kukhona "ungqimba lwesibili" lwedatha kusiginali. Ukulandelana kwebhithi nakho kubhalwe ngekhodi ukuguqulwa kwesigaba. Ngokwetiyori, lokhu kufanele kunikeze ukususa amakhodi okuqinile ngisho noma isignali ebuthaka.

Isinyathelo sethu sokugcina: thola idatha yangempela. Amabhithi athunyelwa kanye ngomzuzwana, ngakho-ke sinamabhithi angama-59 kuphela, lapho ulwazi oluningi lubhalwa khona:
I-DCF77: lusebenza kanjani uhlelo lokusayina isikhathi?

Izingcezu zichazwe ku I-Wikipediafuthi banelukuluku lokwazi. Amabhithi ayi-15 okuqala awasetshenziswa, nakuba bekunezinhlelo zokuwasebenzisa enkulumweni yomphakathi nasezinhlelweni zokuvikela umphakathi. I-Bit A1 ibonisa ukuthi iwashi lizoshintsha libe isikhathi sokulondoloza ukukhanya kwasemini ehoreni elilandelayo. I-Bit A2 ikhombisa ukuthi kuzongezwa ihora elilandelayo gxuma okwesibili, ngezinye izikhathi ezisetshenziselwa ukulungisa isikhathi ngokuvumelana nokujikeleza koMhlaba. Izingcezu ezisele zihlanganisa amahora, imizuzu, imizuzwana, nosuku.

I-DCF77: lusebenza kanjani uhlelo lokusayina isikhathi?

Kulabo abafuna ukuzama ngokwabo, ikhodi yokukhipha ikhodi inikezwa ngaphansi kwe-spoiler.
Umthombo

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)

Ukuqalisa uhlelo, sizobona okuthile okufana nalokhu okukhiphayo:

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

Empeleni, yilokho kuphela umlingo. Inzuzo yohlelo olunjalo ukuthi ukususa amakhodi kulula kakhulu, futhi kungenziwa kunoma iyiphi, isilawuli esincane esingelula kakhulu. Sibala nje ubude be-pulses, siqongelela ama-bits angu-60, futhi ekupheleni komzuzu ngamunye sithola isikhathi esiqondile. Uma kuqhathaniswa nezinye izindlela zokuvumelanisa isikhathi (i-GPS, isibonelo, noma uNkulunkulu wenqabela, i-intanethi :), ukuvumelanisa okunjalo komsakazo akudingi ugesi - isibonelo, isiteshi sesimo sezulu sasekhaya esivamile sisebenza cishe unyaka kumabhethri angu-2 AA. Ngakho-ke, ngisho namawashi esihlakala enziwa ngokuvumelanisa umsakazo, ingasaphathwa, yebo, amawashi odongeni noma amawashi esiteshi somgwaqo.

Ukuba lula nokubalula kwe-DCF nakho kuheha abathanda i-DIY. Ngama-$10-20 kuphela, ungathenga imojula ye-antenna eseyenziwe ngomumo nesamukeli esenziwe ngomumo kanye nokuphumayo kwe-TTL okungaxhunywa ku-Arduino noma esinye isilawuli.
I-DCF77: lusebenza kanjani uhlelo lokusayina isikhathi?

Ukuze Arduino kakade kubhaliwe futhi imitapo yolwazi eseyenziwe ngomumo. Kodwa-ke, sekuvele kwaziwa ukuthi noma yini oyenzayo ku-microcontroller, uthola iwashi noma isiteshi sezulu. Ngomshini onjalo, ukuthola isikhathi esiqondile kulula ngempela, ngaphandle uma usendaweni yokwamukela. Hhayi-ke, ungalenga umbhalo othi "Iwashi le-Atomic" ewashini, futhi ngesikhathi esifanayo uchaze kuwo wonke umuntu ukuthi idivayisi ivunyelaniswe ngempela kusetshenziswa iwashi le-athomu.

Abafisayo bangathuthukisa ngisho newashi likagogo omdala ngokufaka indlela entsha enokuvumelanisa umsakazo:

I-DCF77: lusebenza kanjani uhlelo lokusayina isikhathi?

Ungathola eyodwa ku-ebay usebenzisa amagama angukhiye "I-Radio Controlled Movement".

Futhi ekugcineni, i-hack yempilo yalabo abafunde kuze kube manje. Ngisho noma singekho isidlulisi esisodwa sesignali yomsakazo kumakhilomitha ambalwa alandelayo ayizinkulungwane, isignali enjalo kulula ukuyikhiqiza ngokwakho. Kunohlelo ku-Google Play olubizwa nge-"DCF77 Emulator" olukhipha isignali kuma-headphone. Ngokusho kombhali, uma ugoqa ucingo lwe-headphone ubusuku nemini, bazobamba isignali (Ngiyamangala ukuthi kanjani, ngoba ama-headphones ajwayelekile ngeke akhiphe isignali ye-77KHz, kodwa mhlawumbe ukwamukela kubangelwa i-harmonics). Uhlelo aluzange lungisebenzele ku-Android 9 nhlobo - bekungekho msindo (noma mhlawumbe angiwuzwanga - 77KHz, phela :), kodwa mhlawumbe othile uzoba nenhlanhla eyengeziwe. Abanye, nokho, bazenza ijeneretha yesiginali ye-DCF egcwele, okulula ukuyenza ku-Arduino noma i-ESP32 efanayo:

I-DCF77: lusebenza kanjani uhlelo lokusayina isikhathi?
(umthombo sgfantasytoys.wordpress.com/2015/05/13/synchronize-radio-controlled-watch-without-access)

isiphetho

Uhlelo lwe-DCF lubonakale lulula futhi luwusizo ngempela. Ngosizo lomamukeli olula futhi oshibhile, ungaba nesikhathi esiqondile njalo futhi yonke indawo, yebo endaweni yokwamukela. Kubonakala sengathi naphezu kokusabalalisa kwedijithali kanye "ne-Inthanethi Yezinto", izixazululo ezinjalo ezilula zizodingeka isikhathi eside esizayo.

Source: www.habr.com

Engeza amazwana