DCF77: කාල සංඥා පද්ධතිය ක්‍රියා කරන්නේ කෙසේද?

හලෝ හබ්ර්.

ඔරලෝසුවක් හෝ කාලගුණ මධ්‍යස්ථානයක් මිල දී ගන්නා බොහෝ දෙනෙක් ඇසුරුම්වල රේඩියෝ පාලිත ඔරලෝසුව හෝ පරමාණුක ඔරලෝසු ලාංඡනය පවා දැක ඇත. මෙය ඉතා පහසු ය, මන්ද ඔබට ඔරලෝසුව මේසය මත තැබිය යුතු අතර ටික වේලාවකට පසු එය ස්වයංක්‍රීයව නියමිත වේලාවට ගැලපේ.
DCF77: කාල සංඥා පද්ධතිය ක්‍රියා කරන්නේ කෙසේද?

අපි එය ක්‍රියා කරන ආකාරය සොයාගෙන පයිතන් හි විකේතකයක් ලියන්නෙමු.

විවිධ කාල සමමුහුර්තකරණ පද්ධති තිබේ. යුරෝපයේ වඩාත්ම ජනප්රිය වන්නේ ජර්මානු ක්රමයයි DCF-77, ජපානයට තමන්ගේම පද්ධතියක් ඇත ජේ, USA වල ක්‍රමයක් තියෙනවා ඩබ්ලිව්ඩබ්ලිව්වීබී, සහ යනාදි. ඊළඟට, කතාව DCF77 ගැන වනු ඇත, රුසියාවේ යුරෝපීය කොටසේ සහ අසල්වැසි රටවල සමහර ස්ථානවල පිළිගැනීම සඳහා වඩාත් අදාළ සහ ප්‍රවේශ විය හැකි පරිදි (ඈත පෙරදිග පදිංචිකරුවන්ට ප්‍රතිවිරුද්ධ මතයක් තිබිය හැකිය, කෙසේ වෙතත්, ඔවුන්ට අනෙක් අතට ලැබිය හැකිය. සහ ජපන් සංඥා විශ්ලේෂණය;).

පහත ලියා ඇති සියල්ල DCF77 ගැන වනු ඇත.

සංඥා පිළිගැනීම

DCF77 යනු 77.5 kHz සංඛ්‍යාතයකින් ක්‍රියාත්මක වන දිගු තරංග මධ්‍යස්ථානයක් වන අතර amplitude modulation තුළ සංඥා සම්ප්‍රේෂණය කරයි. 50KW දුම්රිය ස්ථානය ෆ්‍රැන්ක්ෆර්ට් සිට කිලෝමීටර් 25 ක් දුරින් පිහිටා ඇත, එය 1959 දී ක්‍රියාත්මක වීමට පටන් ගත් අතර 1973 දී දින තොරතුරු නිශ්චිත වේලාවට එකතු කරන ලදී. 77 KHz සංඛ්‍යාතයක තරංග ආයාමය ඉතා දිගු වේ, එබැවින් ඇන්ටෙනා ක්ෂේත්‍රයේ මානයන් ද තරමක් යහපත් ය (ඡායාරූපය විකිපීඩියාවෙන්):
DCF77: කාල සංඥා පද්ධතිය ක්‍රියා කරන්නේ කෙසේද?

එවැනි ඇන්ටෙනාවක් සහ බල ආදානයක් සහිතව, පිළිගැනීමේ ප්රදේශය යුරෝපය, බෙලාරුස්, යුක්රේනය සහ රුසියාවේ කොටසක් ආවරණය කරයි.

DCF77: කාල සංඥා පද්ධතිය ක්‍රියා කරන්නේ කෙසේද?

ඕනෑම කෙනෙකුට සංඥාවක් පටිගත කළ හැකිය. මෙය සිදු කිරීම සඳහා, සබැඳි ග්රාහකයා වෙත යන්න http://websdr.ewi.utwente.nl:8901/, එහි සංඛ්‍යාතය 76.5KHz සහ USB මොඩියුලේෂන් තෝරන්න. මේ වගේ දෙයක් පෙනෙන රූපයක් විවෘත විය යුතුය:

DCF77: කාල සංඥා පද්ධතිය ක්‍රියා කරන්නේ කෙසේද?

