ΠΠ΄ΡΠ°Π²ΠΎ Π₯Π°Π±Ρ.
ΠΠ΅ΡΠΎΡΠ°ΡΠ½ΠΎ ΠΌΠ½ΠΎΠ³ΡΠΌΠΈΠ½Π° ΠΊΠΎΠΈ ΠΊΡΠΏΡΠ²Π°Π°Ρ ΡΠ°ΡΠΎΠ²Π½ΠΈΠΊ ΠΈΠ»ΠΈ ΠΌΠ΅ΡΠ΅ΠΎΡΠΎΠ»ΠΎΡΠΊΠ° ΡΡΠ°Π½ΠΈΡΠ° Π³ΠΎ Π²ΠΈΠ΄Π΅Π»Π΅ Π»ΠΎΠ³ΠΎΡΠΎ ΡΠΎ ΡΠ°Π΄ΠΈΠΎ ΠΊΠΎΠ½ΡΡΠΎΠ»ΠΈΡΠ°Π½ ΡΠ°ΡΠΎΠ²Π½ΠΈΠΊ ΠΈΠ»ΠΈ Π΄ΡΡΠΈ ΠΈ Π°ΡΠΎΠΌΡΠΊΠΈ ΡΠ°ΡΠΎΠ²Π½ΠΈΠΊ Π½Π° ΠΏΠ°ΠΊΡΠ²Π°ΡΠ΅ΡΠΎ. ΠΠ²Π° Π΅ ΠΌΠ½ΠΎΠ³Ρ ΠΏΠΎΠ³ΠΎΠ΄Π½ΠΎ, Π±ΠΈΠ΄Π΅ΡΡΠΈ ΡΠ°ΠΌΠΎ ΡΡΠ΅Π±Π° Π΄Π° Π³ΠΎ ΡΡΠ°Π²ΠΈΡΠ΅ ΡΠ°ΡΠΎΠ²Π½ΠΈΠΊΠΎΡ Π½Π° ΠΌΠ°ΡΠ°, Π° ΠΏΠΎ Π½Π΅ΠΊΠΎΠ΅ Π²ΡΠ΅ΠΌΠ΅ ΡΠΎΡ Π°Π²ΡΠΎΠΌΠ°ΡΡΠΊΠΈ ΡΠ΅ ΡΠ΅ ΠΏΡΠΈΠ»Π°Π³ΠΎΠ΄ΠΈ Π½Π° ΡΠΎΡΠ½ΠΎΡΠΎ Π²ΡΠ΅ΠΌΠ΅.
ΠΡΠ΄Π΅ Π΄Π° ΠΎΡΠΊΡΠΈΠ΅ΠΌΠ΅ ΠΊΠ°ΠΊΠΎ ΡΡΠ½ΠΊΡΠΈΠΎΠ½ΠΈΡΠ° ΠΈ Π΄Π° Π½Π°ΠΏΠΈΡΠ΅ΠΌΠ΅ Π΄Π΅ΠΊΠΎΠ΄Π΅Ρ Π²ΠΎ Python.
ΠΠΎΡΡΠΎΡΠ°Ρ ΡΠ°Π·Π»ΠΈΡΠ½ΠΈ ΡΠΈΡΡΠ΅ΠΌΠΈ Π·Π° ΡΠΈΠ½Ρ
ΡΠΎΠ½ΠΈΠ·Π°ΡΠΈΡΠ° Π½Π° Π²ΡΠ΅ΠΌΠ΅ΡΠΎ. ΠΠ°ΡΠΏΠΎΠΏΡΠ»Π°ΡΠ΅Π½ Π²ΠΎ ΠΠ²ΡΠΎΠΏΠ° Π΅ Π³Π΅ΡΠΌΠ°Π½ΡΠΊΠΈΠΎΡ ΡΠΈΡΡΠ΅ΠΌ
Π‘Γ¨ ΡΡΠΎ Π΅ Π½Π°ΠΏΠΈΡΠ°Π½ΠΎ ΠΏΠΎΠ΄ΠΎΠ»Ρ ΡΠ΅ Π±ΠΈΠ΄Π΅ Π·Π° DCF77.
ΠΡΠΈΠ΅ΠΌ Π½Π° ΡΠΈΠ³Π½Π°Π»
DCF77 Π΅ Π΄ΠΎΠ»Π³Π° Π±ΡΠ°Π½ΠΎΠ²Π° ΡΡΠ°Π½ΠΈΡΠ° ΠΊΠΎΡΠ° ΡΠ°Π±ΠΎΡΠΈ Π½Π° ΡΡΠ΅ΠΊΠ²Π΅Π½ΡΠΈΡΠ° ΠΎΠ΄ 77.5 kHz ΠΈ ΠΏΡΠ΅Π½Π΅ΡΡΠ²Π° ΡΠΈΠ³Π½Π°Π»ΠΈ Π²ΠΎ Π°ΠΌΠΏΠ»ΠΈΡΡΠ΄Π½Π° ΠΌΠΎΠ΄ΡΠ»Π°ΡΠΈΡΠ°. Π‘ΡΠ°Π½ΠΈΡΠ°ΡΠ° ΠΎΠ΄ 50 KW ΡΠ΅ Π½Π°ΠΎΡΠ° Π½Π° 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()
ΠΠ»Π΅Π΄Π°ΠΌΠ΅ ΡΠΈΠΏΠΈΡΠ½Π° Π°ΠΌΠΏΠ»ΠΈΡΡΠ΄Π½Π° ΠΌΠΎΠ΄ΡΠ»Π°ΡΠΈΡΠ°:
ΠΠ° Π΄Π° Π³ΠΎ ΠΏΠΎΠ΅Π΄Π½ΠΎΡΡΠ°Π²ΠΈΠΌΠ΅ Π΄Π΅ΠΊΠΎΠ΄ΠΈΡΠ°ΡΠ΅ΡΠΎ, Π΄Π° Π³ΠΎ Π·Π΅ΠΌΠ΅ΠΌΠ΅ ΠΏΠ»ΠΈΠΊΠΎΡ Π½Π° ΡΠΈΠ³Π½Π°Π»ΠΎΡ ΠΊΠΎΡΠΈΡΡΠ΅ΡΡΠΈ ΡΠ° ΡΡΠ°Π½ΡΡΠΎΡΠΌΠ°ΡΠΈΡΠ°ΡΠ° Π₯ΠΈΠ»Π±Π΅ΡΡ:
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 ΡΠ΅ΠΊΡΠ½Π΄ΠΈ, Π½ΠΈΠ·Π°ΡΠ° Π½Π° Π±ΠΈΡΠΎΠ²ΠΈ ΡΠ΅ ΡΠ΅ΡΠ΅ΡΠΈΡΠ° Π½Π° Π½ΡΠ»Π° ΠΈ ΠΏΠΎΠ»Π½Π΅ΡΠ΅ΡΠΎ Π·Π°ΠΏΠΎΡΠ½ΡΠ²Π° ΠΏΠΎΠ²ΡΠΎΡΠ½ΠΎ.
ΠΠΎΡΠ΅Π½Π°Π²Π΅Π΄Π΅Π½ΠΎΡΠΎ Π΅ Π»Π΅ΡΠ½ΠΎ Π΄Π° ΡΠ΅ Π½Π°ΠΏΠΈΡΠ΅ Π²ΠΎ 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
ΠΠ°ΠΊΠΎ ΡΠ΅Π·ΡΠ»ΡΠ°Ρ Π½Π° ΡΠΎΠ°, Π΄ΠΎΠ±ΠΈΠ²Π°ΠΌΠ΅ Π½ΠΈΠ·Π° ΠΎΠ΄ Π±ΠΈΡΠΎΠ²ΠΈ, Π²ΠΎ Π½Π°ΡΠΈΠΎΡ ΠΏΡΠΈΠΌΠ΅Ρ Π·Π° Π΄Π²Π΅ ΡΠ΅ΠΊΡΠ½Π΄ΠΈ ΠΈΠ·Π³Π»Π΅Π΄Π° Π²Π°ΠΊΠ°:
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, ΠΈΡΡΠΎ ΡΠ°ΠΊΠ°, ΠΏΡΠΈΠ²Π»Π΅ΠΊΡΠ²Π°Π°Ρ ΡΡΠ±ΠΈΡΠ΅Π»ΠΈ Π½Π° DIY. ΠΠ° ΡΠ°ΠΌΠΎ 10-20 Π΄ΠΎΠ»Π°ΡΠΈ ΠΌΠΎΠΆΠ΅ΡΠ΅ Π΄Π° ΠΊΡΠΏΠΈΡΠ΅ Π³ΠΎΡΠΎΠ² ΠΌΠΎΠ΄ΡΠ» Π·Π° Π°Π½ΡΠ΅Π½Π° ΡΠΎ Π³ΠΎΡΠΎΠ² ΡΠ΅ΡΠΈΠ²Π΅Ρ ΠΈ TTL ΠΈΠ·Π»Π΅Π·, ΠΊΠΎΡ ΠΌΠΎΠΆΠ΅ Π΄Π° ΡΠ΅ ΠΏΠΎΠ²ΡΠ·Π΅ ΡΠΎ Arduino ΠΈΠ»ΠΈ Π΄ΡΡΠ³ ΠΊΠΎΠ½ΡΡΠΎΠ»Π΅Ρ.
ΠΠ΅ΡΠ΅ Π½Π°ΠΏΠΈΡΠ°Π½ΠΎ Π·Π° Arduino
ΠΠ½ΠΈΠ΅ ΠΊΠΎΠΈ ΡΠ°ΠΊΠ°Π°Ρ ΠΌΠΎΠΆΠ°Ρ Π΄ΡΡΠΈ ΠΈ Π΄Π° Π³ΠΎ Π½Π°Π΄Π³ΡΠ°Π΄Π°Ρ ΡΠ°ΡΠΎΠ²Π½ΠΈΠΊΠΎΡ Π½Π° ΡΠ²ΠΎΡΠ°ΡΠ° ΡΡΠ°ΡΠ° Π±Π°Π±Π° ΡΠΎ ΠΈΠ½ΡΡΠ°Π»ΠΈΡΠ°ΡΠ΅ Π½Π° Π½ΠΎΠ² ΠΌΠ΅Ρ Π°Π½ΠΈΠ·Π°ΠΌ ΡΠΎ ΡΠ°Π΄ΠΈΠΎ ΡΠΈΠ½Ρ ΡΠΎΠ½ΠΈΠ·Π°ΡΠΈΡΠ°:
ΠΠΎΠΆΠ΅ΡΠ΅ Π΄Π° Π½Π°ΡΠ΄Π΅ΡΠ΅ Π΅Π΄Π΅Π½ Π½Π° eBay ΠΊΠΎΡΠΈΡΡΠ΅ΡΡΠΈ Π³ΠΈ ΠΊΠ»ΡΡΠ½ΠΈΡΠ΅ Π·Π±ΠΎΡΠΎΠ²ΠΈ βΠ Π°Π΄ΠΈΠΎ ΠΊΠΎΠ½ΡΡΠΎΠ»ΠΈΡΠ°Π½ΠΎ Π΄Π²ΠΈΠΆΠ΅ΡΠ΅β.
Π, ΠΊΠΎΠ½Π΅ΡΠ½ΠΎ, Π»Π°ΡΡ Ρ Π°ΠΊ Π·Π° ΠΎΠ½ΠΈΠ΅ ΠΊΠΎΠΈ ΠΏΡΠΎΡΠΈΡΠ°Π»Π΅ Π΄ΠΎ ΡΡΠΊΠ°. ΠΡΡΠΈ ΠΈ Π°ΠΊΠΎ Π½Π΅ΠΌΠ° Π½ΠΈΡΡ Π΅Π΄Π΅Π½ ΠΏΡΠ΅Π΄Π°Π²Π°ΡΠ΅Π» Π½Π° ΡΠ°Π΄ΠΈΠΎ ΡΠΈΠ³Π½Π°Π» Π²ΠΎ ΡΠ»Π΅Π΄Π½ΠΈΡΠ΅ Π½Π΅ΠΊΠΎΠ»ΠΊΡ ΠΈΠ»ΡΠ°Π΄ΠΈ ΠΊΠΈΠ»ΠΎΠΌΠ΅ΡΡΠΈ, Π½Π΅ Π΅ ΡΠ΅ΡΠΊΠΎ ΡΠ°ΠΌΠΈ Π΄Π° Π³Π΅Π½Π΅ΡΠΈΡΠ°ΡΠ΅ ΡΠ°ΠΊΠΎΠ² ΡΠΈΠ³Π½Π°Π». ΠΠΎΡΡΠΎΠΈ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠ° Π½Π° Google Play Π½Π°ΡΠ΅ΡΠ΅Π½Π° βDCF77 Emulatorβ ΠΊΠΎΡΠ° Π³ΠΎ Π΅ΠΌΠΈΡΡΠ²Π° ΡΠΈΠ³Π½Π°Π»ΠΎΡ Π΄ΠΎ ΡΠ»ΡΡΠ°Π»ΠΊΠΈΡΠ΅. Π‘ΠΏΠΎΡΠ΅Π΄ Π°Π²ΡΠΎΡΠΎΡ, Π°ΠΊΠΎ ΡΠ° Π·Π°Π²ΠΈΡΠΊΠ°ΡΠ΅ ΠΆΠΈΡΠ°ΡΠ° Π½Π° ΡΠ»ΡΡΠ°Π»ΠΊΠΈΡΠ΅ ΠΎΠΊΠΎΠ»Ρ ΡΠ°ΡΠΎΠ²Π½ΠΈΠΊΠΎΡ, ΡΠΈΠ΅ ΡΠ΅ Π³ΠΎ ΡΠ°ΡΠ°Ρ ΡΠΈΠ³Π½Π°Π»ΠΎΡ (ΠΈΠ½ΡΠ΅ΡΠ΅ΡΠ½ΠΎ Π΅ ΠΊΠ°ΠΊΠΎ, Π±ΠΈΠ΄Π΅ΡΡΠΈ ΠΎΠ±ΠΈΡΠ½ΠΈΡΠ΅ ΡΠ»ΡΡΠ°Π»ΠΊΠΈ Π½Π΅ΠΌΠ° Π΄Π° ΠΏΡΠΎΠΈΠ·Π²Π΅Π΄ΡΠ²Π°Π°Ρ ΡΠΈΠ³Π½Π°Π» ΠΎΠ΄ 77 KHz, Π½ΠΎ ΠΏΡΠΈΠ΅ΠΌΠΎΡ Π²Π΅ΡΠΎΡΠ°ΡΠ½ΠΎ ΡΠ΅ Π΄ΠΎΠ»ΠΆΠΈ Π½Π° Ρ Π°ΡΠΌΠΎΠ½ΠΈΡΠΈΡΠ΅). ΠΠ° Android 9, ΠΏΡΠΎΠ³ΡΠ°ΠΌΠ°ΡΠ° Π²ΠΎΠΎΠΏΡΡΠΎ Π½Π΅ ΡΠ°Π±ΠΎΡΠ΅ΡΠ΅ Π·Π° ΠΌΠ΅Π½Π΅ - Π΅Π΄Π½ΠΎΡΡΠ°Π²Π½ΠΎ Π½Π΅ΠΌΠ°ΡΠ΅ Π·Π²ΡΠΊ (ΠΈΠ»ΠΈ ΠΌΠΎΠΆΠ΅Π±ΠΈ Π½Π΅ Π³ΠΎ ΡΠ»ΡΡΠ½Π°Π² - Π½Π° ΠΊΡΠ°ΡΠΎΡ Π½Π° ΠΊΡΠ°ΠΈΡΡΠ°ΡΠ° Π΅ 77 KHz :), Π½ΠΎ ΠΌΠΎΠΆΠ΅Π±ΠΈ Π½Π΅ΠΊΠΎΡ ΡΠ΅ ΠΈΠΌΠ° ΠΏΠΎΠ΄ΠΎΠ±ΡΠ° ΡΡΠ΅ΡΠ°. Π‘Π΅ΠΏΠ°ΠΊ, Π½Π΅ΠΊΠΎΠΈ ΡΠ΅ ΠΏΡΠ°Π²Π°Ρ ΠΏΠΎΠ»Π½ΠΎΠΏΡΠ°Π²Π΅Π½ Π³Π΅Π½Π΅ΡΠ°ΡΠΎΡ Π½Π° DCF ΡΠΈΠ³Π½Π°Π», ΡΡΠΎ Π΅ Π»Π΅ΡΠ½ΠΎ Π΄Π° ΡΠ΅ Π½Π°ΠΏΡΠ°Π²ΠΈ Π½Π° ΠΈΡΡΠΈΠΎΡ Arduino ΠΈΠ»ΠΈ ESP32:
(ΠΈΠ·Π²ΠΎΡ
ΠΠ°ΠΊΠ»ΡΡΠΎΠΊ
Π‘ΠΈΡΡΠ΅ΠΌΠΎΡ DCF ΡΠ΅ ΠΏΠΎΠΊΠ°ΠΆΠ° ΠΊΠ°ΠΊΠΎ Π½Π°Π²ΠΈΡΡΠΈΠ½Π° ΠΏΡΠΈΠ»ΠΈΡΠ½ΠΎ Π΅Π΄Π½ΠΎΡΡΠ°Π²Π΅Π½ ΠΈ ΡΠ΄ΠΎΠ±Π΅Π½. Π‘ΠΎ ΠΏΠΎΠΌΠΎΡ Π½Π° Π΅Π΄Π½ΠΎΡΡΠ°Π²Π΅Π½ ΠΈ Π΅Π²ΡΠΈΠ½ ΡΠ΅ΡΠΈΠ²Π΅Ρ ΠΌΠΎΠΆΠ΅ΡΠ΅ Π΄Π° Π³ΠΎ ΠΈΠΌΠ°ΡΠ΅ ΡΠΎΡΠ½ΠΎΡΠΎ Π²ΡΠ΅ΠΌΠ΅ ΡΠ΅ΠΊΠΎΠ³Π°Ρ ΠΈ ΡΠ΅ΠΊΠ°Π΄Π΅, ΡΠ΅ ΡΠ°Π·Π±ΠΈΡΠ° Π²ΠΎ ΡΠ΅ΡΠ΅ΠΏΡΠΈΡΠ°ΡΠ°. Π‘Π΅ ΡΠΈΠ½ΠΈ Π΄Π΅ΠΊΠ° ΠΈ ΠΏΠΎΠΊΡΠ°Ρ ΡΠΈΡΠΎΠΊΠΎ ΡΠ°ΡΠΏΡΠΎΡΡΡΠ°Π½Π΅ΡΠ°ΡΠ° Π΄ΠΈΠ³ΠΈΡΠ°Π»ΠΈΠ·Π°ΡΠΈΡΠ° ΠΈ ΠΠ½ΡΠ΅ΡΠ½Π΅ΡΠΎΡ Π½Π° Π½Π΅ΡΡΠ°ΡΠ°, Π²Π°ΠΊΠ²ΠΈΡΠ΅ Π΅Π΄Π½ΠΎΡΡΠ°Π²Π½ΠΈ ΡΠ΅ΡΠ΅Π½ΠΈΡΠ° ΡΠ΅ Π±ΠΈΠ΄Π°Ρ Π±Π°ΡΠ°Π½ΠΈ Π΄ΠΎΠ»Π³ΠΎ Π²ΡΠ΅ΠΌΠ΅.
ΠΠ·Π²ΠΎΡ: www.habr.com