హలో హబ్ర్.
గడియారాన్ని లేదా వాతావరణ స్టేషన్ను కొనుగోలు చేసే చాలా మంది రేడియో నియంత్రిత గడియారాన్ని లేదా ప్యాకేజింగ్పై అటామిక్ క్లాక్ లోగోను కూడా చూసారు. ఇది చాలా సౌకర్యవంతంగా ఉంటుంది, ఎందుకంటే మీరు గడియారాన్ని టేబుల్పై ఉంచాలి మరియు కొంతకాలం తర్వాత అది స్వయంచాలకంగా ఖచ్చితమైన సమయానికి సర్దుబాటు అవుతుంది.
ఇది ఎలా పనిచేస్తుందో తెలుసుకుందాం మరియు పైథాన్లో డీకోడర్ను వ్రాస్దాం.
విభిన్న సమయ సమకాలీకరణ వ్యవస్థలు ఉన్నాయి. ఐరోపాలో అత్యంత ప్రజాదరణ పొందినది జర్మన్ వ్యవస్థ
క్రింద వ్రాసిన ప్రతిదీ DCF77 గురించి ఉంటుంది.
సిగ్నల్ రిసెప్షన్
DCF77 అనేది 77.5 kHz పౌనఃపున్యం వద్ద పనిచేసే లాంగ్ వేవ్ స్టేషన్ మరియు యాంప్లిట్యూడ్ మాడ్యులేషన్లో సంకేతాలను ప్రసారం చేస్తుంది. 50KW స్టేషన్ ఫ్రాంక్ఫర్ట్ నుండి 25 కిమీ దూరంలో ఉంది, ఇది 1959లో పని చేయడం ప్రారంభించింది మరియు 1973లో తేదీ సమాచారం ఖచ్చితమైన సమయానికి జోడించబడింది. 77 KHz ఫ్రీక్వెన్సీ వద్ద తరంగదైర్ఘ్యం చాలా పొడవుగా ఉంటుంది, కాబట్టి యాంటెన్నా ఫీల్డ్ యొక్క కొలతలు కూడా చాలా మంచివి (వికీపీడియా నుండి ఫోటో):
అటువంటి యాంటెన్నా మరియు పవర్ ఇన్పుట్తో, రిసెప్షన్ ప్రాంతం దాదాపు యూరప్, బెలారస్, ఉక్రెయిన్ మరియు రష్యాలోని కొంత భాగాన్ని కవర్ చేస్తుంది.
ఎవరైనా సిగ్నల్ రికార్డ్ చేయవచ్చు. దీన్ని చేయడానికి, ఆన్లైన్ రిసీవర్కు వెళ్లండి
అక్కడ మేము డౌన్లోడ్ బటన్ను నొక్కి, చాలా నిమిషాల నిడివి గల భాగాన్ని రికార్డ్ చేస్తాము. వాస్తవానికి, మీరు 77.5KHz ఫ్రీక్వెన్సీని రికార్డ్ చేయగల “నిజమైన” రిసీవర్ని కలిగి ఉంటే, మీరు దానిని ఉపయోగించవచ్చు.
వాస్తవానికి, ఇంటర్నెట్ ద్వారా రేడియో సమయ సంకేతాలను స్వీకరించడం ద్వారా, మేము నిజంగా ఖచ్చితమైన సమయాన్ని అందుకోలేము - సిగ్నల్ ఆలస్యంతో ప్రసారం చేయబడుతుంది. కానీ మా లక్ష్యం సిగ్నల్ యొక్క నిర్మాణాన్ని అర్థం చేసుకోవడం మాత్రమే; దీని కోసం, ఇంటర్నెట్ రికార్డింగ్ తగినంత కంటే ఎక్కువ. నిజ జీవితంలో, ప్రత్యేక పరికరాలు స్వీకరించడానికి మరియు డీకోడింగ్ చేయడానికి ఉపయోగించబడతాయి; అవి క్రింద చర్చించబడతాయి.
కాబట్టి, మేము రికార్డింగ్ను స్వీకరించాము, దాన్ని ప్రాసెస్ చేయడం ప్రారంభిద్దాం.
సిగ్నల్ డీకోడింగ్
పైథాన్ ఉపయోగించి ఫైల్ను లోడ్ చేద్దాం మరియు దాని నిర్మాణాన్ని చూద్దాం:
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()
మేము సాధారణ వ్యాప్తి మాడ్యులేషన్ని చూస్తాము:
డీకోడింగ్ను సులభతరం చేయడానికి, హిల్బర్ట్ పరివర్తనను ఉపయోగించి సిగ్నల్ ఎన్వలప్ను తీసుకుందాం:
analytic_signal = signal.hilbert(data)
A = np.abs(analytic_signal)
plt.plot(A[:100000])
విస్తరించిన ఫలితం:
తక్కువ-పాస్ ఫిల్టర్ని ఉపయోగించి శబ్ద ఉద్గారాలను సులభతరం చేద్దాం మరియు అదే సమయంలో సగటు విలువను లెక్కించండి, ఇది తరువాత పార్సింగ్కు ఉపయోగపడుతుంది.
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
ఫలితం (పసుపు గీత): దాదాపుగా చతురస్రాకారంలో ఉండే తరంగ సంకేతం విశ్లేషించడం చాలా సులభం.
పార్సింగ్
మొదట మీరు బిట్ సీక్వెన్స్ పొందాలి. సిగ్నల్ నిర్మాణం చాలా సులభం.
పప్పులు రెండవ విరామాలుగా విభజించబడ్డాయి. పప్పుల మధ్య దూరం 0.1సె (అంటే పల్స్ యొక్క పొడవు 0.9సె), బిట్ సీక్వెన్స్కు “0”ని జోడించండి; దూరం 0.2సె (అంటే పొడవు 0.8సె) అయితే, “1”ని జోడించండి. ప్రతి నిమిషం ముగింపు 2 సెకన్ల పొడవుతో "పొడవైన" పల్స్ ద్వారా సూచించబడుతుంది, బిట్ సీక్వెన్స్ సున్నాకి రీసెట్ చేయబడుతుంది మరియు నింపడం మళ్లీ ప్రారంభమవుతుంది.
పైథాన్లో రాయడం సులభం.
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
ఫలితంగా, మేము బిట్ల క్రమాన్ని పొందుతాము, మా ఉదాహరణలో రెండు సెకన్ల పాటు ఇది ఇలా కనిపిస్తుంది:
0011110110111000001011000001010000100110010101100010011000
0001111100110110001010100001010000100110010101100010011000
మార్గం ద్వారా, సిగ్నల్ డేటా యొక్క "రెండవ పొర" కూడా కలిగి ఉండటం ఆసక్తికరంగా ఉంది. బిట్ సీక్వెన్స్ కూడా ఉపయోగించి ఎన్కోడ్ చేయబడింది
మా చివరి దశ: వాస్తవ డేటాను పొందడం. బిట్లు సెకనుకు ఒకసారి ప్రసారం చేయబడతాయి, కాబట్టి మనకు మొత్తం 59 బిట్లు ఉన్నాయి, ఇందులో చాలా సమాచారం ఎన్కోడ్ చేయబడింది:
బిట్స్ లో వివరించబడ్డాయి
సొంతంగా ప్రయోగాలు చేయాలనుకునే వారికి స్పాయిలర్ కింద డీకోడింగ్ కోడ్ ఇవ్వబడుతుంది.
మూల
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)
మేము ప్రోగ్రామ్ను అమలు చేసినప్పుడు, మనకు ఇలాంటి అవుట్పుట్ కనిపిస్తుంది:
0011110110111000001011000001010000100110010101100010011000
Tuesday, 26.03.19, 21:41
0001111100110110001010100001010000100110010101100010011000
Tuesday, 26.03.19, 21:42
నిజానికి, అదంతా మాయాజాలం. అటువంటి వ్యవస్థ యొక్క ప్రయోజనం ఏమిటంటే డీకోడింగ్ చాలా సులభం మరియు ఏదైనా, సరళమైన మైక్రోకంట్రోలర్లో కూడా చేయవచ్చు. మేము పప్పుల పొడవును లెక్కిస్తాము, 60 బిట్లను కూడబెట్టుకుంటాము మరియు ప్రతి నిమిషం చివరిలో మేము ఖచ్చితమైన సమయాన్ని పొందుతాము. సమయ సమకాలీకరణ యొక్క ఇతర పద్ధతులతో పోలిస్తే (GPS, ఉదాహరణకు, లేదా దేవుడు నిషేధించాడు, ఇంటర్నెట్:), అటువంటి రేడియో సమకాలీకరణకు వాస్తవంగా విద్యుత్ అవసరం లేదు - ఉదాహరణకు, ఒక సాధారణ హోమ్ వాతావరణ స్టేషన్ 2 AA బ్యాటరీలపై ఒక సంవత్సరం పాటు నడుస్తుంది. అందువల్ల, చేతి గడియారాలు కూడా రేడియో సమకాలీకరణతో తయారు చేయబడతాయి, వాస్తవానికి, గోడ గడియారాలు లేదా వీధి స్టేషన్ గడియారాలు చెప్పనవసరం లేదు.
DCF యొక్క సౌలభ్యం మరియు సరళత కూడా DIY ఔత్సాహికులను ఆకర్షిస్తాయి. కేవలం $10-20 కోసం మీరు రెడీమేడ్ రిసీవర్ మరియు TTL అవుట్పుట్తో రెడీమేడ్ యాంటెన్నా మాడ్యూల్ను కొనుగోలు చేయవచ్చు, ఇది Arduino లేదా ఇతర కంట్రోలర్కు కనెక్ట్ చేయబడుతుంది.
Arduino కోసం ఇప్పటికే వ్రాయబడింది
కోరుకునే వారు రేడియో సింక్రొనైజేషన్తో కొత్త మెకానిజంను ఇన్స్టాల్ చేయడం ద్వారా తమ పాత అమ్మమ్మ గడియారాన్ని కూడా అప్గ్రేడ్ చేయవచ్చు:
"రేడియో నియంత్రిత కదలిక" అనే కీలక పదాలను ఉపయోగించి మీరు ebayలో ఒకదాన్ని కనుగొనవచ్చు.
చివరగా, ఇంతవరకు చదివిన వారికి లైఫ్ హ్యాక్. రాబోయే రెండు వేల కిలోమీటర్లలో ఒక్క రేడియో సిగ్నల్ ట్రాన్స్మిటర్ లేకపోయినా, అలాంటి సిగ్నల్ మీరే ఉత్పత్తి చేయడం కష్టం కాదు. Google Playలో "DCF77 ఎమ్యులేటర్" అనే ప్రోగ్రామ్ హెడ్ఫోన్లకు సిగ్నల్ను అవుట్పుట్ చేస్తుంది. రచయిత ప్రకారం, మీరు వాచ్ చుట్టూ హెడ్ఫోన్ల వైర్ను చుట్టినట్లయితే, వారు సిగ్నల్ను తీసుకుంటారు (ఎలా ఆసక్తికరంగా ఉంటుంది, ఎందుకంటే సాధారణ హెడ్ఫోన్లు 77KHz సిగ్నల్ను ఉత్పత్తి చేయవు, కానీ రిసెప్షన్ బహుశా హార్మోనిక్స్ వల్ల కావచ్చు). ఆండ్రాయిడ్ 9 లో, ప్రోగ్రామ్ నాకు అస్సలు పని చేయలేదు - శబ్దం లేదు (లేదా బహుశా నేను వినలేదు - ఇది 77KHz, అన్ని తరువాత :)), కానీ ఎవరైనా మంచి అదృష్టం కలిగి ఉండవచ్చు. అయితే కొందరు తమను తాము పూర్తి స్థాయి DCF సిగ్నల్ జనరేటర్గా తయారు చేసుకుంటారు, అదే Arduino లేదా ESP32లో తయారు చేయడం సులభం:
(ఒక మూలం
తీర్మానం
DCF వ్యవస్థ నిజంగా చాలా సరళంగా మరియు సౌకర్యవంతంగా మారింది. సరళమైన మరియు చౌక రిసీవర్ సహాయంతో, మీరు ఎల్లప్పుడూ మరియు ప్రతిచోటా ఖచ్చితమైన సమయాన్ని పొందవచ్చు, వాస్తవానికి రిసెప్షన్ ప్రాంతంలో. విస్తృతమైన డిజిటలైజేషన్ మరియు ఇంటర్నెట్ ఆఫ్ థింగ్స్ ఉన్నప్పటికీ, ఇటువంటి సాధారణ పరిష్కారాలు చాలా కాలం పాటు డిమాండ్లో ఉంటాయని తెలుస్తోంది.
మూలం: www.habr.com