Codierte Übertragung

Aus der Mikrocontroller.net Artikelsammlung, mit Beiträgen verschiedener Autoren (siehe Versionsgeschichte)
Wechseln zu: Navigation, Suche

Einleitung[Bearbeiten]

Für die Codierung wie sie hier beschrieben wird gibt es sehr viele Anwendungen. Allen gemeinsam ist, dass man einen Kanal mit sehr schlechtem Signal-/Rauschverhältnis hat, so schlecht dass man mit normalen Übertragungsverfahren nicht mal feststellen könnte dass überhaupt etwas gesendet wird. Der Trick besteht darin, dass man statt einem einzigen Datenbit (1/0) sehr lange, dem Empfänger bekannte Codefolgen sendet. Auch wenn die Folge bei der Übertragung stark verfälscht wird kann der Empfänger noch entscheiden ob es sich tendentiell eher um die eine (1) oder um die andere (0) Folge handelt.

Grundsätzlicher Ablauf[Bearbeiten]

Um die Berechnung anschaulicher zu machen interpretieren wir binäre Werte als -1/+1 statt 1/0.

Wir möchten die drei Datenbits (1, -1, -1) übertragen.

Für die Codierung benötigen wir eine binäre Codefolge. In diesem Beispiel hat sie die Länge 7 und lautet (1, -1, 1, 1, -1, 1, -1). Die einzelnen Bits dieser Folge nennen wir zur besseren Unterscheidung von den Datenbits "Chips".

Codierung[Bearbeiten]

Bei der Codierung wird für jedes Bit der Datenfolge einmal die Code-Folge gesendet. Für eine "1" senden wir die gewählte Codesequenz unverändert, für eine "-1" die invertierte Codesequenz. Oder anders ausgedrückt, wir multiplizieren die langsame Datenfolge mit der 7-mal so schnellen Codefolge.

Codierung Sender.png

Statt 3 Bit müssen wir nun 3*7 Bit über den Kanal übertragen, das heißt die Übertragungsrate hat sich auf ein 7-tel reduziert. Oder anders gesagt, die Chiprate ist 7-mal so hoch wie die Datenrate.

Decodierung[Bearbeiten]

Zur Vereinfachung nehmen wir erst mal an, dass der Empfänger synchron zum Sender arbeitet. Der Empfänger weiß also wo ein neues Datenbit beginnt.

Um die Daten zu dekodieren, multipliziert der Empfänger die empfangene Folge selbst wieder mir der Codefolge, und heraus kommen die ursprünglich gesendeten Daten.

Codierung Empfaenger.png

Wenn allerdings Fehler bei der Übertragung aufgetreten sind wird das decodierte Signal für die Länge der Codesequenz nicht perfekt "-1" oder "1" sein, sondern es werden zwischen drin mal "gekippte" Chips auftreten. Um konkret zu entscheiden ob das Datenbit "-1" oder "1" ist summiert der Empfänger alle decodierten Chips einer Periode auf, und wenn die Summe <0 ist entscheidet er sich für "-1", ansonsten für "1". Im Idealfall, d.h. wenn keine Fehler aufgetreten sind, erreicht die Summe das Maximum (7 bzw. -7). Bei kleinen Werten um die 0 sind viele Fehler aufgetreten und die Entscheidung ist unsicher.

Codierung Empfaenger Fehler.png

Synchronisierung/Signalerfassung (Acquisition)[Bearbeiten]

Meistens ist es nicht ganz so einfach, da der Empfänger nicht synchron zum Sender arbeitet. Er weiß nicht wo ein Datenbit aufhört und das nächste anfängt, er kann also nicht einfach ein bisschen was empfangen und mit der Codefolge multiplizieren, sondern er muss erstmal herausfinden an welcher Stelle der Codefolge der Empfänger gerade ist. Dazu wird das empfangene Signal kontinuierlich mit der Codefolge multipliziert und aufsummiert (siehe oben). Das entspricht einer Korrelation des Signals mit der Codefolge. Wenn der Betrag der Korrelationssumme sehr groß wird hat man den Beginn einer Codefolge erkannt, die Synchronisation zum Sender ist also hergestellt.

Chiptakt-Synchronisierung[Bearbeiten]