එහිදී අපි බාගැනීම් බොත්තම ඔබා මිනිත්තු කිහිපයක් දිග කැබැල්ලක් පටිගත කරමු. ඇත්ත වශයෙන්ම, ඔබට 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()

අපි සාමාන්‍ය විස්තාරය මොඩියුලේෂන් දකිමු:
DCF77: කාල සංඥා පද්ධතිය ක්‍රියා කරන්නේ කෙසේද?

විකේතනය සරල කිරීම සඳහා, හිල්බට් පරිවර්තනය භාවිතයෙන් සංඥා ලියුම් කවරය ගනිමු:

analytic_signal = signal.hilbert(data)
A = np.abs(analytic_signal)
plt.plot(A[:100000])

විශාල කළ ප්රතිඵලය:
DCF77: කාල සංඥා පද්ධතිය ක්‍රියා කරන්නේ කෙසේද?

අඩු පාස් ෆිල්ටරයක් ​​භාවිතයෙන් ශබ්ද විමෝචනය සුමට කරමු, ඒ සමඟම සාමාන්ය අගය ගණනය කරමු, එය පසුව විග්රහ කිරීමට ප්රයෝජනවත් වනු ඇත.

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

ප්‍රතිඵලය (කහ රේඛාව): විශ්ලේෂණ කිරීමට තරමක් පහසු වර්ග තරංග සංඥාවක්.
DCF77: කාල සංඥා පද්ධතිය ක්‍රියා කරන්නේ කෙසේද?

විග්‍රහ කිරීම

මුලින්ම ඔබ බිට් අනුපිළිවෙල ලබා ගත යුතුය. සංඥා ව්යුහයම ඉතා සරල ය.
DCF77: කාල සංඥා පද්ධතිය ක්‍රියා කරන්නේ කෙසේද?

ස්පන්දන දෙවන අන්තරයන්ට බෙදී ඇත. ස්පන්දන අතර දුර 0.1s නම් (එනම් ස්පන්දනයේ දිග 0.9s), බිටු අනුපිළිවෙලට "0" එකතු කරන්න; දුර 0.2s (එනම් දිග 0.8s) නම්, "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 ක් ඇත, එහි බොහෝ තොරතුරු කේතනය කර ඇත:
DCF77: කාල සංඥා පද්ධතිය ක්‍රියා කරන්නේ කෙසේද?

බිටු විස්තර කර ඇත විකිපීඩියා, සහ ඔවුන් තරමක් කුතුහලයෙන් සිටිති. අනතුරු ඇඟවීමේ පද්ධති සහ සිවිල් ආරක්ෂාව සඳහා ඒවා භාවිතා කිරීමට සැලසුම් කර තිබුණද, පළමු බිටු 15 භාවිතා නොකෙරේ. Bit A1 පෙන්නුම් කරන්නේ ඔරලෝසුව ඉදිරි පැයේදී දිවා ආලෝකය සුරැකීමේ වේලාවට වෙනස් වන බවයි. Bit A2 අතිරේක බව පෙන්නුම් කරයි දෙවන පිම්ම, සමහර විට පෘථිවි භ්‍රමණය අනුව කාලය සකස් කිරීමට භාවිතා කරයි. ඉතිරි බිටු පැය, මිනිත්තු, තත්පර සහ දිනය සංකේතනය කරයි.

DCF77: කාල සංඥා පද්ධතිය ක්‍රියා කරන්නේ කෙසේද?

තමන් විසින්ම අත්හදා බැලීමට කැමති අය සඳහා, ස්පොයිලර් යටතේ විකේතන කේතය ලබා දී ඇත.
ප්‍රභව කේතය

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 කට පමණක් ඔබට Arduino හෝ වෙනත් පාලකයකට සම්බන්ධ කළ හැකි සූදානම් කළ ග්‍රාහකයක් සහ TTL ප්‍රතිදානයක් සහිත සූදානම් කළ ඇන්ටෙනා මොඩියුලයක් මිලදී ගත හැකිය.
DCF77: කාල සංඥා පද්ධතිය ක්‍රියා කරන්නේ කෙසේද?

