Dia duit Habr.
Is dócha go bhfuil go leor a cheannaíonn uaireadóir nó stáisiún aimsire tar éis an lógó Clog Rialaithe Raidió nó fiú an Clog Adamhach a fheiceáil ar an bpacáistíocht. Tá sé seo an-áisiúil, mar ní mór duit ach an clog a chur ar an tábla, agus tar éis tamaill déanfaidh sé a choigeartú go huathoibríoch go dtí an t-am cruinn.
Déanaimis amach conas a oibríonn sé agus scríobhfaimid díchódóir i Python.
Tá córais sioncrónaithe ama éagsúla ann. Is é an córas Gearmánach an ceann is mó tóir san Eoraip
Beidh gach rud scríofa thíos faoin DCF77.
Fáiltiú comhartha
Is stáisiún tonnta fada é DCF77 a oibríonn ag minicíocht 77.5 kHz agus a tharchuireann comharthaí i modhnú aimplitiúid. Tá an stáisiún 50KW suite 25 km ó Frankfurt, thosaigh sé ag feidhmiú i 1959, agus i 1973 cuireadh faisnéis dáta leis an am cruinn. Tá an tonnfhad ag minicíocht 77 KHz an-fhada, agus mar sin tá toisí an réimse antenna sách réasúnta (grianghraf ó Vicipéid):
Le antenna den sórt sin agus ionchur cumhachta, clúdaíonn an limistéar glactha beagnach gach ceann den Eoraip, an Bhealarúis, an Úcráin agus cuid den Rúis.
Is féidir le duine ar bith comhartha a thaifeadadh. Chun seo a dhéanamh, téigh go dtí an glacadóir ar líne
Ansin brúigh muid an cnaipe íoslódála agus taifeadaimid blúire roinnt nóiméad ar fad. Ar ndóigh, má tá glacadóir “fíor” agat atá in ann an mhinicíocht 77.5KHz a thaifeadadh, is féidir leat é sin a úsáid.
Ar ndóigh, trí chomharthaí ama raidió a fháil tríd an Idirlíon, ní bhfaighidh muid am fíor-chruinn - tarchuirtear an comhartha gan mhoill. Ach is é an sprioc atá againn ach struchtúr an chomhartha a thuiscint; chuige seo, is mó ná go leor an taifeadadh Idirlín. Sa saol fíor, ar ndóigh, úsáidtear feistí speisialaithe chun glactha agus díchódaithe; pléifear iad thíos.
Mar sin, tá an taifeadadh faighte againn, déanaimis é a phróiseáil.
Díchódú Comhartha
Déanaimis an comhad a luchtú ag baint úsáide as Python agus a struchtúr a fheiceáil:
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()
Feicimid modhnú aimplitiúid tipiciúil:
Chun díchódú a shimpliú, tógfaimid an clúdach comhartha ag baint úsáide as an Hilbert transform:
analytic_signal = signal.hilbert(data)
A = np.abs(analytic_signal)
plt.plot(A[:100000])
Toradh méadaithe:
Déanaimis réidh astuithe torainn ag baint úsáide as scagaire pas íseal, agus ag an am céanna ríomh an meánluach, a bheidh úsáideach le haghaidh parsála níos déanaí.
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
Toradh (líne buí): comhartha tonn beagnach cearnach atá éasca go leor chun anailís a dhéanamh.
Parsáil
Ar dtús is gá duit an t-ord giotán a fháil. Tá an struchtúr comhartha féin an-simplí.
Roinntear na bíoga ina dhara eatraimh. Más é 0.1s an fad idir bíoga (i.e. fad na bíge féin ná 0.9s), cuir “0” leis an seicheamh giotán; más é 0.2s an fad (i.e. 0.8s an fad), cuir “1”. Léirítear deireadh gach nóiméad le bíog “fada”, 2s ar fad, athshocraítear an seicheamh giotán go nialas, agus tosaíonn an líonadh arís.
Is furasta an méid thuas a scríobh i 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
Mar thoradh air sin, faigheann muid seicheamh giotán, inár sampla ar feadh dhá soicind tá sé mar seo:
0011110110111000001011000001010000100110010101100010011000
0001111100110110001010100001010000100110010101100010011000
Dála an scéil, tá sé suimiúil go bhfuil "dara sraith" sonraí ag an gcomhartha freisin. Tá an seicheamh giotán ionchódaithe freisin ag baint úsáide as
Ár gcéim dheireanach: na sonraí iarbhír a fháil. Tarchuirtear giotán uair amháin in aghaidh an tsoicind, mar sin tá 59 giotán san iomlán againn, ina bhfuil go leor faisnéise ionchódaithe:
Tá cur síos ar na giotáin i
Dóibh siúd ar mian leo triail a bhaint astu féin, tugtar an cód díchódaithe faoin spoiler.
Cód foinseach
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)
Agus an clár á rith againn, feicfidh muid aschur cosúil leis seo:
0011110110111000001011000001010000100110010101100010011000
Tuesday, 26.03.19, 21:41
0001111100110110001010100001010000100110010101100010011000
Tuesday, 26.03.19, 21:42
I ndáiríre, sin an draíocht ar fad. Is é an buntáiste a bhaineann le córas den sórt sin ná go bhfuil an díchódú thar a bheith simplí agus is féidir é a dhéanamh ar aon, fiú an microcontroller is simplí. Ní dhéanaimid ach fad na bíoga a chomhaireamh, 60 giotán a charnadh, agus ag deireadh gach nóiméad faigheann muid an t-am cruinn. I gcomparáid le modhanna eile sioncrónaithe ama (GPS, mar shampla, nó Dia forbid, an Idirlíon :), éilíonn sioncrónaithe raidió den sórt sin beagnach aon leictreachas - mar shampla, ritheann stáisiún aimsire baile rialta ar feadh thart ar bhliain ar 2 cadhnraí AA. Dá bhrí sin, déantar fiú wristwatches le sioncrónú raidió, gan trácht ar, ar ndóigh, uaireadóirí balla nó uaireadóirí stáisiúin sráide.
Meallann áisiúlacht agus simplíocht DCF díograiseoirí DIY freisin. Ar $10-20 amháin, is féidir leat modúl antenna réamhdhéanta a cheannach le glacadóir réamhdhéanta agus aschur TTL, ar féidir a nascadh le Arduino nó le rialtóir eile.
Scríofa cheana féin le haghaidh Arduino
Is féidir leo siúd ar mian leo faire a seanmháthair a uasghrádú fiú trí mheicníocht nua a shuiteáil le sioncrónú raidió:
Is féidir leat ceann a fháil ar ebay ag baint úsáide as na heochairfhocail “Radio Controlled Movement”.
Agus ar deireadh, hack saoil dóibh siúd a léigh go dtí seo. Fiú mura bhfuil tarchuradóir comhartha raidió amháin sa chéad chúpla míle km eile, níl sé deacair comhartha den sórt sin a ghiniúint leat féin. Tá clár ar Google Play ar a dtugtar “DCF77 Emulator” a aschuireann an comhartha chuig cluasáin. De réir an údair, má fhillteann tú sreang na gcluasán timpeall an uaireadóra, roghnóidh siad an comhartha (tá sé suimiúil conas, mar ní tháirgeann gnáthchluasáin comhartha 77KHz, ach is dócha go mbeidh fáiltiú mar gheall ar armónach). Ar Android 9, níor oibrigh an clár domsa ar chor ar bith - go simplí ní raibh aon fhuaim ann (nó b'fhéidir nár chuala mé é - is é 77KHz é, tar éis an tsaoil :), ach b'fhéidir go mbeidh ádh níos fearr ag duine éigin. Déanann cuid acu, áfach, gineadóir comhartha DCF lán-chuimsitheach dóibh féin, atá éasca le déanamh ar an Arduino nó ESP32 céanna:
(foinse
Conclúid
Bhí an córas DCF simplí agus áisiúil i ndáiríre. Le cabhair ó ghlacadóir simplí agus saor, is féidir leat an t-am cruinn a bheith agat i gcónaí agus i ngach áit, ar ndóigh sa limistéar fáiltithe. Dealraíonn sé, fiú in ainneoin an digiteachaithe forleathan agus Idirlíon na Rudaí, go mbeidh éileamh ar réitigh shimplí den sórt sin ar feadh i bhfad.
Foinse: will.com