ืฉืืื ืืืจ.
ืื ืจืื ืฉืจืืื ืฉืจืืืฉืื ืฉืขืื ืื ืชืื ืช ืืื ืืืืืจ ืจืื ืืช ืืืืื ืฉื ืฉืขืื ืืืืงืจ ืจืืื ืื ืืคืืื ืฉืขืื ืืืืื ืขื ืืืจืืื. ืื ืืืื ื ืื, ืื ืืชื ืจืง ืฆืจืื ืืฉืื ืืช ืืฉืขืื ืขื ืืฉืืืื, ืืืืืจ ืืื ืื ืืื ืืชืืื ืืืืืืืืช ืืฉืขื ืืืืืืงืช.
ืืืื ืืืืื ืืื ืื ืขืืื ืื ืืชืื ืืคืขื ื ืืคืืืชืื.
ืืฉื ื ืืขืจืืืช ืฉืื ืืช ืืกื ืืจืื ืืื. ืืคืืคืืืจืืช ืืืืชืจ ืืืืจืืคื ืืื ืืฉืืื ืืืจืื ืืช
ืื ืื ืฉื ืืชื ืืืื ืืืื ืขื DCF77.
ืงืืืืช ืืืช
DCF77 ืืื ืชืื ืช ืืืื ืืจืืืื ืืคืืขืืช ืืชืืจ ืฉื 77.5 ืงืืื-ืืจืฅ ืืืฉืืจืช ืืืชืืช ืืืคื ืื ืืฉืจืขืช. ืชืื ืช ื-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.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 ืืืฉืืื ืื ืืืืื ืขืฉื ืืืช ืืขืฆืื. ืชืืืจืช 10-20$ ืืืื ืชืืืื ืืงื ืืช ืืืืื ืื ืื ื ืืืื ืขื ืืงืื ืืืื ืืืฆืืืช TTL, ืฉื ืืชื ืืืืจ ื- Arduino ืื ืืงืจ ืืืจ.
ืืืจ ื ืืชื ืขืืืจ Arduino
ืื ืฉืจืืฆื ืืืื ืืคืืื ืืฉืืจื ืืช ืืฉืขืื ืฉื ืกืืชื ืืืฉื ืขื ืืื ืืชืงื ืช ืื ืื ืื ืืืฉ ืขื ืกื ืืจืื ืจืืื:
ืืชื ืืืื ืืืฆืื ืืื ื-ebay ืืืืฆืขืืช ืืืืืช ืืืคืชื "ืชื ืืขื ืืืืงืจืช ืจืืื".
ืืืืกืืฃ, ืคืจืืฆืช ืืืื ืืื ืฉืงืจื ืขื ืืื. ืื ืื ืืื ืืฉืืจ ืืืช ืจืืื ืืื ืืืืคื ืืง"ื ืืงืจืืืื, ืื ืงืฉื ืืืืฆืจ ืืืช ืืื ืืขืฆืื. ืืฉ ืชืืื ืืช ื-Google Play ืืฉื "DCF77 Emulator" ืฉืืืฆืืื ืืช ืืืืช ืืืืื ืืืช. ืืืืจื ืืืืืจ, ืื ืชืืจืื ืืช ืืืื ืฉื ืืืืื ืืืช ืกืืื ืืฉืขืื, ืื ืืงืืืื ืืช ืืืืช (ืืขื ืืื ืืื, ืื ืืืื ืืืช ืจืืืืืช ืื ืืคืืงื ืืืช ืฉื 77KHz, ืืื ืืงืืืื ืืื ืื ืจืื ืืืื ืืจืืื ืืืช). ืืื ืืจืืืื 9, ืืชืืื ืืช ืื ืขืืื ืืืื ืืฉืืืื - ืคืฉืื ืื ืืื ืฆืืื (ืื ืืืื ืื ืฉืืขืชื ืืืชื - ืืืจื ืืื ืื 77KHz:), ืืื ืืืื ืืืืฉืื ืืืื ืืืชืจ ืืื. ืขื ืืืช, ืืืงื ืืืืฆืจืื ืืช ืขืฆืื ืืืืื ืืืชืืช DCF ืื ืืื ืืื, ืฉืงื ืืขืฉืืช ืืืชื ืืืืชื Arduino ืื ESP32:
(ืึธืงืึนืจ
ืืกืงื ื
ืืขืจืืช DCF ืืชืืืชื ืืคืฉืืื ืื ืืื ืืืื. ืืขืืจืช ืืงืื ืคืฉืื ืืืื ืชืืืื ืืงืื ืืช ืืฉืขื ืืืืืืงืช ืชืืื ืืืื ืืงืื, ืืืืื ืืืืืจ ืืงืืื. ื ืจืื ืฉืื ืืืจืืช ืืืืืืืืืืฆืื ืื ืจืืืช ืืืืื ืืจื ื ืฉื ืืืืจืื, ืคืชืจืื ืืช ืคืฉืืืื ืืืื ืืืื ืืืืงืฉืื ืืืืจื ืืื.
ืืงืืจ: www.habr.com