Arduino සඳහා දැනටමත් ලියා ඇත සූදානම් පුස්තකාල. කෙසේ වෙතත්, ඔබ ක්ෂුද්‍ර පාලකයක කුමක් කළත්, ඔබ ඔරලෝසුවකින් හෝ කාලගුණ මධ්‍යස්ථානයකින් අවසන් වන බව දැනටමත් දන්නා කරුණකි. එවැනි උපකරණයක් සමඟ, නිශ්චිත වේලාව ලබා ගැනීම ඇත්තෙන්ම පහසුය, ඇත්ත වශයෙන්ම, ඔබ පිළිගැනීමේ ප්රදේශයේ සිටින බව. හොඳයි, ඔබට ඔබේ ඔරලෝසුවේ "පරමාණුක ඔරලෝසුව" යන සෙල්ලිපිය එල්ලා තැබිය හැකි අතර, ඒ සමඟම උපාංගය පරමාණුක ඔරලෝසුවක් භාවිතයෙන් සැබවින්ම සමමුහුර්ත කර ඇති බව සෑම කෙනෙකුටම පැහැදිලි කරන්න.

කැමති අයට රේඩියෝ සමමුහුර්තකරණය සමඟ නව යාන්ත්‍රණයක් ස්ථාපනය කිරීමෙන් ඔවුන්ගේ පැරණි ආච්චිගේ ඔරලෝසුව පවා යාවත්කාලීන කළ හැකිය:

DCF77: කාල සංඥා පද්ධතිය ක්‍රියා කරන්නේ කෙසේද?

“රේඩියෝ පාලිත චලනය” යන මූල පද භාවිතයෙන් ඔබට ebay හි එකක් සොයාගත හැකිය.

අවසාන වශයෙන්, මෙතරම් දුර කියවූ අයට ජීවිත හැක් කිරීමක්. මීළඟ කිලෝමීටර් දෙදහසක රේඩියෝ සංඥා සම්ප්‍රේෂකයක් නොමැති වුවද, එවැනි සංඥාවක් ඔබම ජනනය කිරීම අපහසු නැත. Google Play හි "DCF77 Emulator" නමින් හැඳින්වෙන වැඩසටහනක් ඇත, එය හෙඩ්ෆෝන් වෙත සංඥා නිකුත් කරයි. කතුවරයාට අනුව, ඔබ ඔරලෝසුව වටා හෙඩ්ෆෝන් වල වයරය ඔතා ඇත්නම්, ඔවුන් සංඥාව ලබා ගනී (එය සිත්ගන්නා කරුණකි, මන්ද සාමාන්‍ය හෙඩ්ෆෝන් 77KHz සංඥාවක් නිපදවන්නේ නැත, නමුත් පිළිගැනීම බොහෝ විට හාර්මොනික්ස් නිසා විය හැකිය). ඇන්ඩ්‍රොයිඩ් 9 හි, වැඩසටහන මා වෙනුවෙන් කිසිසේත් ක්‍රියා කළේ නැත - හුදෙක් ශබ්දයක් නොතිබුණි (නැතහොත් මට එය ඇසුණේ නැත - එය 77KHz වේ, සියල්ලට පසු :)), නමුත් සමහර විට යමෙකුට වඩා හොඳ වාසනාවක් ලැබෙනු ඇත. කෙසේ වෙතත්, සමහරක්, තමන් විසින්ම සම්පූර්ණ DCF සංඥා උත්පාදකයක් බවට පත් කරයි, එය එකම Arduino හෝ ESP32 මත සෑදීමට පහසුය:

DCF77: කාල සංඥා පද්ධතිය ක්‍රියා කරන්නේ කෙසේද?
(මූලාශ්රය sgfantasytoys.wordpress.com/2015/05/13/synchronize-radio-controlled-watch-without-access)

නිගමනය

DCF පද්ධතිය ඇත්තෙන්ම තරමක් සරල සහ පහසු විය. සරල සහ ලාභ ලබන්නාගේ උපකාරයෙන්, ඔබට සෑම විටම සහ සෑම තැනකම නිශ්චිත වේලාවක් ලබා ගත හැකිය, ඇත්ත වශයෙන්ම පිළිගැනීමේ ප්රදේශයේ. පුළුල් ඩිජිටල්කරණය සහ අන්තර්ජාලයේ දේවල් තිබියදීත්, එවැනි සරල විසඳුම් දිගු කාලයක් සඳහා ඉල්ලුමක් පවතින බව පෙනේ.

මූලාශ්රය: www.habr.com

අදහස් එක් කරන්න