DCF77: quomodo tempus significat ratio operis?

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.
DCF77: quomodo tempus significat ratio operis?

Inspice quomodo operatur et decoder in Pythone scribe.

Variae sunt temporis systemata synchronisationum. Maxime popularis in Europa est systema German DCF-77Iaponia suum systema JJY, in USA systema est WWVB, et sic porro. Praeterea, fabula circa DCF77 erit, quod ad receptionem maxime pertinentes et pervia in nonnullis locis Europaeae partis Russiae et vicinarum regionum (incolae ultimi Orientis contrariam opinionem habere possunt, ipsi autem vicissim possunt. recipere et resolvere signum Iaponicae;).

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);
DCF77: quomodo tempus significat ratio operis?

Tali antenna et inputa potestate regio receptionis totam fere Europam, Belarus, Ucraina et partem Russiae comprehendit.

DCF77: quomodo tempus significat ratio operis?

Quivis notare potest. Hoc facere, mox ad receptorem online http://websdr.ewi.utwente.nl:8901/ibi frequentiam 76.5KHz et USB modulationis elige. Simile quiddam videtur imago;

DCF77: quomodo tempus significat ratio operis?

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:
DCF77: quomodo tempus significat ratio operis?

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:
DCF77: quomodo tempus significat ratio operis?

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.
DCF77: quomodo tempus significat ratio operis?

Parsing

Primum seriei frenum accipere debes. Signum ipsa structura valde simplex est.
DCF77: quomodo tempus significat ratio operis?

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 tempus modulationis. Cogitatione haec decoctionem robustiorem praebere debet etiam in signo debili.

Extremum gradum nostrum: ipsa notitia posside. Frena semel per secundam transmittuntur, ideo tantum 59 particulas habemus, in quibus satis multae informationes encodantur;
DCF77: quomodo tempus significat ratio operis?

In frenos describuntur Vicipaediaet sunt satis curiosi. Primum 15 frena non sunt adhibita, quamquam consilia publica utendi sunt ad publicas rationes et ad civiles rationes defendendas. Bit A1 indicat horologium mutaturum esse ad lucem temporis salvificam in hora proxima. Bit A2 indicat horam proximam additam esse leap secundoqui quandoque emendabat tempus pro rotatione Terre. Reliquae frena encode horas, minutas, secundas et date.

DCF77: quomodo tempus significat ratio operis?

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.
DCF77: quomodo tempus significat ratio operis?

Nam Arduinus iam scripsit and facta bibliothecas paratus. Sed iam notum est quicquid in microcontroller agis, vel horologium vel statio tempestatis accipias. Tali figmento, exacto tempore, facile est, nisi utique in area recipienda es. Bene, in horologio atomicum horologii scripturam suspendere potes, simulque omnibus expone machinam vere congruentem horologii atomicii utentem.

Qui volunt vel possunt pervigilare ad veterem aviae custodiam, instituendo novam mechanismum cum synchronismo radiophonico;

DCF77: quomodo tempus significat ratio operis?

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;

DCF77: quomodo tempus significat ratio operis?
(source sgfantasytoys.wordpress.com/2015/05/13/synchronize-radio moderato-vigilia-sine accessu)

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