ืืขืื ืืืืจ.
ืืืกืืึธืืข ืคืืืข ืืืืก ืงืืืคื ืึท ืืืึทื ืึธืืขืจ ืืืขืืขืจ ืกืืึทื ืฆืืข ืืึธืื ืืขืืขื ืื ืจืึทืืืึธ ืงืึทื ืืจืึธืืื ืืืืืขืจ ืึธืืขืจ ืืคืืื ืึทืืึธืืืฉืข ืืืืืขืจ ืืึธืืึธ ืืืืฃ ืื ืคึผืึทืงืงืึทืืื ื. ืืึธืก ืืื ืืืืขืจ ืืึทืงืืืขื, ืืืืึทื ืืืจ ื ืึธืจ ืืึทืจืคึฟื ืฆื ืฉืืขืื ืื ืืืืืขืจ ืืืืฃ ืื ืืืฉ, ืืื ื ืึธื ืึท ืืฉืขืช ืขืก ืืืขื ืืืืืึธืืึทืืืฉ ืกืืจืืืขืจื ืฆื ืื ืคึผืื ืืืขื ืฆืืื.
ืืื ืก ืคืืืืจ ืืืืก ืืื ืขืก ืึทืจืืขื ืืื ืฉืจืืึทืื ืึท ืืืงืึธืืืขืจ ืืื ืคึผืืืืึธื.
ืขืก ืืขื ืขื ืคืึทืจืฉืืืขื ืข ืฆืืื ืกืื ืืงืจืึทื ืึทืืืืฉืึทื ืกืืกืืขืืขื. ืื ืืขืจืกื ืคืึธืืงืก ืืื ืืืืจืึธืคึผืข ืืื ืื ืืืึทืืฉ ืกืืกืืขื
ืึทืืฅ ืืขืฉืจืืื ืืื ืื ืืืขื ืืืื ืืืขืื ืื 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()
ืืืจ ืืขื ืืืคึผืืฉ ืึทืืคึผืืืืื ืืึทืืืฉืึทืืืืฉืึทื:
ืฆื ืคืึทืจืคึผืึธืฉืขืืขืจื ืืืงืึธืืืื ื, ืืึธืื ืืื ืื ื ืขืืขื ืื ืกืืื ืึทื ืงืึธื ืืืขืจื ืืื ืื Hilbert ืืืขืจืืึทืื:
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 ืืืื, ืืื ืืื ืื ืกืืฃ ืคืื ืืขืืขืจ ืืื ืื ืืืจ ืืึทืงืืืขื ืื ืคึผืื ืืืขื ืฆืืื. ืืื ืคืืจืืืืื ืฆื ืื ืืขืจืข ืืขืืืื ืคืื ืฆืืื ืกืื ืืงืจืึทื ืึทืืืืฉืึทื (ืืคึผืก, ืืืฉื, ืึธืืขืจ ืืืืื, ืื ืืื ืืขืจื ืขื:), ืึทืืึท ืจืึทืืืึธ ืกืื ืืงืจืึทื ืึทืืืืฉืึทื ืจืืงืืืืืขืจื ืึผืืขื ืงืืื ืขืืขืงืืจืข - ืืืฉื, ืึท ืจืขืืืืขืจ ืืืื ืืืขืืขืจ ืกืืึทื ืฆืืข ืืืืคื ืคึฟืึทืจ ืืืขืื ืึท ืืึธืจ ืืืืฃ 2 ืึทืึท ืืึทืืขืจืื. ืืขืจืืืขืจ, ืืคืืื ืืืจืืกืืืืึทืืฉืื ืืขื ืขื ืืขืืืื ืืื ืจืึทืืืึธ ืกืื ืืงืจืึทื ืึทืืืืฉืึทื, ื ืื ืฆื ืืขืจืืึธื ืขื, ืคืื ืงืืจืก, ืืืึทื ื ืืืึทืืฉืื ืึธืืขืจ ืืึทืก ืกืืึทื ืฆืืข ืืืึทืืฉืื.
ืื ืงืึทื ืืืื ืืึทื ืก ืืื ืคึผืึทืฉืืขืก ืคืื DCF ืืืื ืฆืืฆืืขื ืืื ืขื ืืืืืึทืกืฅ. ืคึฟืึทืจ ืืืืื $ 10-20 ืืืจ ืงืขื ืขื ืงืืืคื ืึท ืคืึทืจืืืง ืึทื ืืขื ืข ืืึธืืืืข ืืื ืึท ืคืึทืจืืืง ืืคื ืขืืขืจ ืืื TTL ืจืขืืืืืึทื, ืืืึธืก ืงืขื ืขื ืืืื ืงืึธื ื ืขืงืืขื ืฆื ืึทื Arduino ืึธืืขืจ ืื ืืขืจืข ืงืึธื ืืจืึธืืืขืจ.
ืฉืืื ืืขืฉืจืืื ืคึฟืึทืจ Arduino
ืื ืืืืก ืืืืื ืงืขื ืขื ืืคืืื ืึทืคึผืืจืืื ืืืืขืจ ืึทืื ืืึธืืข ืก ืืืึทื ืืืจื ืื ืกืืึธืืื ื ืึท ื ืืึทืข ืืขืงืึทื ืืืึทื ืืื ืจืึทืืืึธ ืกืื ืืงืจืึทื ืึทืืืืฉืึทื:
ืืืจ ืงืขื ืขื ืืขืคึฟืื ืขื ืืืื ืขืจ ืืืืฃ ืขืืืึท ื ืืฆื ืื ืืขืจืืื ืขื "ืจืึทืืืึธ ืงืึทื ืืจืึธืืื ืืึทืืืขืืื ื".
ืืื ืืขืกืึธืฃ, ืึท ืืขืื ืืึทืง ืคึฟืึทืจ ืื ืืืืก ืืึธืื ืืืืขื ืขื ืึทืืื ืืืืึทื. ืืคืืื ืืืื ืขืก ืืื ื ืืฉื ืึท ืืืื ืจืึทืืืึธ ืกืืื ืึทื ืืจืึทื ืกืืืืขืจ ืืื ืื ืืืืึทืืขืจ ืคึผืึธืจ ืคืื ืืืืื ื ืงืืืืืขืืขืจ, ืขืก ืืื ื ืืฉื ืฉืืืขืจ ืฆื ืืืฉืขื ืขืจืืื ืึทืืึท ืึท ืกืืื ืึทื ืืื. ืขืก ืืื ืึท ืคึผืจืึธืืจืึทื ืืืืฃ Google ืคึผืืืึท ืืขืจืืคึฟื "DCF77 ืขืืืืึทืืึธืจ" ืืืึธืก ืึทืืืคึผืืฅ ืื ืกืืื ืึทื ืฆื ืืขืืคืึธืื ื. ืืืื ืืขืจ ืืืืจ, ืืืื ืืืจ ืืึทื ืืืืงืืขื ืื ืืจืึธื ืคืื ืื ืืขืืคืึธืื ื ืึทืจืื ืื ืืืึทื, ืืื ืืืขืื ืืึทืคึผื ืืขื ืกืืื ืึทื (ืขืก ืืื ืืฉืืงืึทืืืข ืืื, ืืืืึทื ืคึผืจืึธืกื ืืขืืคืึธืื ื ืืืขื ื ืืฉื ืคึผืจืึธืืืฆืืจื ืึท 77 ืื ืกืืื ืึทื, ืึธืืขืจ ืืขืจ ืึธืคึผืืจืึธื ืืื ืืืกืืึธืืข ืจืขืื ืฆื ืืึทืจืืึธื ืืงืก). ืืืืฃ ืึทื ืืจืืื 9, ืื ืคึผืจืึธืืจืึทื ืืื ื ืืฉื ืึทืจืืขืื ืคึฟืึทืจ ืืืจ - ืขืก ืืื ืคืฉืื ืงืืื ืืขืืื ื (ืึธืืขืจ ืืคึฟืฉืจ ืืื ืืื ื ืืฉื ืืขืจื ืขืก - ืขืก ืืื 77 ืื, ื ืึธื ืึทืืข:), ืึธืืขืจ ืืคึฟืฉืจ ืขืืขืฆืขืจ ืืืขื ืืึธืื ืืขืกืขืจ ืืืืง. ืขืืืขืืข, ืึธืืขืจ, ืืึทืื ืืื ืึท ืคืื-ืคืืขืืืฉื DCF ืกืืื ืึทื ืืขื ืขืจืึทืืึธืจ, ืืืึธืก ืืื ืืจืื ื ืฆื ืืึทืื ืืืืฃ ืืขืจ ืืขืืืืงืขืจ Arduino ืึธืืขืจ ESP32:
(ืืงืืจ
ืกืึธืฃ
ืื DCF ืกืืกืืขื ืืื ืืขืืืขื ืืึทืงืข ืืึทื ืฅ ืคึผืฉืื ืืื ืืึทืงืืืขื. ืืื ืืขืจ ืืืืฃ ืคืื ืึท ืคึผืฉืื ืืื ืืืืืง ืืคื ืขืืขืจ, ืืืจ ืงืขื ืขื ืืึธืื ืื ืคึผืื ืืืขื ืฆืืื ืฉืืขื ืืืง ืืื ืืืืขืืื, ืคืื ืงืืจืก ืืื ืืขืจ ืึธืคึผืืจืึธื ืืขืื ื. ืขืก ืืืื ื ืึทื ืืคืืื ืืจืึธืฅ ืืืืืืกืคึผืจืขื ืืืืืืึทืืืืึทืืืึธื ืืื ืื ืืื ืืขืจื ืขื ืคืื ืืืื ืืก, ืึทืืึท ืคึผืฉืื ืกืึทืืืฉืึทื ื ืืืขื ืืืื ืืื ืคืึธืืขืจืื ื ืคึฟืึทืจ ืึท ืืึทื ื ืฆืืึทื.
ืืงืืจ: www.habr.com