DCF77: Wie funktioniert das System zur Übertragung von genauen Zeit-Signalen?

Hallo Habr.

Vermutlich haben viele, die eine Uhr oder ein Wetterstation gekauft haben, auf der Verpackung das Logo "Radio Controlled Clock" oder sogar "Atomic Clock" gesehen. Das ist sehr praktisch, denn man muss die Uhr nur auf den Tisch stellen, und sie stellt sich nach einer Weile automatisch auf die genaue Uhrzeit ein.
DCF77: Wie funktioniert das System zur Übertragung von genauen Zeit-Signalen?

Lassen Sie uns verstehen, wie das funktioniert, und einen Decoder in Python schreiben.

Es gibt verschiedene Systeme zur Zeitsynchronisation. Das beliebteste in Europa ist das deutsche System DCF-77, in Japan gibt es ein eigenes System JJY, in den USA gibt es das System WWVB, und so weiter. Der folgende Bericht wird sich über DCF77 beziehen, da es das aktuellste und in einigen Teilen von Russland und den Nachbarländern am besten empfangbare System ist (die Bewohner des Fernen Ostens könnten eine andere Meinung haben, aber sie können auch das japanische Signal empfangen und analysieren;).

Alles was folgt, handelt von DCF77.

signal empfangen

DCF77 ist eine Langwellensenderstation, die auf einer Frequenz von 77,5 kHz arbeitet und Signale in Amplitudenmodulation überträgt. Die 50-kW-Station befindet sich 25 km von Frankfurt entfernt und nahm ihren Betrieb bereits 1959 auf. Im Jahr 1973 wurde die Datumsinformation zum genauen Zeitpunkt hinzugefügt. Die Wellenlänge bei 77 kHz ist ziemlich groß, daher sind auch die Abmessungen des Antennenfeldes entsprechend erheblich (Foto von Wikipedia):
DCF77: Wie funktioniert das System zur Übertragung von genauen Zeit-Signalen?

Mit einer solchen Antenne und der eingespeisten Leistung erstreckt sich die Empfangszone praktisch über ganz Europa, Weißrussland, die Ukraine und Teile Russlands.

DCF77: Wie funktioniert das System zur Übertragung von genauen Zeit-Signalen?

Jeder kann das Signal aufnehmen. Dazu reicht es, einen Online-Empfänger zu besuchen, http://websdr.ewi.utwente.nl:8901/, die Frequenz 76,5 kHz und die USB-Modulation auszuwählen. Ein Bild in etwa dieser Art sollte sich öffnen:

DCF77: Wie funktioniert das System zur Übertragung von genauen Zeit-Signalen?

Dort drücken wir die Schaltfläche „Download“ und nehmen einen mehrminütigen Abschnitt auf. Natürlich kann auch ein „echter“ Empfänger, der in der Lage ist, die Frequenz 77,5 kHz aufzunehmen, verwendet werden.

Natürlich erhalten wir, wenn wir Zeitsignale über das Internet empfangen, nicht wirklich genaue Zeit – das Signal wird mit Verzögerung übertragen. Aber unser Ziel ist es nur, die Struktur des Signals zu verstehen; dafür sind Internetaufzeichnungen mehr als ausreichend. In der Praxis werden natürlich spezialisierte Geräte zum Empfangen und Dekodieren verwendet, auf die wir später eingehen werden.

Also, wir haben die Aufnahme erhalten, lassen Sie uns mit der Verarbeitung beginnen.

Dekodierung des Signals

Laden Sie die Datei mit Python hoch und sehen wir uns ihre Struktur an:

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()

Wir sehen eine typische Amplitudenmodulation:
DCF77: Wie funktioniert das System zur Übertragung von genauen Zeit-Signalen?

Um die Dekodierung zu vereinfachen, nehmen wir die Hüllkurve des Signals mit der Hilbert-Transformation:

analytic_signal = signal.hilbert(data)
A = np.abs(analytic_signal)
plt.plot(A[:100000])

Das Ergebnis in vergrößert:
DCF77: Wie funktioniert das System zur Übertragung von genauen Zeit-Signalen?

