Talofa Habr.
Masalo o le to'atele oi latou na fa'atauina se uati po'o se nofoaga o le tau ua va'aia le Leitio Pulea Uati po'o le fa'ailoga o le Uati Atomic i luga o le afifiina. E faigofie tele lenei mea, aua e te manaʻomia le tuʻuina o le uati i luga o le laulau, ma a maeʻa sina taimi o le a otometi lava ona fetuunai i le taimi tonu.
Se'i tatou va'ai pe fa'apefea ona galue ma tusi se decoder i le Python.
E eseese faiga fa'amaopoopo taimi. Le sili ona lauiloa i Europa o le faiga Siamani
O mea uma o lo'o tusia i lalo o le a fa'atatau ile DCF77.
Taliaina o faailoilo
O le DCF77 o se nofoaga galu umi o loʻo faʻaogaina i le taimi ole 77.5 kHz ma faʻasalalau faʻailoga ile faʻaogaina o le amplitude. O le nofoaga 50KW o loʻo tu i le 25 kilomita mai Frankfurt, na amata faʻaaogaina i le 1959, ma i le 1973 na faʻaopoopoina ai faʻamatalaga i le taimi tonu. Ole umi ole galu ile taimi ole 77 KHz e umi tele, o lona uiga o le tele o le antenna fanua e lelei tele (ata mai Wikipedia):
Faatasi ai ma se antenna ma le eletise, o le nofoaga e talia ai e aofia uma ai Europa, Belarus, Iukureini ma se vaega o Rusia.
So'o se tasi e mafai ona pu'eina se fa'ailoga. Ina ia faia lenei mea, naʻo le alu i luga o le initaneti
O iina matou te oomi ai le ki download ma faʻamaumau se vaega i ni nai minute le umi. Ioe, afai e iai sau "moni" e mafai ona faʻamauina le 77.5KHz taimi, e mafai ona e faʻaogaina lena mea.
Ioe, e ala i le mauaina o faailoilo taimi leitio e ala i le Initaneti, o le a tatou le mauaina le taimi saʻo moni - o le faailo e tuʻuina atu ma le tuai. Ae o la matou sini e naʻo le malamalama i le fausaga o le faʻailoga; mo lenei mea, o le Initaneti e sili atu nai lo le lava. I le olaga moni, o le mea moni, o masini faʻapitoa e faʻaaogaina mo le mauaina ma le decoding, o le a talanoaina i lalo.
O lea la, ua matou mauaina le lipine, sei amata ona faʻagasolo.
Fa'ailoga Fa'ailoga
Sei o tatou utaina le faila e faʻaaoga ai le Python ma vaʻai i lona fausaga:
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()
Matou te vaʻaia le faʻaogaina o le amplitude masani:
Ina ia faʻafaigofie le faʻavasegaina, seʻi o tatou ave le teutusi faʻailoga e faʻaaoga ai le Hilbert transform:
analytic_signal = signal.hilbert(data)
A = np.abs(analytic_signal)
plt.plot(A[:100000])
Fa'ateleina le i'uga:
Sei o tatou faʻalelei le pisapisao e faʻaaoga ai se faamama maualalo, ma i le taimi lava e tasi e fuafua le tau averesi, lea o le a aoga mulimuli ane mo le faʻavasegaina.
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
Fa'ai'uga (laina samasama): ose fa'ailoga fa'ailoga faatafafa e fai si faigofie ona fa'avasega.
Fa'atalanoaga
Muamua e tatau ona e mauaina le faʻasologa o mea. O le faʻailoga faʻailoga lava ia e matua faigofie lava.
Ua vaevaeina fatu i ni vaeluaga lua. Afai o le mamao i le va o pulus e 0.1s (o lona uiga o le umi o le fatu lava ia e 0.9s), faʻaopoopo le "0" i le faʻasologa o mea; afai o le mamao e 0.2s (o lona uiga o le umi o le 0.8s), faʻaopoopo le "1". O le faaiuga o minute taitasi o loʻo faʻaalia i le "umi" pulupulu, 2s le umi, o le faʻasologa faʻasologa e toe setiina i le zero, ma toe faʻatumu.
Ole mea o loʻo i luga e faigofie ona tusi ile 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
O se taunuuga, matou te maua se faasologa o fasi, i la matou faʻataʻitaʻiga mo le lua sekone e pei o lenei:
0011110110111000001011000001010000100110010101100010011000
0001111100110110001010100001010000100110010101100010011000
I le auala, e manaia le faʻailoga o loʻo i ai foi se "vaega lona lua" o faʻamaumauga. O le fa'asologa fa'asologa o lo'o fa'aogaina fo'i
O la matou laasaga mulimuli: mauaina o faʻamatalaga moni. E fa'asalalauina fa'atasi i le sekone, o lea e maua ai le aofa'i o le 59 bits, lea e tele fa'amatalaga o lo'o fa'ailogaina:
O loʻo faʻamatalaina i totonu
Mo i latou e manaʻo e faʻataʻitaʻi i latou lava, o le decoding code o loʻo tuʻuina atu i lalo o le spoiler.
Faʻamatalaga punaoa
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)
A tatou faʻatautaia le polokalame, o le a tatou vaʻai i gaioiga e pei o lenei:
0011110110111000001011000001010000100110010101100010011000
Tuesday, 26.03.19, 21:41
0001111100110110001010100001010000100110010101100010011000
Tuesday, 26.03.19, 21:42
O le mea moni, o mea fa'ataulāitu uma na. O le lelei o sea faiga o le decoding e matua faigofie lava ma e mafai ona faia i soo se, e oo lava i le microcontroller sili ona faigofie. Matou te faitauina le umi o pulupulu, faʻaputu 60 bits, ma i le faaiuga o minute taʻitasi matou te maua ai le taimi tonu. Pe a faatusatusa i isi auala o le faamaopoopoina o le taimi (GPS, mo se faataitaiga, po o le faasāina e le Atua, le Initoneti:), o ia leitio synchronization e manaʻomia toetoe lava leai se eletise - mo se faʻataʻitaʻiga, o se nofoaga masani o le tau o le fale e alu pe a ma le tausaga i luga o le 2 maa AA. O le mea lea, e oo lava i uati lima e faia i le leitio synchronization, ae le o le taʻua, o le mea moni, puipui puipui poʻo uati nofoaga ala.
O le faigofie ma le faigofie o le DCF e tosina mai ai foi tagata fiafia DIY. Mo na'o le $10-20 e mafai ona e fa'atauina se antenna module ua saunia ma se tali fa'apolopolo ma le TTL, lea e mafai ona fa'afeso'ota'i i se Arduino po'o se isi fa'atonu.
Ua uma ona tusia mo Arduino
O i latou e manana'o e mafai lava ona fa'aleleia le uati a lo latou tinamatua e ala i le fa'apipi'iina o se masini fou fa'atasi ma le leitio fa'atasi:
E mafai ona e mauaina se tasi i luga o le ebay e faʻaaoga ai upu autu "Radio Controlled Movement".
Ma le mea mulimuli, o se olaga hack mo i latou ua faitau i lenei mamao. E tusa lava pe leai se leitio faʻasalalau faʻasalalau i le isi lua afe kilomita, e le faigata ona faʻatupuina se faʻailoga ia oe lava. O loʻo i ai se polokalame ile Google Play e taʻua o le "DCF77 Emulator" e faʻaalia ai le faailo i headphones. E tusa ai ma le tusitala, afai e te afifiina le uaea o lipine i luga o le uati, o le a latou pikiina le faailo (e manaia pe faapefea, aua o lipine masani e le maua ai se faailo 77KHz, ae o le taliaina atonu e mafua mai i le harmonics). I luga o le Android 9, e leʻi aoga le polokalame mo aʻu - e leai se leo (pe atonu ou te leʻi faʻalogoina - o le 77KHz, pe a uma:), ae atonu o le a sili atu le manuia o se tasi. O nisi, e ui i lea, latou te faia i latou lava o se afi faʻailoga DCF atoa, lea e faigofie ona fai i luga ole Arduino poʻo le ESP32:
(puna
iʻuga
O le DCF system na faʻaalia e matua faigofie ma faigofie. Faatasi ai ma le fesoasoani a se tagata faigofie ma taugofie, e mafai ona e maua le taimi saʻo i taimi uma ma soʻo se mea, ioe i le nofoaga e talia ai. E foliga mai e ui lava i le faʻalauteleina o numera ma le Initaneti o Mea, o ia fofo faigofie o le a manaʻomia mo se taimi umi.
puna: www.habr.com