ΠΠ΄ΡΠ°Π²Π΅ΠΉ Π₯Π°Π±Ρ.
ΠΠ΅ΡΠΎΡΡΠ½ΠΎ ΠΌΠ½ΠΎΠ·ΠΈΠ½Π°, ΠΊΠΎΠΈΡΠΎ ΠΊΡΠΏΡΠ²Π°Ρ ΡΠ°ΡΠΎΠ²Π½ΠΈΠΊ ΠΈΠ»ΠΈ ΠΌΠ΅ΡΠ΅ΠΎΡΠΎΠ»ΠΎΠ³ΠΈΡΠ½Π° ΡΡΠ°Π½ΡΠΈΡ, ΡΠ° Π²ΠΈΠΆΠ΄Π°Π»ΠΈ ΡΠ°Π΄ΠΈΠΎΡΠΏΡΠ°Π²Π»ΡΠ΅ΠΌΠΈΡ ΡΠ°ΡΠΎΠ²Π½ΠΈΠΊ ΠΈΠ»ΠΈ Π΄ΠΎΡΠΈ Π»ΠΎΠ³ΠΎΡΠΎ Π½Π° Π°ΡΠΎΠΌΠ½ΠΈΡ ΡΠ°ΡΠΎΠ²Π½ΠΈΠΊ Π½Π° ΠΎΠΏΠ°ΠΊΠΎΠ²ΠΊΠ°ΡΠ°. Π’ΠΎΠ²Π° Π΅ ΠΌΠ½ΠΎΠ³ΠΎ ΡΠ΄ΠΎΠ±Π½ΠΎ, Π·Π°ΡΠΎΡΠΎ ΠΏΡΠΎΡΡΠΎ ΡΡΡΠ±Π²Π° Π΄Π° ΠΏΠΎΡΡΠ°Π²ΠΈΡΠ΅ ΡΠ°ΡΠΎΠ²Π½ΠΈΠΊΠ° Π½Π° ΠΌΠ°ΡΠ°ΡΠ° ΠΈ ΡΠ»Π΅Π΄ ΠΈΠ·Π²Π΅ΡΡΠ½ΠΎ Π²ΡΠ΅ΠΌΠ΅ ΡΠΎΠΉ Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ½ΠΎ ΡΠ΅ ΡΠ΅ Π½Π°ΡΡΡΠΎΠΈ ΠΊΡΠΌ ΡΠΎΡΠ½ΠΎΡΠΎ Π²ΡΠ΅ΠΌΠ΅.
ΠΠ΅ΠΊΠ° Π΄Π° ΡΠ°Π·Π±Π΅ΡΠ΅ΠΌ ΠΊΠ°ΠΊ ΡΠ°Π±ΠΎΡΠΈ ΠΈ Π΄Π° Π½Π°ΠΏΠΈΡΠ΅ΠΌ Π΄Π΅ΠΊΠΎΠ΄Π΅Ρ Π½Π° Python.
ΠΠΌΠ° ΡΠ°Π·Π»ΠΈΡΠ½ΠΈ ΡΠΈΡΡΠ΅ΠΌΠΈ Π·Π° ΡΠΈΠ½Ρ
ΡΠΎΠ½ΠΈΠ·ΠΈΡΠ°Π½Π΅ Π½Π° Π²ΡΠ΅ΠΌΠ΅ΡΠΎ. ΠΠ°ΠΉ-ΠΏΠΎΠΏΡΠ»ΡΡΠ½Π°ΡΠ° Π² ΠΠ²ΡΠΎΠΏΠ° Π΅ Π½Π΅ΠΌΡΠΊΠ°ΡΠ° ΡΠΈΡΡΠ΅ΠΌΠ°
ΠΡΠΈΡΠΊΠΎ Π½Π°ΠΏΠΈΡΠ°Π½ΠΎ ΠΏΠΎ-Π΄ΠΎΠ»Ρ ΡΠ΅ Π±ΡΠ΄Π΅ Π·Π° DCF77.
ΠΡΠΈΠ΅ΠΌΠ°Π½Π΅ Π½Π° ΡΠΈΠ³Π½Π°Π»
DCF77 Π΅ Π΄ΡΠ»Π³ΠΎΠ²ΡΠ»Π½ΠΎΠ²Π° ΡΡΠ°Π½ΡΠΈΡ, ΡΠ°Π±ΠΎΡΠ΅ΡΠ° Π½Π° ΡΠ΅ΡΡΠΎΡΠ° 77.5 kHz ΠΈ ΠΏΡΠ΅Π΄Π°Π²Π°ΡΠ° ΡΠΈΠ³Π½Π°Π»ΠΈ Π² Π°ΠΌΠΏΠ»ΠΈΡΡΠ΄Π½Π° ΠΌΠΎΠ΄ΡΠ»Π°ΡΠΈΡ. Π‘ΡΠ°Π½ΡΠΈΡΡΠ° 50KW ΡΠ΅ Π½Π°ΠΌΠΈΡΠ° Π½Π° 25 ΠΊΠΌ ΠΎΡ Π€ΡΠ°Π½ΠΊΡΡΡΡ, Π·Π°ΠΏΠΎΡΠ²Π° ΡΠ°Π±ΠΎΡΠ° ΠΏΡΠ΅Π· 1959 Π³., Π° ΠΏΡΠ΅Π· 1973 Π³. ΠΊΡΠΌ ΡΠΎΡΠ½ΠΈΡ ΡΠ°Ρ Π΅ Π΄ΠΎΠ±Π°Π²Π΅Π½Π° ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ Π·Π° Π΄Π°ΡΠ°ΡΠ°. ΠΡΠ»ΠΆΠΈΠ½Π°ΡΠ° Π½Π° Π²ΡΠ»Π½Π°ΡΠ° ΠΏΡΠΈ ΡΠ΅ΡΡΠΎΡΠ° ΠΎΡ 77 KHz Π΅ ΠΌΠ½ΠΎΠ³ΠΎ Π³ΠΎΠ»ΡΠΌΠ°, ΡΠ°ΠΊΠ° ΡΠ΅ ΡΠ°Π·ΠΌΠ΅ΡΠΈΡΠ΅ Π½Π° Π°Π½ΡΠ΅Π½Π½ΠΎΡΠΎ ΠΏΠΎΠ»Π΅ ΡΡΡΠΎ ΡΠ° Π΄ΠΎΡΡΠ° ΠΏΡΠΈΠ»ΠΈΡΠ½ΠΈ (ΡΠ½ΠΈΠΌΠΊΠ° ΠΎΡ Wikipedia):
Π‘ ΡΠ°ΠΊΠ°Π²Π° Π°Π½ΡΠ΅Π½Π° ΠΈ Π²Ρ
ΠΎΠ΄Π½Π° ΠΌΠΎΡΠ½ΠΎΡΡ Π·ΠΎΠ½Π°ΡΠ° Π½Π° ΠΏΡΠΈΠ΅ΠΌΠ°Π½Π΅ ΠΏΠΎΠΊΡΠΈΠ²Π° ΠΏΠΎΡΡΠΈ ΡΡΠ»Π° ΠΠ²ΡΠΎΠΏΠ°, ΠΠ΅Π»Π°ΡΡΡ, Π£ΠΊΡΠ°ΠΉΠ½Π° ΠΈ ΡΠ°ΡΡ ΠΎΡ Π ΡΡΠΈΡ.
ΠΡΠ΅ΠΊΠΈ ΠΌΠΎΠΆΠ΅ Π΄Π° Π·Π°ΠΏΠΈΡΠ΅ ΡΠΈΠ³Π½Π°Π». ΠΠ° Π΄Π° Π½Π°ΠΏΡΠ°Π²ΠΈΡΠ΅ ΡΠΎΠ²Π°, ΠΏΡΠΎΡΡΠΎ ΠΎΡΠΈΠ΄Π΅ΡΠ΅ Π½Π° ΠΎΠ½Π»Π°ΠΉΠ½ ΠΏΡΠΈΠ΅ΠΌΠ½ΠΈΠΊΠ°
Π’Π°ΠΌ Π½Π°ΡΠΈΡΠΊΠ°ΠΌΠ΅ Π±ΡΡΠΎΠ½Π° Π·Π° ΠΈΠ·ΡΠ΅Π³Π»ΡΠ½Π΅ ΠΈ Π·Π°ΠΏΠΈΡΠ²Π°ΠΌΠ΅ ΡΡΠ°Π³ΠΌΠ΅Π½Ρ Ρ Π΄ΡΠ»ΠΆΠΈΠ½Π° Π½ΡΠΊΠΎΠ»ΠΊΠΎ ΠΌΠΈΠ½ΡΡΠΈ. Π Π°Π·Π±ΠΈΡΠ° ΡΠ΅, Π°ΠΊΠΎ ΠΈΠΌΠ°ΡΠ΅ βΠΈΡΡΠΈΠ½ΡΠΊΠΈβ ΠΏΡΠΈΠ΅ΠΌΠ½ΠΈΠΊ, ΡΠΏΠΎΡΠΎΠ±Π΅Π½ Π΄Π° Π·Π°ΠΏΠΈΡΠ²Π° ΡΠ΅ΡΡΠΎΡΠ° ΠΎΡ 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.1s (Ρ.Π΅. Π΄ΡΠ»ΠΆΠΈΠ½Π°ΡΠ° Π½Π° ΡΠ°ΠΌΠΈΡ ΠΈΠΌΠΏΡΠ»Ρ Π΅ 0.9s), Π΄ΠΎΠ±Π°Π²Π΅ΡΠ΅ β0β ΠΊΡΠΌ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°ΡΠ΅Π»Π½ΠΎΡΡΡΠ° ΠΎΡ Π±ΠΈΡΠΎΠ²Π΅; Π°ΠΊΠΎ ΡΠ°Π·ΡΡΠΎΡΠ½ΠΈΠ΅ΡΠΎ Π΅ 0.2s (Ρ.Π΅. Π΄ΡΠ»ΠΆΠΈΠ½Π°ΡΠ° Π΅ 0.8s), Π΄ΠΎΠ±Π°Π²Π΅ΡΠ΅ β1β. ΠΡΠ°ΡΡ Π½Π° Π²ΡΡΠΊΠ° ΠΌΠΈΠ½ΡΡΠ° ΡΠ΅ ΠΎΠ±ΠΎΠ·Π½Π°ΡΠ°Π²Π° Ρ βΠ΄ΡΠ»ΡΠ³β ΠΈΠΌΠΏΡΠ»Ρ, Π΄ΡΠ»ΡΠ³ 2 s, Π±ΠΈΡΠΎΠ²Π°ΡΠ° ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°ΡΠ΅Π»Π½ΠΎΡΡ ΡΠ΅ Π½ΡΠ»ΠΈΡΠ° ΠΈ ΠΏΡΠ»Π½Π΅Π½Π΅ΡΠΎ Π·Π°ΠΏΠΎΡΠ²Π° ΠΎΡΠ½ΠΎΠ²ΠΎ.
ΠΠΎΡΠ½ΠΎΡΠΎ Π΅ Π»Π΅ΡΠ½ΠΎ Π·Π° ΠΏΠΈΡΠ°Π½Π΅ Π½Π° 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 Π±Π°ΡΠ΅ΡΠΈΠΈ ΠΠ. Π‘Π»Π΅Π΄ΠΎΠ²Π°ΡΠ΅Π»Π½ΠΎ Π΄ΠΎΡΠΈ ΡΡΡΠ½ΠΈΡΠ΅ ΡΠ°ΡΠΎΠ²Π½ΠΈΡΠΈ ΡΠ΅ ΠΏΡΠ°Π²ΡΡ Ρ ΡΠ°Π΄ΠΈΠΎΡΠΈΠ½Ρ ΡΠΎΠ½ΠΈΠ·Π°ΡΠΈΡ, Π΄Π° Π½Π΅ Π³ΠΎΠ²ΠΎΡΠΈΠΌ, ΡΠ°Π·Π±ΠΈΡΠ° ΡΠ΅, Π·Π° ΡΡΠ΅Π½Π½ΠΈΡΠ΅ ΡΠ°ΡΠΎΠ²Π½ΠΈΡΠΈ ΠΈΠ»ΠΈ ΡΠ°ΡΠΎΠ²Π½ΠΈΡΠΈΡΠ΅ Π½Π° ΡΠ»ΠΈΡΠ½ΠΈΡΠ΅ ΡΡΠ°Π½ΡΠΈΠΈ.
Π£Π΄ΠΎΠ±ΡΡΠ²ΠΎΡΠΎ ΠΈ ΠΏΡΠΎΡΡΠΎΡΠ°ΡΠ° Π½Π° DCF ΡΡΡΠΎ ΠΏΡΠΈΠ²Π»ΠΈΡΠ°Ρ Π΅Π½ΡΡΡΠΈΠ°ΡΡΠΈΡΠ΅ βΠ½Π°ΠΏΡΠ°Π²ΠΈ ΡΠΈ ΡΠ°ΠΌβ. Π‘Π°ΠΌΠΎ Π·Π° $10-20 ΠΌΠΎΠΆΠ΅ΡΠ΅ Π΄Π° Π·Π°ΠΊΡΠΏΠΈΡΠ΅ Π³ΠΎΡΠΎΠ² Π°Π½ΡΠ΅Π½Π΅Π½ ΠΌΠΎΠ΄ΡΠ» Ρ Π³ΠΎΡΠΎΠ² ΠΏΡΠΈΠ΅ΠΌΠ½ΠΈΠΊ ΠΈ TTL ΠΈΠ·Ρ
ΠΎΠ΄, ΠΊΠΎΠΉΡΠΎ ΠΌΠΎΠΆΠ΅ Π΄Π° Π±ΡΠ΄Π΅ ΡΠ²ΡΡΠ·Π°Π½ ΠΊΡΠΌ Arduino ΠΈΠ»ΠΈ Π΄ΡΡΠ³ ΠΊΠΎΠ½ΡΡΠΎΠ»Π΅Ρ.
ΠΠ΅ΡΠ΅ Π΅ Π½Π°ΠΏΠΈΡΠ°Π½ΠΎ Π·Π° Arduino
ΠΠ΅Π»Π°Π΅ΡΠΈΡΠ΅ ΠΌΠΎΠ³Π°Ρ Π΄ΠΎΡΠΈ Π΄Π° Π½Π°Π΄ΡΡΡΠΎΡΡ ΡΡΠ°ΡΠΈΡ ΡΠΈ ΡΠ°ΡΠΎΠ²Π½ΠΈΠΊ Π½Π° Π±Π°Π±Π°, ΠΊΠ°ΡΠΎ ΠΈΠ½ΡΡΠ°Π»ΠΈΡΠ°Ρ Π½ΠΎΠ² ΠΌΠ΅Ρ Π°Π½ΠΈΠ·ΡΠΌ Ρ ΡΠ°Π΄ΠΈΠΎΡΠΈΠ½Ρ ΡΠΎΠ½ΠΈΠ·Π°ΡΠΈΡ:
ΠΠΎΠΆΠ΅ΡΠ΅ Π΄Π° Π½Π°ΠΌΠ΅ΡΠΈΡΠ΅ ΡΠ°ΠΊΡΠ² Π² ebay, ΠΊΠ°ΡΠΎ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΡΠ΅ ΠΊΠ»ΡΡΠΎΠ²ΠΈΡΠ΅ Π΄ΡΠΌΠΈ βΠ Π°Π΄ΠΈΠΎΡΠΏΡΠ°Π²Π»ΡΠ΅ΠΌΠΎ Π΄Π²ΠΈΠΆΠ΅Π½ΠΈΠ΅β.
Π Π½Π°ΠΊΡΠ°Ρ, Π΅Π΄ΠΈΠ½ Π»Π°ΠΉΡΡ Π°ΠΊ Π·Π° ΡΠ΅Π·ΠΈ, ΠΊΠΎΠΈΡΠΎ ΡΠ° ΠΏΡΠΎΡΠ΅Π»ΠΈ Π΄ΠΎ ΡΡΠΊ. ΠΠΎΡΠΈ ΠΈ Π΄Π° Π½ΡΠΌΠ° Π½ΠΈΡΠΎ Π΅Π΄ΠΈΠ½ ΠΏΡΠ΅Π΄Π°Π²Π°ΡΠ΅Π» Π½Π° ΡΠ°Π΄ΠΈΠΎΡΠΈΠ³Π½Π°Π» Π² ΡΠ»Π΅Π΄Π²Π°ΡΠΈΡΠ΅ Π½ΡΠΊΠΎΠ»ΠΊΠΎ Ρ ΠΈΠ»ΡΠ΄ΠΈ ΠΊΠΈΠ»ΠΎΠΌΠ΅ΡΡΠ°, Π½Π΅ Π΅ ΡΡΡΠ΄Π½ΠΎ Π΄Π° Π³Π΅Π½Π΅ΡΠΈΡΠ°ΡΠ΅ ΡΠ°ΠΊΡΠ² ΡΠΈΠ³Π½Π°Π» ΡΠ°ΠΌΠΈ. Π Google Play ΠΈΠΌΠ° ΠΏΡΠΎΠ³ΡΠ°ΠΌΠ°, Π½Π°ΡΠ΅ΡΠ΅Π½Π° βDCF77 Emulatorβ, ΠΊΠΎΡΡΠΎ ΠΈΠ·Π²Π΅ΠΆΠ΄Π° ΡΠΈΠ³Π½Π°Π»Π° ΠΊΡΠΌ ΡΠ»ΡΡΠ°Π»ΠΊΠΈΡΠ΅. Π‘ΠΏΠΎΡΠ΅Π΄ Π°Π²ΡΠΎΡΠ°, Π°ΠΊΠΎ ΡΠ²ΠΈΠ΅ΡΠ΅ ΠΊΠ°Π±Π΅Π»Π° Π½Π° ΡΠ»ΡΡΠ°Π»ΠΊΠΈΡΠ΅ ΠΎΠΊΠΎΠ»ΠΎ ΡΠ°ΡΠΎΠ²Π½ΠΈΠΊΠ°, ΡΠ΅ ΡΠ΅ ΡΠ»ΠΎΠ²ΡΡ ΡΠΈΠ³Π½Π°Π»Π° (ΠΈΠ½ΡΠ΅ΡΠ΅ΡΠ½ΠΎ Π΅ ΠΊΠ°ΠΊ, Π·Π°ΡΠΎΡΠΎ ΠΎΠ±ΠΈΠΊΠ½ΠΎΠ²Π΅Π½ΠΈΡΠ΅ ΡΠ»ΡΡΠ°Π»ΠΊΠΈ Π½ΡΠΌΠ° Π΄Π° ΠΏΡΠΎΠΈΠ·Π²Π΅Π΄Π°Ρ 77KHz ΡΠΈΠ³Π½Π°Π», Π½ΠΎ ΠΏΡΠΈΠ΅ΠΌΠ°Π½Π΅ΡΠΎ Π²Π΅ΡΠΎΡΡΠ½ΠΎ ΡΠ΅ Π΄ΡΠ»ΠΆΠΈ Π½Π° Ρ Π°ΡΠΌΠΎΠ½ΠΈΡΠΈ). ΠΠ° Android 9 ΠΏΡΠΎΠ³ΡΠ°ΠΌΠ°ΡΠ° ΠΈΠ·ΠΎΠ±ΡΠΎ Π½Π΅ ΡΠ°Π±ΠΎΡΠΈ Π·Π° ΠΌΠ΅Π½ - ΠΏΡΠΎΡΡΠΎ Π½ΡΠΌΠ°ΡΠ΅ Π·Π²ΡΠΊ (ΠΈΠ»ΠΈ ΠΌΠΎΠΆΠ΅ Π±ΠΈ Π½Π΅ Π³ΠΎ ΡΡΡ - Π²ΡΠ΅ ΠΏΠ°ΠΊ Π΅ 77KHz :), Π½ΠΎ ΠΌΠΎΠΆΠ΅ Π±ΠΈ Π½ΡΠΊΠΎΠΉ ΡΠ΅ ΠΈΠΌΠ° ΠΏΠΎΠ²Π΅ΡΠ΅ ΠΊΡΡΠΌΠ΅Ρ. ΠΡΠΊΠΎΠΈ ΠΎΠ±Π°ΡΠ΅ ΡΠΈ ΠΏΡΠ°Π²ΡΡ ΠΏΡΠ»Π½ΠΎΡΠ΅Π½Π΅Π½ DCF Π³Π΅Π½Π΅ΡΠ°ΡΠΎΡ Π½Π° ΡΠΈΠ³Π½Π°Π»ΠΈ, ΠΊΠΎΠΉΡΠΎ Π΅ Π»Π΅ΡΠ΅Π½ Π·Π° ΡΡΠ·Π΄Π°Π²Π°Π½Π΅ Π½Π° ΡΡΡΠΈΡ Arduino ΠΈΠ»ΠΈ ESP32:
(ΠΈΠ·ΡΠΎΡΠ½ΠΈΠΊ
ΠΠ°ΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅
Π‘ΠΈΡΡΠ΅ΠΌΠ°ΡΠ° DCF ΡΠ΅ ΠΎΠΊΠ°Π·Π° Π½Π°ΠΈΡΡΠΈΠ½Π° Π΄ΠΎΡΡΠ° ΠΏΡΠΎΡΡΠ° ΠΈ ΡΠ΄ΠΎΠ±Π½Π°. Π‘ ΠΏΠΎΠΌΠΎΡΡΠ° Π½Π° ΠΏΡΠΎΡΡ ΠΈ Π΅Π²ΡΠΈΠ½ ΠΏΡΠΈΠ΅ΠΌΠ½ΠΈΠΊ ΠΌΠΎΠΆΠ΅ΡΠ΅ Π΄Π° ΠΈΠΌΠ°ΡΠ΅ ΡΠΎΡΠ½ΠΈΡ ΡΠ°Ρ Π²ΠΈΠ½Π°Π³ΠΈ ΠΈ Π½Π°Π²ΡΡΠΊΡΠ΄Π΅, ΡΠ°Π·Π±ΠΈΡΠ° ΡΠ΅ Π² ΡΠ΅ΡΠ΅ΠΏΡΠΈΡΡΠ°. ΠΠ·Π³Π»Π΅ΠΆΠ΄Π°, ΡΠ΅ Π΄ΠΎΡΠΈ Π²ΡΠΏΡΠ΅ΠΊΠΈ ΡΠΈΡΠΎΠΊΠΎ ΡΠ°Π·ΠΏΡΠΎΡΡΡΠ°Π½Π΅Π½Π°ΡΠ° Π΄ΠΈΠ³ΠΈΡΠ°Π»ΠΈΠ·Π°ΡΠΈΡ ΠΈ ΠΠ½ΡΠ΅ΡΠ½Π΅Ρ Π½Π° Π½Π΅ΡΠ°ΡΠ°, ΠΏΠΎΠ΄ΠΎΠ±Π½ΠΈ ΠΏΡΠΎΡΡΠΈ ΡΠ΅ΡΠ΅Π½ΠΈΡ ΡΠ΅ Π±ΡΠ΄Π°Ρ ΡΡΡΡΠ΅Π½ΠΈ Π΄ΡΠ»Π³ΠΎ Π²ΡΠ΅ΠΌΠ΅.
ΠΠ·ΡΠΎΡΠ½ΠΈΠΊ: www.habr.com