ہیلو حبر۔
شاید بہت سے لوگ جو گھڑی یا ویدر اسٹیشن خریدتے ہیں انہوں نے پیکیجنگ پر ریڈیو کنٹرولڈ کلاک یا یہاں تک کہ اٹامک کلاک کا لوگو دیکھا ہے۔ یہ بہت آسان ہے، کیونکہ آپ کو صرف گھڑی کو میز پر رکھنے کی ضرورت ہے، اور تھوڑی دیر کے بعد یہ خود بخود درست وقت کے مطابق ہو جائے گی۔
آئیے معلوم کریں کہ یہ کیسے کام کرتا ہے اور 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 بٹس جمع کرتے ہیں، اور ہر منٹ کے آخر میں ہمیں صحیح وقت مل جاتا ہے۔ ٹائم سنکرونائزیشن کے دیگر طریقوں (جی پی ایس، مثال کے طور پر، یا خدا منع کرے، انٹرنیٹ:) کے مقابلے میں، اس طرح کے ریڈیو سنکرونائزیشن کے لیے عملی طور پر بجلی کی ضرورت نہیں ہوتی ہے - مثال کے طور پر، ایک باقاعدہ گھریلو موسمی اسٹیشن 2 AA بیٹریوں پر تقریباً ایک سال تک چلتا ہے۔ لہذا، یہاں تک کہ کلائی کی گھڑیاں بھی ریڈیو سنکرونائزیشن کے ساتھ بنائی جاتی ہیں، جس کا ذکر نہیں کرنا چاہیے، یقیناً وال گھڑیاں یا اسٹریٹ اسٹیشن گھڑیاں۔
DCF کی سہولت اور سادگی بھی DIY کے شوقین افراد کو اپنی طرف متوجہ کرتی ہے۔ صرف $10-20 میں آپ ریڈی میڈ ریسیور اور TTL آؤٹ پٹ کے ساتھ ایک ریڈی میڈ اینٹینا ماڈیول خرید سکتے ہیں، جسے Arduino یا دوسرے کنٹرولر سے منسلک کیا جا سکتا ہے۔
پہلے ہی Arduino کے لیے لکھا گیا ہے۔
جو لوگ چاہتے ہیں وہ ریڈیو سنکرونائزیشن کے ساتھ ایک نیا میکانزم لگا کر اپنی پرانی دادی کی گھڑی کو بھی اپ گریڈ کر سکتے ہیں:
آپ کلیدی الفاظ "ریڈیو کنٹرولڈ موومنٹ" کا استعمال کرتے ہوئے ای بے پر تلاش کر سکتے ہیں۔
اور آخر میں، ان لوگوں کے لیے ایک لائف ہیک جنہوں نے ابھی تک پڑھا ہے۔ اگر اگلے دو ہزار کلومیٹر میں ایک بھی ریڈیو سگنل ٹرانسمیٹر نہ ہو تب بھی ایسا سگنل خود پیدا کرنا مشکل نہیں ہے۔ گوگل پلے پر "DCF77 ایمولیٹر" کے نام سے ایک پروگرام ہے جو ہیڈ فون کو سگنل دیتا ہے۔ مصنف کے مطابق، اگر آپ ہیڈ فون کے تار کو گھڑی کے گرد لپیٹیں گے، تو وہ سگنل اٹھا لیں گے (یہ دلچسپ ہے کہ کیسے، کیونکہ عام ہیڈ فون 77KHz سگنل نہیں دیں گے، لیکن استقبالیہ شاید ہارمونکس کی وجہ سے ہوتا ہے)۔ اینڈرائیڈ 9 پر، پروگرام میرے لیے بالکل بھی کام نہیں کرتا تھا - بس کوئی آواز نہیں تھی (یا شاید میں نے اسے نہیں سنا تھا - یہ 77KHz ہے، آخر کار:)، لیکن شاید کسی کی قسمت اچھی ہو۔ تاہم، کچھ اپنے آپ کو ایک مکمل ڈی سی ایف سگنل جنریٹر بناتے ہیں، جو اسی Arduino یا ESP32 پر بنانا آسان ہے:
(ذریعہ
حاصل يہ ہوا
ڈی سی ایف سسٹم واقعی کافی آسان اور آسان نکلا۔ ایک سادہ اور سستے ریسیور کی مدد سے، آپ ہمیشہ اور ہر جگہ درست وقت حاصل کر سکتے ہیں، یقیناً استقبالیہ کے علاقے میں۔ ایسا لگتا ہے کہ بڑے پیمانے پر ڈیجیٹلائزیشن اور چیزوں کے انٹرنیٹ کے باوجود، اس طرح کے آسان حلوں کی طویل عرصے سے مانگ رہے گی۔
ماخذ: www.habr.com