Um ein optimales Ergebnis zu erhalten muss nicht nur der Datentakt, sondern auch der Chiptakt synchronisiert werden. Dazu kann man das Empfangssignal überabtasten, das heißt nicht nur einen Signalwert pro Chip bestimmen, sondern mehrere (z. B. 4). Die selbe Überabtastung wendet man auf die Codefolge an und führt damit die Korrelation durch. Wenn man jetzt das beste Korrelationsergebnis verwendet hat man nicht nur den Datentakt, sondern auch den Chiptakt auf 1/4 Chip genau synchronisiert.

Nachführung (Tracking)[Bearbeiten]

Wegen Frequenzabweichungen zwischen Sender und Empfänger hält die Synchronisation nicht ewig, der Empfänger muss kontinuierlich nachsynchronisieren. Dabei muss nicht jedes Mal ein kompletter Block korreliert werden, sondern es reicht wenn man sich ein paar Korrelationsergebnisse um den erwarteten Zeitpunkt herum anschaut und auf den größten synchronisiert.

CDMA (Code Division Multiple Access)[Bearbeiten]

CDMA funktioniert im Prinzip genauso, nur dass jetzt mehrere Sender das selbe Frequenzband mit jeweils unterschiedlichen Codes benutzen. Wenn diese Codes untereinander eine hinreichend kleine Kreuzkorrelation aufweisen, dann wirken die Signale der jeweils unerwünschten Sender als Rauschen auf den Empfänger, nur das Signal des gewünschten Senders wird durch die Korrelation mit der bekannten Codefolge extrahiert.

Ein einfaches Beispiel für ein CDMA-Verfahren ist GPS.

Wahl der Codesequenz[Bearbeiten]

Um das Signal möglichst gut erfassen zu können (siehe weiter oben unter Synchronisierung) muss die Codesequenz eine möglichst scharfe Autokorrelationsfunktion haben. Beliebte Codefolgen sind zum Beispiel:

  • m-Sequenz (MLS, Maximum Length Sequence): wird durch ein rückgekoppeltes Schieberegister erzeugt. Sehr gute Autokorrelation.
  • Gold-Code: wird durch Verknüpfung von zwei m-Sequenzen gewonnen. Etwas schlechtere Ak-Eigenschaften als die MLS, dafür weniger Kreuzkorrelation zwischen unterschiedlichen Codes -> gut für CDMA. Wird bei GPS verwendet.
  • Barker-Code: hat die Eigenschaft, dass die Autokorrelationsfunktion eine maximal hohe Spitze aufweist und sonst gleich Null ist. Barker-Codes sind allerdings nur bis zur Länge 13 bekannt.

Anwendungsbeispiel: 433 MHz-Funkübertragung[Bearbeiten]

Dieses kleine Experiment zeigt, wie man mit billigen Funkmodulen Daten mehrere Kilometer weit übertragen kann. (Bitte beachten, dass im 433MHz-Band >1mW nur mit 10% Duty-Cycle gesendet werden darf, es müssen bei kontinuierlichem Betrieb mit 10mW also Pausen zwischen den Codefolgen eingebaut werden).

Sender[Bearbeiten]

Das Sendemodul ist ein 10 mW Aurel FM-Sender von Conrad. Ein AVR sendet kontinuierlich eine 1000-8000 Bit lange Codefolge (der Einfachheit halber ein Ausschnitt einer 65535 Bit langen m-Sequenz). Die Folge wird immer gleich gesendet, nicht invertiert, es werden also nur "Einsen" übertragen. Den Sourcecode gibt es hier.

Empfänger[Bearbeiten]

Das Empfängermodul (Conrad) ist an die Soundkarte angeschlossen. Die empfangenen Daten werden von einem Octave-Programm ausgewertet (Sourcecode).

Ergebnis[Bearbeiten]

Es konnten Daten über eine Entfernung von 3 km übertragen werden (Korrelationsergebnis). Es hat sich herausgestellt dass die Entfernung (innerhalb von ein paar km um den Sender) für die Empfangsqualität weniger eine Rolle spielt als die Umgebung. Bei kompletter Abschattung durch große Gebäude oder Berge ist auch in 1 km Entfernung nichts zu machen, wenn zwischen Sender und Empfänger halbwegs offenes Gelände ist sind auch in mehreren Kilometern Entfernung einwandfreie Signale zu empfangen, und man sollte auch mit deutlich kürzeren Codes (< 100) gute Ergebnisse bekommen.

Siehe auch[Bearbeiten]