ሰላም ሀብር።
ምናልባትም የእጅ ሰዓት ወይም የአየር ሁኔታ ጣቢያ የሚገዙ ብዙዎች የሬዲዮ ቁጥጥር የተደረገበት ሰዓት ወይም የአቶሚክ ሰዓት አርማ በማሸጊያው ላይ አይተዋል። ይህ በጣም ምቹ ነው, ምክንያቱም ሰዓቱን በጠረጴዛው ላይ ማስቀመጥ ብቻ ያስፈልግዎታል, እና ከጥቂት ጊዜ በኋላ ወዲያውኑ ከትክክለኛው ጊዜ ጋር ይስተካከላል.
እንዴት እንደሚሰራ እንወቅ እና በፓይዘን ውስጥ ዲኮደር እንፃፍ።
የተለያዩ የጊዜ ማመሳሰል ስርዓቶች አሉ። በአውሮፓ ውስጥ በጣም ታዋቂው የጀርመን ስርዓት ነው
ከዚህ በታች የተጻፈው ሁሉ ስለ DCF77 ይሆናል።
የምልክት መቀበያ
DCF77 በ 77.5 kHz ድግግሞሽ የሚሰራ እና በ amplitude modulation ውስጥ ምልክቶችን የሚያስተላልፍ ረጅም የሞገድ ጣቢያ ነው። የ 50KW ጣቢያ ከፍራንክፈርት 25 ኪሜ ርቀት ላይ ይገኛል ፣ በ 1959 ሥራ ጀመረ እና በ 1973 የቀን መረጃ በትክክለኛው ሰዓት ላይ ተጨምሯል። በ 77 kHz ድግግሞሽ ላይ ያለው የሞገድ ርዝመት በጣም ረጅም ነው ፣ ስለሆነም የአንቴና መስክ ልኬቶች እንዲሁ በጣም ጥሩ ናቸው (ፎቶ ከዊኪፔዲያ)
በእንደዚህ አይነት አንቴና እና የኃይል ግብአት, የእንግዳ መቀበያው ቦታ ሁሉንም አውሮፓ, ቤላሩስ, ዩክሬን እና የሩሲያ ክፍልን ይሸፍናል.
ማንኛውም ሰው ምልክት መቅዳት ይችላል። ይህንን ለማድረግ ወደ ኦንላይን መቀበያ ብቻ ይሂዱ
እዚያ የማውረጃ አዝራሩን ተጫንን እና ለብዙ ደቂቃዎች ርዝመት ያለውን ቁራጭ እንቀዳለን. እርግጥ ነው, የ 77.5 kHz ድግግሞሽ ለመቅዳት የሚችል "እውነተኛ" መቀበያ ካለዎት, ያንን መጠቀም ይችላሉ.
እርግጥ ነው, የሬዲዮ ጊዜ ምልክቶችን በበይነመረብ በኩል በመቀበል, በትክክል ትክክለኛ ጊዜ አንቀበልም - ምልክቱ በመዘግየቱ ይተላለፋል. ነገር ግን ግባችን የምልክት አወቃቀሩን መረዳት ብቻ ነው, ለዚህም የበይነመረብ ቀረጻ ከበቂ በላይ ነው. በእውነተኛ ህይወት ውስጥ, በእርግጥ, ልዩ መሳሪያዎች ለመቀበል እና ዲኮዲንግ ይጠቀማሉ, ከታች ይብራራሉ.
ስለዚህ ቀረጻውን ተቀብለናል፣ እሱን ማቀናበር እንጀምር።
የሲግናል ዲኮዲንግ
ፋይሉን 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()
የተለመደው የ amplitude modulation እናያለን፡-
መፍታትን ለማቃለል የሂልበርት ትራንስፎርምን በመጠቀም የሲግናል ፖስታውን እንውሰድ፡-
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 ዎች ከሆነ (ማለትም የ pulse ርዝመት ራሱ 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 ቢት እንሰበስባለን, እና በእያንዳንዱ ደቂቃ መጨረሻ ላይ ትክክለኛውን ሰዓት እናገኛለን. ከሌሎች የጊዜ ማመሳሰል ዘዴዎች (ጂፒኤስ ፣ ለምሳሌ ፣ ወይም እግዚአብሔር ይከለክላቸው ፣ በይነመረብ :) ጋር ሲነፃፀሩ እንዲህ ዓይነቱ የሬዲዮ ማመሳሰል ምንም ኤሌክትሪክ አያስፈልግም - ለምሳሌ ፣ መደበኛ የቤት የአየር ሁኔታ ጣቢያ በ 2 AA ባትሪዎች ለአንድ ዓመት ያህል ይሰራል። ስለዚህ, የእጅ ሰዓቶች እንኳን በሬዲዮ ማመሳሰል የተሰሩ ናቸው, በእርግጠኝነት, የግድግዳ ሰዓቶችን ወይም የመንገድ ጣቢያ ሰዓቶችን ሳይጠቅሱ.
የDCF ምቾት እና ቀላልነት እንዲሁ DIY አድናቂዎችን ይስባል። ከ10-20 ዶላር ብቻ ዝግጁ የሆነ አንቴና ሞጁል ከተሰራ መቀበያ እና የቲቲኤል ውፅዓት ጋር መግዛት ይችላሉ ይህም ከአርዱዪኖ ወይም ከሌላ መቆጣጠሪያ ጋር ሊገናኝ ይችላል።
ለ Arduino አስቀድሞ ተጽፏል
የሚፈልጉ ሁሉ በሬዲዮ ማመሳሰል አዲስ ዘዴን በመትከል የድሮውን የሴት አያታቸውን ሰዓት ማሻሻል ይችላሉ።
“በራዲዮ ቁጥጥር የሚደረግበት እንቅስቃሴ” የሚለውን ቁልፍ ቃላት በመጠቀም በኢቤይ ላይ ማግኘት ይችላሉ።
እና በመጨረሻም፣ ይህን እስካሁን ላነበቡት የህይወት ጠለፋ። በሚቀጥሉት ሁለት ሺህ ኪ.ሜ ውስጥ አንድ የሬዲዮ ምልክት አስተላላፊ ባይኖርም, እንደዚህ አይነት ምልክት እራስዎ ማመንጨት አስቸጋሪ አይደለም. በጎግል ፕሌይ ላይ “DCF77 Emulator” የሚባል ፕሮግራም አለ ይህም ምልክቱን ወደ የጆሮ ማዳመጫዎች የሚያወጣ ነው። እንደ ደራሲው ከሆነ የጆሮ ማዳመጫውን ሽቦ በሰዓቱ ላይ ካጠመዱ ምልክቱን ያነሳሉ (በጣም አስደሳች ነው ፣ ምክንያቱም ተራ የጆሮ ማዳመጫዎች የ 77 kHz ምልክት አይሰጡም ፣ ግን መቀበያው ምናልባት በሃርሞኒክስ ምክንያት ነው)። በ Android 9 ላይ ፣ ፕሮግራሙ ለእኔ ምንም አልሰራም - በቀላሉ ምንም ድምጽ አልነበረም (ወይም ምናልባት አልሰማሁትም - 77 ኪኸ ነው ፣ ከሁሉም በኋላ :) ፣ ግን ምናልባት አንድ ሰው የተሻለ ዕድል ሊኖረው ይችላል። ይሁን እንጂ አንዳንዶች በተመሳሳይ Arduino ወይም ESP32 ላይ ለመሥራት ቀላል የሆነ ሙሉ የዲሲኤፍ ሲግናል ጀነሬተር ያደርጋሉ።
(ምንጭ
መደምደሚያ
የዲሲኤፍ ስርዓት በጣም ቀላል እና ምቹ ሆኖ ተገኝቷል። በቀላል እና በርካሽ መቀበያ በመታገዝ ትክክለኛውን ጊዜ ሁል ጊዜ እና በሁሉም ቦታ ማግኘት ይችላሉ ፣ በእርግጥ በእንግዳ መቀበያው ውስጥ። ምንም እንኳን የተስፋፋው ዲጂታላይዜሽን እና የነገሮች በይነመረብ ቢሆንም እንኳን እንደዚህ ያሉ ቀላል መፍትሄዎች ለረጅም ጊዜ የሚፈለጉ ይመስላል።
ምንጭ: hab.com