áááºá¹ááá¬áá« Habrá
áá¬áá® ááá¯á·ááá¯áẠááá¯ážáá±áááá¬áááᯠáááºáá°áá° á¡áá»á¬ážá¡ááŒá¬ážááẠáá¯ááºááá¯ážááŸá¯ááœáẠáá±áá®ááᯠááááºážáá»á¯ááºáá¬ážáá±á¬ áá¬áá® ááá¯á·ááá¯áẠá¡áá¯ááŒá°áá¬áá®ááá¯ááá¯ááá¯ááẠááŒááºáá°ážááŒáá±áááºá áá«á á¡áááºážá¡áááºááŒá±áááºá ââáá¬ááá¯á·áá²ááá¯áá±á¬á· áááºá áá¬áá®ááᯠá
á¬ážááœá²áá±á«áºáááºááá¯á·áá²ááá¯ááŒá®áž ááá¡ááŒá¬ááŸá¬áá±á¬á· á¡áá»áááºá¡ááá¡áá»ááᯠá¡ááá¯á¡áá»á±á¬ááºáá»áááºááŸááá±ážáá«áááá·áºáááºá
áááºážááẠáááºááá¯á·á¡áá¯ááºáá¯ááºáááºááᯠá¡ááŒá±ááŸá¬ááŒá®áž Python ááœáẠáá¯ááºáá«áá
áºáá¯ááᯠáá±ážááá¯ááºááŒáá«á
áá¯á·á
ááá°áá®áá±á¬ á¡áá»áááºáááºáá°ááŒá¯ááŒááºážá
áá
áºáá»á¬áž ááŸááá«áááºá á¥áá±á¬áááœáẠá¡áá»á±á¬áºááŒá¬ážáá¯á¶ážááŸá¬ áá»á¬áááºá
áá
áºááŒá
áºáááºá
á¡á±á¬ááºááœááºáá±ážáá¬ážáá±á¬á¡á¬ážáá¯á¶ážááẠDCF77 á¡ááŒá±á¬ááºážááŒá áºáááºá
á¡áá»ááºááŒáááºáá¶ááŒááºážá
DCF77 ááẠ77.5 kHz ááŒáááºááŸá¯ááºážááŒáá·áº áá¯ááºáá±á¬ááºáá±áá±á¬ ááŸááºáá»á¬ážáá±á¬ááŸáá¯ááºážáá°áá¬áá¯á¶áá
áºáá¯ááŒá
áºááŒá®áž amplitude modulation ááœáẠá¡áá»ááºááŒááŸá¯áá»á¬ážááᯠáá¯ááºááœáŸáá·áºáááºá 50KW áá°áá¬ááẠFrankfurt á០25 áá®ááá¯áá®áá¬á¡ááœá¬ááœááºáááºááŸáááŒá®áž áááºážááẠ1959 áá¯ááŸá
áºááœááºá
áááºáááºáááºáá²á·ááŒá®áž 1973 áá¯ááŸá
áºááœááºáááºá
áœá²á¡áá»ááºá¡áááºáá»á¬ážááá¯á¡áá»áááºá¡ááá¡áá»ááœááºááá·áºááœááºážáá²á·áááºá ááŸáá¯ááºážá¡áá»á¬áž 77 KHz ááŸááá±á¬ ááŸáá¯ááºážá¡áá»á¬ážááẠá¡ááœááºááŸááºáááºá ááá¯á·ááŒá±á¬áá·áº á¡ááºáááºáá¬á¡ááœááºá á¡ááá¯ááºážá¡áá¬ááẠá¡ááœááºááá·áºáá»á±á¬áºááẠ(Wikipedia á០áá¬ááºáá¯á¶)á
ááá¯áá²á·ááá¯á·áá±á¬ á¡ááºáááºáá¬ááŸáá·áº áá«áá«ááá·áºááœááºážááŸá¯ááá¯á·ááŒáá·áº á§áá·áºáá¶á§áááá¬ááẠá¥áá±á¬áá áá®áá¬áá¯á
áºá áá°áááááºážááŸáá·áº áá¯ááŸá¬ážááá¯ááºáá¶á áá
áºá
áááºáá
áºááá¯ááºážá¡á¬ážáá¯á¶ážáá®ážáá«ážááᯠááœáŸááºážááŒá¯á¶áá¬ážáááºá
áááºáá°áááᯠá¡áá»ááºááŒááŸá¯ááᯠááŸááºáááºážáááºááá¯ááºáááºá áá«ááá¯áá¯ááºááá¯á·á á¡áœááºááá¯ááºážáááºáá¶áá°áá¶ááœá¬ážáá«á
á¡á²áá®ááŸá¬ áá±á«ááºážáá¯ááºááá¯ááºááᯠááŸáááºááŒá®áž á¡ááá¯ááºážáá
áºááá¯ááºážááᯠáááá
áºáá»á¬ážá
áœá¬ááŒá¬á¡á±á¬áẠááŸááºáááºážáááºáá«áááºá áá¯ááºáá«áááºá ááá·áºááŸá¬ 77.5KHz ááŒáááºááŸá¯ááºážááᯠááŸááºáááºážáááºááá¯ááºáá²á· âá¡á
á
áºá¡ááŸááºâ áááºáá¶áá°ááŸááááºááá¯ááẠá¡á²áá«ááᯠáááºáá¯á¶ážááá¯ááºáá«áááºá
áá¯ááºáá«áááºá á¡ááºáá¬áááºááŸáá áºááá·áº áá±áá®ááá¯á¡áá»áááºá¡áá»ááºááŒááŸá¯áá»á¬ážááᯠáááºáá¶áááŸáááŒááºážááŒáá·áº áá»áœááºá¯ááºááá¯á·ááẠá¡ááŸááºááááºáááá»áá±á¬á¡áá»áááºááᯠáááŸááááá·áºáááºááá¯ááºáá« - á¡áá»ááºááŒááŸá¯ááᯠááŸá±á¬áá·áºááŸá±ážá áœá¬ááŒáá·áº áá¯ááºááœáŸáá·áºáá«áááºá ááá¯á·áá±á¬áºáá»áœááºá¯ááºááá¯á·ááááºážááá¯ááºááŸá¬ signal áááœá²á·á ááºážáá¯á¶ááá¯áá¬ážáááºáááºáá¬ááŒá áºáááºá ááá¯á·ááŒá±á¬áá·áºá¡ááºáá¬áááºááŸááºáááºážáááºááŒááºážáááºáá¯á¶áá±á¬ááºáááºáááºááá¯ááá¯áááºá áááºááœá±á·ááááœááºá áááºáá¶ááŒááºážááŸáá·áº á¡áá¶ááŸááºááŒááºážá¡ááœáẠá¡áá°ážááŒá¯á ááºáá á¹á ááºážáá»á¬ážááᯠá¡áá¯á¶ážááŒá¯ááŒáááºá áááºážááá¯á·ááᯠá¡á±á¬ááºááœáẠááœá±ážááœá±ážáá«áááºá
áá®áá±á¬á· á¡áá¶ááœááºážáá¬ááᯠáááºáá¶áááŸáááŒá®á á¡á²áá«ááᯠá áááºáá¯ááºáá±á¬ááºááá¯ááºááŒáá¡á±á¬ááºá
Signal Decoding
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 ááᯠáá»áœááºá¯ááºááá¯á·ááŒááºááááº-
á
áá¬ážááŸááºááᯠááá¯ážááŸááºážá
á±áááºá Hilbert á¡ááœááºááŒá±á¬ááºážááᯠá¡áá¯á¶ážááŒá¯á á¡áá»ááºááŒá
á¬á¡áááºááᯠáá°ááŒáá«á
áá¯á·á
analytic_signal = signal.hilbert(data)
A = np.abs(analytic_signal)
plt.plot(A[:100000])
áá»á²á·áá¬ážáá±á¬ááááº-
low-pass filter ááᯠá¡áá¯á¶ážááŒá¯á áá°áá¶áá¶áá¯ááºááœáŸááºááŸá¯áá»á¬ážááᯠáá»á±á¬ááœá±á·á
áœá¬ áááºááŸá¬ážááŒá®áž áá
áºáá»áááºáááºážááœáẠááœá²ááŒááºážá
áááºááŒá¬ááŸá¯á¡ááœáẠáá±á¬ááºááá¯ááºážááœáẠá¡áá¯á¶ážáááºááá·áº áá»ááºážáá»áŸáááºááá¯ážááᯠááœááºáá»ááºááŒáá«á
áá¯á·á
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
áááẠ(á¡áá«áá±á¬ááºáá»ááºáž)- ááœá²ááŒááºážá
áááºááŒá¬ááẠá¡ááœááºááœááºáá°áá±á¬ á
áá¯áááºážááŸáá¯ááºážáá®ážáá«ážáá
áºáá¯á
ááá¯ááºážááŒá¬ážááŒááºážá
ááááŠážá
áœá¬ááẠbit sequence ááá¯ááá°áááºááá¯á¡ááºáááºá á¡áá»ááºááŒááœá²á·á
ááºážáá¯á¶ááá¯ááºááá¯ááºá á¡ááœááºááá¯ážááŸááºážáá«áááºá
áá²áá»áá¯ážá
á¯á¶ááᯠáá¯áááááŒá¬ážáá¬áá¡ááŒá
Ạááá¯ááºážááŒá¬ážáá¬ážáááºá áá²áá»áá¯ážá
á¯á¶ááŒá¬ážá¡ááœá¬á¡áá±ážááẠ0.1s (ááá¯ááá¯áááºááŸá¬ ááœá±ážáá¯ááºááŸá¯ááºážáá¡ááŸááºááŸá¬ 0.9s) ááŒá
áºáá«áá á¡ááœá¬á¡áá±ážááẠ0s (ááá¯ááá¯áááºááŸá¬ á¡áá»á¬ážááẠ0.2s) ááŒá
áºáá»áŸáẠâ0.8â ááᯠááá·áºáá«á áááá
áºááá¯ááºážáá¡áá¯á¶ážááᯠ"ááŸááº" ááœá±ážáá¯ááºááŸá¯ááºážá 1 á
áá¹ááá·áºááŒá¬á áá
áºá¡á
á®á¡á
á¥áºááẠáá¯áááá¯á· ááŒááºáááºáááºááŸááºáá¬ážááŒá®áž ááŒáá·áºááœááºážááŸá¯ áááºáá¶á
áááºáááºá
á¡áááºáá«á¡áá»ááºááẠ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
ááááºá¡áá±ááŒáá·áºá áá»áœááºá¯ááºááá¯á·ááẠbits á sequence ááá¯áááŸááááºá áá»áœááºá¯ááºááá¯á·áá¥ááá¬ááœáẠááŸá áºá áá¹ááá·áºááŒá¬ááẠá€áá²á·ááá¯á·ááŒá áºáá±áááº-
0011110110111000001011000001010000100110010101100010011000
0001111100110110001010100001010000100110010101100010011000
á
áá¬ážáá
ááºá á¡áá»ááºááŒááœáẠáá±áᬠ"áá¯áááá¡ááœáŸá¬" áááºáž áá«áááºáááºááŸá¬ á
áááºáááºá
á¬ážá
áá¬áá±á¬ááºážáá«áááºá bit sequence ááᯠá¡áá¯á¶ážááŒá¯ááááºáž áá¯ááºáá¯ááºáá¬ážáá«áááºá
áá»áœááºá¯ááºááá¯á·ááá±á¬ááºáá¯á¶ážá¡ááá·áº- á¡ááŸááºááááºáá±áá¬ááá°ááŒááºážá áá
áºáá»á¬ážááᯠáá
áºá
áá¹ááá·áºáá»áŸáẠáá
áºááŒááẠááá¯á·ááœáŸááºáááºá ááá¯á·ááŒá±á¬áá·áº áá»áœááºá¯ááºááá¯á·ááœáẠá¡áá»ááºá¡áááºáá»á¬ážá
áœá¬ááᯠáá¯ááºááŸááºáá¬ážáá±á¬ á
á¯á
á¯áá±á«ááºáž 59 bits ááŸááááºá
á¡ááá¯ááºážáá»á¬ážááᯠáá±á¬áºááŒáá¬ážáá«áááºá
ááá¯ááºááá¯ááºá
ááºážáááºááá¯áá°áá»á¬ážá¡ááœááºá áá¯ááºáá¯ááºááᯠspoiler á¡á±á¬ááºááœááºáá±ážáá¬ážáááºá
á¡áááºážá¡ááŒá
áº
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)
áááá¯ááááºááᯠrun áá±á¬á¡áá«ááœááºá á€áá²á·ááá¯á·áá±á¬ output ááá¯ááœá±á·áááá·áºáááºá
0011110110111000001011000001010000100110010101100010011000
Tuesday, 26.03.19, 21:41
0001111100110110001010100001010000100110010101100010011000
Tuesday, 26.03.19, 21:42
á¡ááŸááºáá±á¬á· áá«ááœá±á¡á¬ážáá¯á¶ážá ááŸá±á¬áºááá¬áá²á ááá¯á áá áºá á¡á¬ážáá¬áá»ááºááŸá¬ áá¯ááºááœá²ááŒááºážááẠá¡ááœááºááá¯ážááŸááºážááŒá®áž á¡ááá¯ážááŸááºážáá¯á¶áž ááá¯ááºáááá¯ááœááºáááá¯áá¬ááá¯ááẠáááºááá·áºáá±áá¬ááœááºáááᯠáá¯ááºáá±á¬ááºááá¯ááºááẠá áá»áœááºá¯ááºááá¯á·ááẠáá²áá»áá¯ážá á¯á¶áá¡ááŸááºááᯠááá¯ážááá¯ážááŸááºážááŸááºážáá±ááœááºááŒá®áž 60 bits á á¯áá±á¬ááºážáᬠáááá áºááá¯ááºážáá¡áá¯á¶ážááœáẠá¡áá»áááºá¡ááá¡áá»ááá¯áááŸááááºá á¡áá»áááºáááºáá°ááŒá¯ááŒááºážá á¡ááŒá¬ážáááºážáááºážáá»á¬ážááŸáá·áº ááŸáá¯ááºážááŸááºáá«á (á¥ááᬠGPSá ááá¯á·ááá¯áẠá¡ááºáá¬áááºááᯠáá¯áá¬ážáááẠáá¬ážááŒá áºáá¬ážáá«áááº-)á ááá¯áá²á·ááá¯á·áá±á¬ áá±áá®ááᯠáááºáá°ááŒá¯ááŒááºážá¡ááœáẠáá»áŸááºá á áºáá¬ááºá¡á¬áž áá¯á¶ážááá®ážáá«áž ááá¯á¡ááºááẠ- á¥ááá¬á áá¯á¶ááŸáẠá¡áááºáá¯á¶áž ááá¯ážáá±áááá¬ááá áºáá¯ááẠAA áááºááá® á áá¯á¶ážááŒáá·áº áá áºááŸá áºááá·áº á¡áá¯ááºáá¯ááºáá«áááºá ááá¯á·ááŒá±á¬áá·áº áááºáááºáá¬áá®áá»á¬ážáááºáá»áŸáẠáá¶áá¶áá¬áá®áá»á¬áž ááá¯á·ááá¯áẠáááºážáá±ážáá°áá¬áá¯á¶áá¬áá®áá»á¬ážááᯠáá±á¬áºááŒááŒááºážáááŒá¯áá² áá±áá®ááá¯áá áºáááºáááºážááŒá áºá¡á±á¬ááºááŒá¯áá¯ááºáá¬ážáááºá
DCF á á¡áááºááŒá±ááŸá¯ááŸáá·áº ááá¯ážááŸááºážááŸá¯ááẠDIY áá«ááá¬á¡áá¯ážáá»á¬ážááᯠááœá²áá±á¬ááºáá«áááºá $10-20 ááŒáá·áº Arduino ááá¯á·ááá¯áẠá¡ááŒá¬ážáá±á¬ controller ááŸáá·áº áá»áááºáááºááá¯ááºááá·áº á¡áááºááá·áºáá¯ááºáá¬ážáá±á¬ receiver ááŸáá·áº TTL output áá«ááŸááá±á¬ á¡áááºááá·áºáá¯ááºáá¬ážáá±á¬ á¡ááºáááºáᬠmodule ááᯠáááºáááºááá¯ááºáááºá
Arduino á¡ááœáẠáá±ážáá¬ážááŒá®ážáá¬ážáá«á
ááá¹áááŸááá°áá»á¬ážááẠáá±áá®ááá¯ááᯠáááºáá°ááŒá¯ááŒááºážááŒáá·áº ááá¹ááá¬ážá¡áá áºááᯠááá·áºááœááºážááŒááºážááŒáá·áº áááºážááá¯á·á á¡ááœá¬ážáá¬áá®áá±á¬ááºážááá¯ááẠá¡ááá·áºááŒáŸáá·áºááá¯ááºáááº-
áá±á¬á·áá»ááºá
áá¬ážáá¯á¶áž âáá±áá®ááᯠááááºážáá»á¯ááºáá¬ážáá±á¬ ááŸá¯ááºááŸá¬ážááŸá¯â ááᯠá¡áá¯á¶ážááŒá¯á ebay ááœáẠáá
áºáᯠááœá±á·ááŸáááá¯ááºáááºá
áá±á¬ááºáá¯á¶ážá¡áá±áá²á· áá®á¡áááááºáá°ážáá²á·áá°ááœá±á¡ááœáẠlife hack áá«á áá±á¬ááºáá®ááá¯áá®áá¬ááŸá áºáá±á¬ááºáá»á±á¬áºááœáẠáá±áá®ááá¯á¡áá»ááºááŒáá¯ááºááœáŸáá·áºááŸá¯áá áºáá¯ááŸáááŸááá±á¬áºáááºážá ááá¯ááá¯á·áá±á¬á¡áá»ááºááŒááŸá¯ááᯠáááºááá¯ááºááá¯ááºáá¯ááºáá¯ááºááẠááááºáá²áá«á Google Play ááœáẠâDCF77 Emulatorâ áá¯áá±á«áºáá±á¬ áááá¯ááááºáá áºáá¯ááẠáá¬ážááŒááºáá»á¬ážááá¯á· á¡áá»ááºááŒááŸá¯ááᯠáá¯ááºáá±ážáááºá á á¬áá±ážááá¬áá¡ááá¯á¡áá áááºááẠáá¬áá®áááºáááºáááºááœáẠáá¬ážááŒááºááŒáá¯ážáá»á¬ážááᯠáááºáá¬ážáá»áŸáẠáááºážááá¯á·ááẠá¡áá»ááºááŒááŸá¯ááᯠáá±á¬ááºáá°áááá·áºááẠ(á áááºáááºá á¬ážá áá¬áá±á¬ááºážáááºááŸá¬á áá¬áááºáá¬ážááŒááºáá»á¬ážááẠ77KHz á¡áá»ááºááŒááŸá¯ááᯠááá¯ááºáá±ážááá¯ááºáá±á¬áºáááºáž áááºáá¶áááŸáááŸá¯ááẠáá¬ááá¯áá®ááŒá±á¬áá·áº ááŒá áºááá¯ááºáááº)á Android 9 ááœááºá áááá¯ááááºááẠáá»áœááºá¯ááºá¡ááœáẠáá¯á¶ážáá¡áá¯ááºááá¯ááºáá« - á¡áá¶áááŸááá« (áá«ááŸááá¯áẠáá»áœááºáá±á¬áº áááŒá¬ážááá¯ááºááá« - 77KHz ááŒá áºáá«áááºá ááŒá®ážáá±á¬áẠ:)á ááá¯á·áá±á¬áº áá áºá á¯á¶áá áºáŠážááẠáá¶áá±á¬ááºážááŒááºážááŸááá±áááºá ááá¯á·áá±á¬áº á¡áá»áá¯á·á áááºážááá¯á·ááᯠArduino ááá¯á·ááá¯áẠESP32 ááœááºááŒá¯áá¯ááºááẠááœááºáá°ááá·áº ááŒáá·áºá á¯á¶áá±á¬ DCF á¡áá»ááºááŒáá®ážá ááºáá áºáá¯á¡ááŒá ẠááŒá¯áá¯ááºááŒáááºá
(áááºážááŒá
áº
áá±á¬ááºáá»ááº
DCF á
áá
áºááẠááááºááᯠááá¯ážááŸááºážááŒá®áž á¡áááºááŒá±ááœá¬ážáá«áááºá ááá¯ážááŸááºážááŒá®áž á
á»á±ážáááºáááºáá¬áá¬ááŒáá·áº áááºáá¶áá°áá¡áá°á¡áá®ááŒáá·áºá á§áá·áºáá¶á§áááá¬ááœáẠá¡ááŒá²áááºážááŸáá·áº áá±áá¬ááá¯ááºážááœáẠá¡áá»áááºá¡ááá¡áá»áááá¯ááºáááºá áá
áºáá»á
áºáááºá¡ááœááºáá°ážááŒá±á¬ááºážááŸá¯ááŸáá·áº Internet of Things ááœááºáá»ááºáá±áá±á¬áºáááºážá ááá¯áá²á·ááá¯á·áá±á¬ááá¯ážááŸááºážáá±á¬ááŒá±ááŸááºážáááºážáá»á¬ážááẠá¡áá»áááºááŒá¬ááŒáá·áºá
áœá¬ áá±á¬ááºážááá¯áá±áááá·áºáááºáááºáááºá
source: www.habr.com