Sæll Habr.
Sennilega hafa margir sem kaupa úr eða veðurstöð séð Radio Controlled Clock eða jafnvel Atomic Clock lógóið á umbúðunum. Þetta er mjög þægilegt, því þú þarft bara að setja klukkuna á borðið og eftir smá stund mun hún stilla sig sjálfkrafa á nákvæman tíma.
Við skulum reikna út hvernig það virkar og skrifa afkóðara í Python.
Það eru mismunandi tímasamstillingarkerfi. Vinsælast í Evrópu er þýska kerfið
Allt sem skrifað er hér að neðan mun snúast um DCF77.
Merkjamóttaka
DCF77 er langbylgjustöð sem starfar á 77.5 kHz tíðni og sendir merki í amplitude mótun. 50KW stöðin er staðsett 25 km frá Frankfurt, hún tók til starfa árið 1959 og árið 1973 var dagsetningarupplýsingum bætt við nákvæman tíma. Bylgjulengdin á tíðninni 77 KHz er mjög löng, þannig að stærð loftnetssviðsins er líka nokkuð þokkaleg (mynd frá Wikipedia):
Með slíku loftneti og aflinntaki nær móttökusvæðið yfir næstum alla Evrópu, Hvíta-Rússland, Úkraínu og hluta Rússlands.
Hver sem er getur tekið upp merki. Til að gera þetta skaltu bara fara í netmóttakara
Þar ýtum við á niðurhalshnappinn og tökum upp nokkurra mínútna langt brot. Auðvitað, ef þú ert með „raunverulegan“ móttakara sem getur tekið upp 77.5KHz tíðnina, geturðu notað það.
Að sjálfsögðu, með því að fá útvarpstímamerki í gegnum internetið, munum við ekki fá raunverulegan nákvæman tíma - merkið er sent með töf. En markmið okkar er aðeins að skilja uppbyggingu merksins; til þess er internetupptakan meira en nóg. Í raunveruleikanum eru auðvitað sérhæfð tæki notuð til að taka á móti og afkóða, þau verða rædd hér að neðan.
Svo við höfum fengið upptökuna, við skulum byrja að vinna úr henni.
Merkjaafkóðun
Við skulum hlaða skránni með Python og sjá uppbyggingu hennar:
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()
Við sjáum dæmigerða amplitude mótun:
Til að einfalda umskráningu skulum við taka merkjaumslagið með því að nota Hilbert umbreytinguna:
analytic_signal = signal.hilbert(data)
A = np.abs(analytic_signal)
plt.plot(A[:100000])
Stækkuð niðurstaða:
Sléttum út hávaðalosun með því að nota lágrásarsíu og reiknum um leið út meðalgildið sem nýtist síðar við þáttun.
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
Niðurstaða (gul lína): næstum ferhyrningsbylgjumerki sem auðvelt er að greina.
Dálka
Fyrst þarftu að fá bitaröðina. Merkjauppbyggingin sjálf er mjög einföld.
Púlsunum er skipt í sekúndubil. Ef fjarlægðin á milli púlsanna er 0.1 s (þ.e. lengd púlsins sjálfs er 0.9 s), bætið „0“ við bitaröðina; ef fjarlægðin er 0.2 s (þ.e. lengdin er 0.8 s), bætið „1“ við. Lok hverrar mínútu er auðkennd með „löngu“ púlsi, 2 sekúndum löngum, bitaröðin er núllstillt og fylling hefst aftur.
Auðvelt er að skrifa ofangreint í 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
Fyrir vikið fáum við röð af bitum, í dæminu okkar í tvær sekúndur lítur það svona út:
0011110110111000001011000001010000100110010101100010011000
0001111100110110001010100001010000100110010101100010011000
Við the vegur, það er áhugavert að merkið hefur einnig „annað lag“ af gögnum. Bitaröðin er einnig kóðað með því að nota
Síðasta skrefið okkar: að fá raunveruleg gögn. Bitar eru sendir einu sinni á sekúndu, þannig að við höfum samtals 59 bita, þar sem töluvert mikið af upplýsingum er umritað:
Bitunum er lýst í
Fyrir þá sem vilja gera tilraunir á eigin spýtur er afkóðun kóðann gefinn undir spoilernum.
Kóðinn
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)
Þegar við keyrum forritið munum við sjá framleiðsla svipað þessu:
0011110110111000001011000001010000100110010101100010011000
Tuesday, 26.03.19, 21:41
0001111100110110001010100001010000100110010101100010011000
Tuesday, 26.03.19, 21:42
Reyndar er það allur galdurinn. Kosturinn við slíkt kerfi er að afkóðun er einstaklega einföld og hægt að gera á hvaða, jafnvel einfaldasta örstýringu. Við teljum einfaldlega lengd púlsanna, söfnum 60 bitum og í lok hverrar mínútu fáum við nákvæman tíma. Í samanburði við aðrar aðferðir við tímasamstillingu (GPS, til dæmis, eða guð forði, internetið:), þarf slík útvarpssamstilling nánast ekkert rafmagn - til dæmis gengur venjuleg heimilisveðurstöð í um það bil ár á 2 AA rafhlöðum. Þess vegna eru jafnvel armbandsúr framleidd með útvarpssamstillingu, svo ekki sé minnst á að sjálfsögðu veggúr eða götustöðvarúr.
Þægindin og einfaldleikinn í DCF laðar einnig að sér DIY áhugamenn. Fyrir aðeins $10-20 er hægt að kaupa tilbúna loftnetseiningu með tilbúnum móttakara og TTL útgangi, sem hægt er að tengja við Arduino eða annan stjórnanda.
Þegar skrifað fyrir Arduino
Þeir sem vilja geta jafnvel uppfært gamla ömmuúrið með því að setja upp nýja vélbúnað með útvarpssamstillingu:
Þú getur fundið einn á ebay með því að nota leitarorðin "Radio Controlled Movement".
Og að lokum, lífstíll fyrir þá sem hafa lesið hingað til. Jafnvel þótt það sé ekki einn útvarpsmerkjasendir á næstu tvö þúsund km, þá er ekki erfitt að búa til slíkt merki sjálfur. Það er forrit á Google Play sem heitir „DCF77 Emulator“ sem gefur út merki í heyrnartól. Samkvæmt höfundinum, ef þú vefur vír heyrnartólanna utan um úrið, munu þau taka upp merkið (það er áhugavert hvernig, vegna þess að venjuleg heyrnartól gefa ekki 77KHz merki, en móttaka er líklega vegna harmonika). Á Android 9 virkaði forritið alls ekki fyrir mig - það var einfaldlega ekkert hljóð (eða kannski heyrði ég það ekki - það er 77KHz, þegar allt kemur til alls:), en kannski mun einhver hafa betur. Sumir gera sig hins vegar fullgildan DCF merkjagjafa, sem auðvelt er að búa til á sama Arduino eða ESP32:
(heimild
Ályktun
DCF kerfið reyndist í raun frekar einfalt og þægilegt. Með hjálp einfalds og ódýrs viðtækis geturðu haft nákvæma tíma alltaf og alls staðar, að sjálfsögðu í móttökunni. Svo virðist sem jafnvel þrátt fyrir útbreidda stafræna væðingu og Internet of Things muni slíkar einfaldar lausnir vera eftirsóttar í langan tíma.
Heimild: www.habr.com