Salve Habr.
Probabiliter multi qui vigiliam vel stationem tempestatis emunt viderunt Horologium Radiophonicum vel etiam Clock logo in packaging. Hoc valde commodum est, quia satis est horologium in mensa ponere, et post tempus sponte accommodare ad tempus.
Inspice quomodo operatur et decoder in Pythone scribe.
Variae sunt temporis systemata synchronisationum. Maxime popularis in Europa est systema German
Omnia infra scripta erunt circiter DCF77.
Signum receptionis
DCF77 stationem longam operatur in 77.5KHz et signa transmittens AM. Statio cum capacitate 50 kW 25 km ab Frankfurt sita est, incepit opus anno 1959, anno 1973 notitia de tempore exacto addita. Necem in frequentia 77 kHz valde magna est, ergo dimensiones agri antennae etiam valde decentes sunt (photo from Wikipedia);
Tali antenna et inputa potestate regio receptionis totam fere Europam, Belarus, Ucraina et partem Russiae comprehendit.
Quivis notare potest. Hoc facere, mox ad receptorem online
Eodem loco globulum televisificum urgemus et fragmentum pauca minuta commemoramus. Utique, si receptaculum "reale" habes, idoneos ad frequentiam 77.5 kHz commemorare potes, eo uti potes.
Utique, cum accurata temporis signa radiophonica in Interreti accipimus, tempus vere accurate non accipiemus - signum cum mora transmittitur. Propositum autem propositum est solum structuram signi intelligere, hoc enim in interreti memoria plus satis est. In vita reali, scilicet, propriae cogitationes adhibentur ad recipiendum et decocendum, infra dicetur.
Sic recordum accepimus, processus committitur.
Signum decoding
Cum Pythone tabellam oneratis et vide structuram eius:
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()
Videmus typicam modulationem amplitudinis:
Ad simplicioremus decoctionem simpliciorem accipimus signum involucro adhibito Hilberto transformando;
analytic_signal = signal.hilbert(data)
A = np.abs(analytic_signal)
plt.plot(A[:100000])
Effectus ampliatus:
Ex strepitu emissiones leves filtrum humilem utentes, simul valorem mediocris calculate, postea ad parsing in promptu veniet.
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
Proventus (linea lutea): signum fere rectangulum quod satis facile est ad resolvendum.
Parsing
Primum seriei frenum accipere debes. Signum ipsa structura valde simplex est.
Pulsus in secunda intervalla dividuntur. Si distantia inter pulsuum est 0.1s (i.e., longitudo ipsius pulsuum est 0.9s), addimus "0" ad partem consequentiae, si spatium est 0.2s (i.e., longitudo 0.8s), addimus. "1". Finis cuiusque minuti significatur per "longum" pulsum, 2 longum, successio frenum nihili reponit, et impletio iterum incipit.
Facile est supra Python scribere.
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
Quo fit, ut in exemplo nostro pro duobus secundis hoc modo calcaria consequitur;
0011110110111000001011000001010000100110010101100010011000
0001111100110110001010100001010000100110010101100010011000
Viam, interesting est etiam "secunda tabula" notitiarum in signo. Sequentia frenum etiam inscriptum est
Extremum gradum nostrum: ipsa notitia posside. Frena semel per secundam transmittuntur, ideo tantum 59 particulas habemus, in quibus satis multae informationes encodantur;
In frenos describuntur
Nam qui experiri in seipso volunt, decoding code sub praedo datur.
fons
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)
Progressio currens, aliquid simile hoc output videbimus;
0011110110111000001011000001010000100110010101100010011000
Tuesday, 26.03.19, 21:41
0001111100110110001010100001010000100110010101100010011000
Tuesday, 26.03.19, 21:42
Profecto id omne magicae. Utilitas talis systematis est quod decoding est valde simplex, et fieri potest in aliquo, microcontroller maxime simplex. Modo pulsuum longitudinem numeramus, 60 frena cumulabimus, et in fine cuiusque minuti tempus exactum obtinemus. Comparari aliis modis synchronisationi temporis (GPS, exempli gratia, vel quod absit, interreti :), talis synchronisatio radiophonica fere electricitatem non requirit - exempli gratia, ordinaria domus stationis tempestatis operatur per annum circiter in 2 AA batteries. Ideo etiam wristae fiunt cum synchronisation radiophonicae, ne dicam, utique, parietes horologiorum vel stationis stratae horologiorum.
Commoditas et simplicitas DCF attrahunt DIY fanaticus. Solum enim $10-20, antennae moduli prompto factae cum receptore prompto et ttl output emere potes, qui cum Arduino vel alio moderatore coniungi potest.
Nam Arduinus iam scripsit and
Qui volunt vel possunt pervigilare ad veterem aviae custodiam, instituendo novam mechanismum cum synchronismo radiophonico;
Unum invenire potes in eBay utens keywords "Radio Motu Moderato".
Et tandem vita hack pro iis qui hoc hactenus legerunt. Etiamsi signum transmissionis radiophonicum in proximis duobus milibus chiliometrorum non datur, tale signum in tuo ipso genere facile est. Propositum est in Google Play nomine "DCF77 Emulator" quod signum in headphones ponit. Secundum auctoris, si filum headphone circa horologium involvas, signum capient (miror quomodo, quia ordinariae notae headphones signum 77KHz non dant, sed probabiliter harmonicae receptioni debetur). Programma in Android 9 omnino non laboravit - simpliciter nullus sonus erat (vel fortasse non audiebam - 77KHz, post omnes :), sed fortasse aliquis felicior erit. Quidam autem facient signum generantis DCF-procumbens, quod facile est in eodem Arduino seu ESP32;
(source
conclusio,
Ratio DCF evenit ut vere satis simplex et conveniens esset. Susceptoris simplicis et vilis ope, semper et ubique exactum tempus habere potes, scilicet in area receptionis. Videtur quod etiam, non obstante divulgatione digitalizatione et "interrete rerum", huiusmodi solutiones simplices longum tempus in futurum postulabunt.
Source: www.habr.com