Lassen Sie uns die Ausreißer durch einen Tiefpassfilter glätten und dabei den Mittelwert berechnen, der später für das Parsen nützlich sein wird.

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

Ergebnis (gelbe Linie): ein nahezu rechteckiges Signal, das sich recht einfach analysieren lässt.
DCF77: Wie funktioniert das System zur Übertragung von genauen Zeit-Signalen?

Parsing

Zunächst müssen wir die Bitfolge erhalten. Die Struktur des Signals ist sehr einfach.
DCF77: Wie funktioniert das System zur Übertragung von genauen Zeit-Signalen?

Die Pulse sind in Sekundenintervalle unterteilt. Wenn der Abstand zwischen den Pulsen 0,1 s beträgt (d.h. die Dauer des Pulses 0,9 s), fügen wir der Bitfolge ein „0“ hinzu. Wenn der Abstand 0,2 s beträgt (d.h. die Dauer 0,8 s), fügen wir ein „1“ hinzu. Das Ende jeder Minute wird durch einen „langen“ Puls von 2 s gekennzeichnet, wobei die Bitfolge zurückgesetzt wird und das Füllen neu beginnt.

Das Obige lässt sich leicht in Python umsetzen.

sig_start, sig_stop = 0, 0
pos = 0
bits_str = ""
while pos < cnt - 4:
    if A[pos]  avg:
        # Signalbeginn
        sig_start = pos
    if A[pos] > avg and A[pos+1] < avg:
        # Signalende
        sig_stop = pos

        diff = sig_stop - sig_start
    
        if diff  0.85 * sample_rate and diff  1.5 * sample_rate:
            print(bits_str)
            bits_str = ""

    pos += 1

Das Ergebnis ist eine Bitfolge; in unserem Beispiel sieht sie für zwei Sekunden so aus:

0011110110111000001011000001010000100110010101100010011000
0001111100110110001010100001010000100110010101100010011000

Übrigens ist es interessant, dass im Signal auch eine "zweite Schicht" an Daten vorhanden ist. Die Bitfolge ist ebenfalls kodiert mit phasenmodulation. Theoretisch sollte dies ein stabileres Dekodieren selbst bei einem schwächeren Signal ermöglichen.

Unser letzter Schritt: die eigentlichen Daten zu erhalten. Die Bits werden einmal pro Sekunde übertragen, sodass wir insgesamt 59 Bits haben, in denen eine Menge Informationen kodiert sind:
DCF77: Wie funktioniert das System zur Übertragung von genauen Zeit-Signalen?

Die Bits sind beschrieben in Wikis, und sie sind ziemlich interessant. Die ersten 15 Bits werden nicht verwendet, obwohl es Pläne gab, sie für Warnsysteme und den Zivilschutz zu nutzen. Bit A1 zeigt an, dass die Uhren in der nächsten Stunde auf Sommerzeit umgestellt werden. Bit A2 weist darauf hin, dass in der nächsten Stunde eine zusätzliche Sekundehinzugefügt wird, die manchmal verwendet wird, um die Zeit entsprechend der Erdrotation zu korrigieren. Die restlichen Bits kodieren Stunden, Minuten, Sekunden und das Datum.

DCF77: Wie funktioniert das System zur Übertragung von genauen Zeit-Signalen?

Für diejenigen, die selbst experimentieren möchten, ist der Dekodierungs-Code im Spoiler angegeben.
Quellcode

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 = ('Sonntag', 'Montag', 'Dienstag', 'Mittwoch', 'Donnerstag', 'Freitag', 'Samstag', 'Sonntag')
    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)

Wenn wir das Programm ausführen, sehen wir ungefähr diese Ausgabe:

0011110110111000001011000001010000100110010101100010011000
Dienstag, 26.03.19, 21:41
0001111100110110001010100001010000100110010101100010011000
Dienstag, 26.03.19, 21:42

