Diese Seite beschreibt Überlegungen zur Implementierung eines DCF-Empängers in Software. Falls Du noch nicht mit dem Aufbau des DCF-Signals vertraut bist, findest Du Erklärungen und hilfreiche Texte auf den folgenden Seiten: Das deutsche Funkuhr-Signal DCF77 wird amplitudenmoduliert mit einer Trägerfrequenz von 77.5 kHz von Mainflingen bei Franfurt/Main ausgestrahlt. Die Übertragungsrate beträgt ein Bit pro Sekunde. Durch Absenkung des Trägers für 100ms zum Sekundenanfang wird eine Null — im folgenden mit B0 bezeichnet — übertragen. Analog wird eine Eins, also B1, durch eine Absenkung von 200ms Dauer codiert. Auf diese Weise werden jede Minute 59 Bit übermittelt, die unter anderem die Zeitinformation für die folgende Minute im BCD-Format enthalten. In der 60-ten Sekunde wird der Träger nicht abgesenkt, bezeichnet als BM oder #. Die Marke BM dient als Kennung der Minutenenden, das heißt mit dem Ende von BM und dem Anfang des nächsten Bits beginnt die Minute, deren Zeitinformation soeben übertragen wurde. Zu diesen drei Werten kommt aus Sicht eines Empfängers noch ein vierter Wert hinzu: B?. Er steht für einen nicht zuortenbaren Wert, der bei schlechter Empfangslage auftreten kann. StrategieDie Strategie eines einfachen DCF-Decoders ist simpel: Es werden solange Bits empfangen bis eine Minute komplett ist. Dann werden die Daten decodiert. Weicht ein Bit weiter als eine vorgegebene Maximaltoleranz vom DCF-Format ab, dann beginnt man einfach von vorne mit dem Einsammeln der Bits. Mit dieser Strategie dauert ein Zeitabgleich bei guter Empfangslage nur wenige Minuten; ist das Signal jedoch gestört, dann ist ein Zeitabgleich sehr unwahrscheinlich: Gehen wir davon aus, dass zur Dekodierung 65 Bits in Folge korrekt empfangen werden müssen und die Wahrscheinlichkeit für ein korrekt empfangenes Bit bei 90% liegt, dann liefert ein naives Wahrscheinlichkeitsmodell eine zu erwartende Zeit von rund 16 Stunden (0.9−65 Minuten), bis ein Abgleich erfolgreich ist. Sollen sogar zwei Minuten in Folge fehlerfrei empfangen werden, um die Daten der beiden Minuten gegeneinander zu testen, dann erhöht sich die erwartete Zeit auf ein Jahr, nämlich auf 0.9−125 Minuten. Die Wahrscheinlichkeit, dass bei zwei aufeinander folgenden Minuten ein bestimmtes Bit nicht empfangen wurde liegt bei 1−0.9·0.9 = 1%. Könnten wir nichtbekannte Bits von der vorherigen Minute übernehmen, ergäbe sich eine Wahrscheinlichkeit von 0.9965 ≈ 0.52 dafür, dass wir alle Bits zusammen haben. Sollen zwei aufeinander folgende dieser 2-Minuten-Einheiten für einen Integritätstest verwendet werden, dann brauch man 4 dieser 2-Minuten-Einheiten. Die Empfangsdauer von einem Jahr reduziert sich daher mit der Fehlerkorrektur auf rund 10 Minuten. Auch wenn das Wahrscheinlichkeitsmodell stark vereinfacht — Übertragungsfehler sind unabhängig voneinander und es besteht Minuten-Synchronität — zeigt die Betrachtung das Potential einer Fehlerkorrektur. Die Probleme einer Fehlerkorrektur sind erhöhter Resourcen-Bedarf an Daten- und Programmspeicher, Laufzeit, Hirnschmalz und Entwicklungszeit. Hinzu kommt die Möglichkeit der Fehlerausbreitung bei Kuckuksei-Bits. Daher müssen sämtliche Möglichkeiten der Fehler-Erkennung genutzt werden, um die Wahrscheinlichkeit falsch empfangener Daten zu minimieren, das heißt praktisch auszuschließen. Zur Fehler-Erkennung und -Vermeidung bieten sich viele naheliegende Wege, die im folgenden Abschnitt kurz und kommentarlos zusammengefasst werden. Fehler-VermeidungDie Empfangsbedingungen können das Signal abschwächen/stören und damit zu Bitfehlern oder nicht zu identifizierten Bits B? beitragen.
In simpler DCF-Software werden üblicherweise Intervalle für die Bitlängen implementiert, zum Beispiel 90ms–110ms für B0. Bei schlechter Empfangslage ist es nicht ratsam, diese Toleranz – welche im übrigen schon eine Art der Fehlerkorrektur darstellt – zu groß zu wählen. Das ist zwar verlockend, weil die Längen der Signale bei schlechtem Empfang in weiteren Grenzen variieren, es erhöht aber die Wahrscheinlichkeit von Bitfehlern. Es ist wesentlich unkritischer, für ein Bit den Wert B? einzutragen, als schwer erkennbare Bitfehler zu riskieren. Im allgemeinen kann gesagt werden, dass bei schlechtem Empfang die Bitlängen kleiner erscheinen als vom Sender ausgesandt, was wohl auf atmosphärische Störungen zurückzuführen ist. Durch die Störung wird auch bei abgesenktem Signal etwas empfangen. Daher wird öfter fälschlicherweise B0 anstatt B1 erkannt als umgekehrt. Analog wird öfter BM anstatt B0 erkannt als umgekehrt. Erschwerend kommt hinzu, dass viele DCF-Empfänger einen AGC (Automatic Gain Control) zum Pegelangleich an die Signalstärke besitzen, der das Signal ebenvalls verziehen kann. Fehler-Erkennung
SynchronisationSekunden-SyncBei verrauschtem Signal variieren sowohl die Sekunden-Anfänge als auch ihre Längen. Zudem gibt es hin und wieder Spikes auf dem Signal. Daher kann es mit einem klassischen Empfänger schwierig sein, den Sekundenanfang zu detektieren und auch bei Störungen nachzuverfolgen. Als praktikabel erweist sich die Berechnung der zyklischen Faltung mittels Haar-Wavelets wie in der Animation rechts verdeutlicht. Zunächst sei angemerkt, dass die Faltungen auch mit begrenzten Resourcen, wie sie typischerweise auf Mikrocontrollern vorherrschen, gut berechnet werden können. Im Bild ist ein schwarz-weißer Kreisring zu sehen, der eine Sekunde darstellt und aus 100 Stücken besteht; jedes Stückchen stellt einen Zeitraum von 10ms dar und ist eingefärbt anhand des vom DCF-Empfänger abgefragten Wertes: Weiß für abgesenkten Träger und Schwarz für vollen Träger. Rechts im Bild wurde wohl für 200ms (1/5 des Kreises) der Träger abgesenkt, was einem B1 entspricht. Hinzu kommen einige Spikes.
Rot unterlegt ist ein 200ms breites Haar-Wavelet, mit dem gefaltet wird.
Werden pro Sekunde N Samples abgefragt und hat das Wavelet die
Breite w, werden für j = 0..N−1 die Summen
Bis zur Sekunden-Synchronisation werden diese Faltungen berechnet. Wird ein Bit als B0 oder B1 kategorisiert, dann geht es in die Berechnung des Sekunden-Anfanges ein. Hierzu werden alle Samples der "guten" Sekunden aufsummiert – im Endeffekt also gemittelt – und nach einigen Sekunden die Faltungen über diese Summen berechnet. Liegen Positionen der Maxima für M100ms und M200ms hinreichend dicht zusammen, dann ist dies der Anfang der Sekunde. Nach erfolgtem Sekunden-Abgleich gehen die guten Bits weiterhin in die Bestimmung des Sekunden-Anfanges ein. Zur Unterscheidung, ob es sich bei einem empfangenen Wert um B0, B1, BM oder B? handelt, muss nur noch an der Position des Sekunden-Anfangs gefaltet werden. Der Sekunden-Anfang muss ständig nachgeregelt werden, weil er sich durch Änderung der Empfangslage etwas verschieben kann und durch Ungenauigkeit der internen Zeitbasis (i.d.R ein Schwingquarz) wegzulaufen scheint. Minuten-SyncFehlerkorrekturDas Zeitsignal besteht aus mehreren Ziffern, welche alle binär übertragen werden. Von einer Minute zur nächsten gibt es drei Möglichkeiten, wie sich eine solche Ziffer ändern kann:
Ziffern in diesem Sinne sind zum Beispiel:
Die Minute selbst ist nicht als Ziffer anzusehen, weil es von Minute 9 zu Minute 10 aufgrund der BCD-Codierung eine Erhöhung des Wertes von 9 auf 16 (916 auf 1016) gibt; ähnliches gilt für Stunde, Tag, Monat, und Jahr. Kann ein Reset der Ziffer ausgeschlossen werden, dann ergeben sich aus den Übergängen eines ihrer Bits folgende Schlussfolgerungen, denn eine Ziffer wird maximal um 1 erhöht:
Dabei ist die Wertigkeit der Parity-Bits von der Größenordnung wie das LSB der Werte, für die es codiert. Das Minuten-Parity hat also die Wertigkeit von Bit Minute.0. Hieran ist folgendes zu erkennen:
Ein besonders einfacher Spezialfall sind die ungeraden Minuten, d.h. Minuten, für die gilt Minute.0 = 1. Dieser Fall ist sehr einfach zu testen und liegt jede zweite Minute vor: Alle höherwertigen Bits dürfen kopiert werden. Das Minuten-Parity muss wechseln. Der Wechsel von Minute.0 geschieht in jeder Minute, unabhängig von Sommer- und Winterzeit und von Schaltjahren und -sekunden. Der Wechsel von Minute.0 kann sogar zur Minuten-Synchronisation verwendet werden, weil kein anderes Bit diese Eigenschaft hat, und daher sind sogar Bitfehler in Minute.0 erkennbar bzw. selbst wenn Minute.0 als B? empfangen wurde, ist dessen Wert bekannt. Die Fehlerkorrektur beruht in diesem Fall also auch nie auf einer falschen Grundlage wie zum Beispiel einem Fehlerbit (einer 0/1-Verwechslung). Fehlerkorrektur: Ein BeispielUnten folgen zwei Bilder der fehlerkorriegerte Daten des schwarz-weissen Spaghetti-Bildes links. Jeder Pixel des linken Bildes stellt 10ms dar: Abgesekter Träger ist in Weiß codiert, nicht-abgesenkter Träger in Schwarz. Jede Zeile repräsentiert eine Sekunde empfangener Daten und ist somit 100 Pixel breit. Die Gesamtdauer des Streifens ist 14231 Sekunden, also knapp 4 Stunden. Du kannst die PNG-Datei verwenden, um Deinen eigenen Fehler-Korrektur-Ansatz zu testen. Speichere dazu das Bild auf Deinem Rechner und wandle es mit einem Grafik-Progamm in das PBM-Format um. Das geht zum Beipiel mit convert: convert -compress None dcf-10ms-pulses.png dcf-10ms-pulses.pbm Das erzeugt die PBM-Datei, also einfachen Text. Die Datei sieht so aus (Schwarz=1 und Weiß=0), und damit kannst Du Dein Programm füttern: P1 100 14231 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 ... Folgende Bilder zeigen fehlerkorrigierte DCF-Daten. Jede Zeile enthält eine Minute, also 60 farbcodierte Sekunden:
Im linken Bildteil sind die Originaldaten, rechts die Daten nach Fehlerkorrektur. Die Blöcke sind getrennt durch einen hallblau hinterlegten Streifen von 3 Paritätsbits für Minute, Stunde und Datum, welche sich auf den rechten, fehlerkorrigierten Block beziehen.
Zeilen mit 3 grünen Parity-Bits können also weiterverarbeitet werden, indem zum Beispiel weitere Konsistenztest zur Datenintegrität folgen. Daten-Tests 1) bis 3) von oben wurden in den Bildern schon durchgeführt, Daten-Tests 4) und 5) noch nicht.
|