سلام حبر.
شاید ډیری څوک چې ساعت یا د هوا سټیشن اخلي د راډیو کنټرول شوي ساعت یا حتی د اټومي ساعت لوگو په بسته بندۍ کې لیدلی وي. دا خورا اسانه دی ، ځکه چې تاسو اړتیا لرئ ساعت په میز کې واچوئ ، او یو څه وروسته به دا په اوتومات ډول دقیق وخت سره تنظیم شي.
راځئ چې معلومه کړو چې دا څنګه کار کوي او په Python کې یو ډیکوډر ولیکئ.
د وخت مختلف سیسټمونه شتون لري. په اروپا کې ترټولو مشهور د آلمان سیسټم دی
هر څه چې لاندې لیکل شوي د DCF77 په اړه به وي.
د سیګنال استقبال
DCF77 یو اوږد څپې سټیشن دی چې د 77.5 kHz په فریکونسۍ کې فعالیت کوي او د طول موډل کې سیګنالونه لیږدوي. د 50KW سټیشن د فرانکفورت څخه 25 کیلومتره کې موقعیت لري، دا په 1959 کې فعالیت پیل کړ، او په 1973 کې د نیټې معلومات دقیق وخت ته اضافه شول. د 77 KHz په فریکونسۍ کې د څپې اوږدوالی خورا اوږد دی ، نو د انتن ساحې ابعاد هم خورا ښه دي (د ویکیپیډیا څخه عکس):
د داسې انتن او بریښنا ان پټ سره، د استوګنې ساحه نږدې ټوله اروپا، بیلاروس، اوکراین او د روسیې برخه پوښي.
هر څوک کولی شي سیګنال ثبت کړي. د دې کولو لپاره، یوازې آنلاین اخیستونکي ته لاړ شئ
هلته موږ د ډاونلوډ تڼۍ فشار راوړو او څو دقیقې اوږده ټوټه ثبت کړو. البته ، که تاسو د 77.5KHz فریکونسۍ ثبتولو وړ "ریښتیني" ریسیور لرئ ، تاسو کولی شئ دا وکاروئ.
البته ، د انټرنیټ له لارې د راډیو وخت سیګنالونو ترلاسه کولو سره ، موږ به واقعیا دقیق وخت ترلاسه نکړو - سیګنال د ځنډ سره لیږدول کیږي. مګر زموږ هدف یوازې د سیګنال جوړښت پوهیدل دي؛ د دې لپاره ، د انټرنیټ ثبت کول د کافي څخه ډیر دي. په ریښتیني ژوند کې، البته، ځانګړي وسایل د ترلاسه کولو او کوډ کولو لپاره کارول کیږي؛ دوی به لاندې بحث وشي.
نو، موږ ریکارډ ترلاسه کړ، راځئ چې پروسس پیل کړو.
د سیګنال کوډ کول
راځئ چې د Python په کارولو سره فایل پورته کړو او جوړښت یې وګورو:
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.1s وي (یعنې د نبض اوږدوالی پخپله 0.9s وي) ، د بټ ترتیب ته "0" اضافه کړئ؛ که چیرې فاصله 0.2s وي (یعنې اوږدوالی 0.8s وي) ، "1" اضافه کړئ. د هرې دقیقې پای د "اوږدې" نبض لخوا ښودل شوی، 2s اوږد دی، د بټ ترتیب صفر ته بیا تنظیم شوی، او ډکول بیا پیل کیږي.
پورته په 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
د پایلې په توګه، موږ د بټونو ترتیب ترلاسه کوو، زموږ په مثال کې د دوو ثانیو لپاره دا داسې ښکاري:
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 لپاره لیکل شوی
هغه څوک چې غواړي حتی د راډیو همغږي کولو سره د نوي میکانیزم په نصبولو سره د خپل زوړ انا ساعت لوړ کړي:
تاسو کولی شئ په ای بی کې د "راډیو کنټرول شوي حرکت" کلیدي کلمو په کارولو سره یو ومومئ.
او په نهایت کې ، د هغه چا لپاره د ژوند هیک چې دا یې لوستلي دي. حتی که په راتلونکو دوه زره کیلومترو کې د راډیو سیګنال لیږدونکی شتون ونلري ، نو پخپله د ورته سیګنال رامینځته کول ستونزمن ندي. په ګوګل پلی کې د "DCF77 ایمولیټر" په نوم یو برنامه شتون لري چې هیډفونونو ته سیګنال ورکوي. د لیکوال په وینا ، که تاسو د ساعت په شاوخوا کې د هیډفونونو تار وتړئ ، نو دوی به سیګنال غوره کړي (دا په زړه پورې ده چې څنګه ، ځکه چې عادي هیډفونونه به د 77KHz سیګنال تولید نکړي ، مګر استقبال شاید د هارمونیک له امله وي). په Android 9 کې ، برنامه زما لپاره هیڅ کار نه کوي - په ساده ډول هیڅ غږ نه و (یا شاید ما دا نه وي اوریدلی - دا 77KHz دی ، په هرصورت :) ، مګر شاید یو څوک به ښه بخت ولري. ځینې، په هرصورت، ځان ته د بشپړ DCF سیګنال جنراتور جوړوي، کوم چې په ورته Arduino یا ESP32 کې اسانه کول اسانه دي:
(سرچینه)
پایلې
د DCF سیسټم واقعیا خورا ساده او اسانه وګرځید. د ساده او ارزانه رسیدونکي په مرسته، تاسو کولی شئ دقیق وخت تل او هرچیرې ولرئ، البته د استقبال په ساحه کې. داسې بریښي چې حتی د پراخه ډیجیټل کولو او د شیانو انټرنیټ سره سره ، دا ډول ساده حلونه به د اوږدې مودې لپاره غوښتنه وي.
سرچینه: www.habr.com