Das ist die ganze Magie. Der Vorteil eines solchen Systems liegt darin, dass die Decodierung äußerst einfach ist und auf jedem auch noch so einfachen Mikrocontroller vorgenommen werden kann. Wir zählen einfach die Impulsdauer, speichern 60 Bit und erhalten am Ende jeder Minute die genaue Zeit. Im Vergleich zu anderen Zeit-Synchronisationsmethoden (zum Beispiel GPS oder, Gott bewahre, das Internet :), erfordert diese Radiosynchronisation praktisch keine Energie – zum Beispiel arbeitet ein gewöhnliches Heimwettergerät etwa ein Jahr mit zwei AA-Batterien. Daher werden sogar Armbanduhren mit Radiosynchronisation ausgestattet, ganz zu schweigen von Wanduhren oder Uhren an Bahnhöfen.

Der Komfort und die Einfachheit von DCF ziehen auch Bastler an. Für nur 10-20 € kann man ein fertiges Modul mit Antenne und einem Empfangsgerät mit TTL-Ausgang kaufen, das an Arduino oder einen anderen Controller angeschlossen werden kann.
DCF77: Wie funktioniert das System zur Übertragung von genauen Zeit-Signalen?

Es gibt bereits fertige Bibliotheken für Arduino, die bereitstehen.. Allerdings ist bekannt, dass man mit einem Mikrocontroller entweder eine Uhr oder eine Wetterstation erstellt. Mit einem solchen Gerät ist es tatsächlich nicht schwer, die genaue Zeit zu erhalten, vorausgesetzt, man befindet sich in einem Empfangsbereich. Und man kann die Uhr mit der Aufschrift „Atomuhren“ versehen und gleichzeitig allen Interessierten erklären, dass das Gerät tatsächlich mit Hilfe von Atomuhren synchronisiert wird.

Interessierte können sogar die alten Großmutters Uhren aufrüsten, indem sie ein neues mechanisches Radio-Synchronisierungsmodul installieren:

DCF77: Wie funktioniert das System zur Übertragung von genauen Zeit-Signalen?

So etwas findet man auf eBay mit den Keywords „Radio Controlled Movement“.

Und schließlich ein Tipp für diejenigen, die bis hierhin gelesen haben. Selbst wenn es in den nächsten paar tausend Kilometern keinen einzigen Radiosignal-Sender gibt, ist es nicht schwierig, ein solches Signal selbst zu erzeugen. Im Google Play Store gibt es eine App namens „DCF77 Emulator“, die ein Signal an die Kopfhörer ausgibt. Laut dem Autor, wenn man das Kabel der Kopfhörer um eine Uhr wickelt, fängt diese das Signal auf (interessant, wie, denn normale Kopfhörer geben kein 77 kHz-Signal aus, aber wahrscheinlich erfolgt der Empfang über Harmonien). Bei mir auf Android 9 funktionierte die App überhaupt nicht – es war einfach kein Ton zu hören (vielleicht habe ich ihn auch nicht gehört – sind ja 77 kHz :), aber vielleicht hat jemand mehr Glück. Einige bauen sich jedoch auch einen vollständigen DCF-Signalgenerator, der sich ganz einfach mit einem Arduino oder ESP32 erstellen lässt.

DCF77: Wie funktioniert das System zur Übertragung von genauen Zeit-Signalen?
(Quelle sgfantasytoys.wordpress.com/2015/05/13/synchronize-radio-controlled-watch-without-access)

Fazit

Das DCF-System hat sich als tatsächlich recht einfach und praktisch erwiesen. Mit einem einfachen und kostengünstigen Empfänger hat man immer und überall die genaue Zeit, natürlich innerhalb des Empfangsbereichs. Man könnte denken, dass trotz der allgegenwärtigen Digitalisierung und des „Internet der Dinge“ solche einfachen Lösungen noch lange gefragt sein werden.

Quelle: habr.com

Kaufen Sie zuverlässiges Hosting für Websites mit DDoS-Schutz, VPS VDS-Server 🔥 Kaufen Sie zuverlässiges Hosting für Websites mit DDoS-Schutz, VPS VDS-Server | ProHoster