Codes

Wie Nachrichten in Symbolfolgen übersetzt werden — von ASCII über Gray-Code bis zur Fehlerkorrektur.

Ein Code in der Datenübertragung ist eine Methode, um die Informationen der zu übertragenden Nachricht in eine bestimmte Folge von Symbolen oder Signalen umzuwandeln. Ziel ist eine effiziente und fehlerfreie Übertragung über potenziell gestörte Kommunikationskanäle.

Bekannte Beispiele

  • ASCII-Code – repräsentiert numerische und alphanumerische Zeichen als 8-Bit-Gruppen
  • Baudot-Code – historischer Telegrafie-Code nach dem internationalen Telegrafenalphabet Nr. 2, bis heute Grundlage von RTTY im Amateurfunk
  • Gray-Code – Binärcode, bei dem sich benachbarte Codewörter nur in genau einem Bit unterscheiden und der so Fehlererkennung ermöglicht

Anwendungsbereiche von Codes

  1. Fehlerkorrektur (FEC-Codes) – Erkennen und Korrigieren von Fehlern, die durch Rauschen und Störungen entstehen
  2. Datenkompression – Reduzierung von Speicherbedarf und Bandbreite
  3. Modulation – Umwandlung digitaler Signale in analoge Signale zur Übertragung
  4. Synchronisation – Koordination mehrerer Systeme bei der Verarbeitung digitaler Signale
  5. Kryptographie – Verschlüsselung digitaler Daten gegen unbefugten Zugriff
  6. Leistungssteigerung – Verbesserung der Performance von DSP-Algorithmen durch Reduzierung des Rechenaufwands
  7. Implementierung komplexer Algorithmen – Ermöglicht die Umsetzung anspruchsvoller DSP-Algorithmen

Coding Gain: warum sich Redundanz lohnt

Nach dem Hartley-Shannon-Gesetz hängt die maximal übertragbare Datenrate von Kanalbandbreite $B$ und Signal-Rausch-Verhältnis (SNR) ab:

$$C = B \cdot \log_2(1 + \text{SNR}) \quad \text{Symbole/s}$$

Diese Gleichung erlaubt einen Tausch: Bandbreite gegen SNR. Fügt man einem Signal Redundanz per Codierung hinzu, kann derselbe Bitfehleranteil bei einem niedrigeren SNR erreicht werden — dieser Gewinn heißt Coding Gain (in dB). Er wird von einem Noise Gain (durch die zusätzlich übertragenen Redundanzbits steigt bei gleicher Datenrate die Symbolrate, was wiederum etwas SNR kostet) teilweise wieder aufgezehrt; in der Praxis überwiegt der Coding Gain meist deutlich:

Code Coding Gain Noise Gain
Single-Parity-Check 3 dB 1,75 dB
Hamming 4,7 dB 2,36 dB
1/2-Faltungscode (Convolutional) 7 dB 3 dB

Leitungscodes (Line Codes)

Leitungscodes verändern nicht die Nutzdaten, sondern nur deren physikalische Repräsentation auf der Übertragungsstrecke — mit Blick auf Bandbreitenbedarf, Gleichstromfreiheit und Taktrückgewinnung.

Einfache Antipolar- und Bipolar-Codes

Diese Codes benötigen die geringste Bandbreite, enthalten aber keine eingebettete Taktinformation — der Empfänger muss sich anderweitig synchronisieren:

Code Kodierregel Besonderheit
NRZ-L 0 = High, 1 = Low (Pegel = Bitwert) kein Flankenzwang, Gleichanteil vorhanden
NRZI 1 = Flanke am Intervallanfang, 0 = keine Flanke Bitwert steckt in der Änderung, nicht im Pegel
Unipolar RZ Signal kehrt in Intervallmitte auf 0 zurück doppelte Bandbreite ggü. NRZ, aber Taktinformation bei Einsen
Polar NRZ 0 = „+“, 1 = „–“ (bipolar statt unipolar) vom PC-Seriellport (RS-232) verwendet
Polar RZ wie Polar NRZ, zusätzlich Rückkehr auf 0 in Intervallmitte liefert Taktinformation für jedes Bit
Bipolar-AMI (Alternate Mark Inversion) 0 = 0, 1 = alternierend „+“/„–“ erkennt Bitfehler an Bipolar Violations (siehe unten); verliert Takt bei langen Nullfolgen
Pseudoternary 0 = alternierend „+“/„–“, 1 = 0 AMI mit vertauschten Rollen von 0 und 1
Was ist eine Bipolar Violation? Der Name AMI (Alternate Mark Inversion, „alternierende Invertierung der Marks“) beschreibt die Regel direkt: In der historischen Telegrafie-Terminologie ist eine „1“ ein Mark und eine „0“ ein Space. Bei AMI wechselt jede übertragene „1“ ihre Polarität ab — auf ein „+“ folgt zwingend ein „–“, dann wieder „+“ und so weiter (Nullen ändern daran nichts, sie werden einfach als 0-Pegel gesendet). Zwei „1“ mit derselben Polarität direkt hintereinander (z. B. „+“ gefolgt von „+“ statt dem erwarteten „–“) dürften bei korrekter Übertragung also nie vorkommen — genau das nennt man eine Bipolar Violation. Taucht sie trotzdem auf, muss unterwegs ein Bit gekippt worden sein: ein einfacher, eingebauter Fehlerindikator, ganz ohne zusätzliches Prüfbit.

Manchester-Familie

Das Manchester-Codierung-Verfahren garantiert dagegen eine Flanke in jeder Bitzellenmitte — auf Kosten der doppelten Bandbreite gegenüber NRZ. Das ist die Codierung, die 802.3-Ethernet (10BASE-T u. a.) verwendet; die verwandte Differential-Manchester-Variante (polaritätsunabhängig, u. a. bei Token Ring/802.5) wird im selben Artikel behandelt.

Blockcodes gegen lange Nullfolgen

Reine Bipolar-Codes verlieren bei langen Folgen identischer Bits die Taktreferenz — bei AMI heißt das konkret: eine lange Nullfolge sendet einfach dauerhaft 0-Pegel, ohne jede Flanke, an der sich der Empfänger orientieren könnte. Block-Substitutionscodes lösen das, indem sie eine solche Nullfolge durch ein Muster mit absichtlichen Bipolar Violations ersetzen. Der Empfänger erkennt dieses Muster wieder und weiß: „Das war keine echte Bipolar Violation (also kein Fehler), sondern die codierte Nullfolge“ — und bekommt gleichzeitig die fehlenden Flanken für die Taktrückgewinnung:

Code Ersetzt Einsatz
B8ZS jede Folge von 8 Nullen durch ein Muster mit 2 absichtlichen Bipolar Violations T1-Übertragungssysteme (Nordamerika)
HDB3 jede Folge von 4 Nullen durch ein Muster mit 1 absichtlichen Bipolar Violation E1-Übertragungssysteme (Europa)

Mehrpegel-Blockcodes

Statt nur zwei Signalpegel (0/1) zu nutzen, kennen diese Codes drei oder vier Spannungsstufen pro Symbol — vergleichbar mit einem Zahlenschloss, das pro Stelle nicht nur zwischen 0 und 1, sondern zwischen mehreren Ziffern wählen kann. Dadurch steckt mehr Information in einem einzelnen Symbol, und für dieselbe Datenrate werden weniger Symbole pro Sekunde benötigt — also weniger Bandbreite:

  • kBnT-Codes (z. B. 4B3T): Statt einzelner Zweipegel-Symbole werden mehrere Bits gebündelt und gemeinsam in ein paar Symbole mit drei Spannungsstufen übersetzt — bei 4B3T etwa werden aus je 4 Bit 3 Symbole. Weil dabei etwas mehr Symbolkombinationen zur Verfügung stehen, als für die reinen Nutzdaten nötig wären, bleibt ein wenig Spielraum übrig. Dieser Spielraum wird genutzt, um zu verhindern, dass das Signal auf Dauer mehr „+“- als „–“-Pegel enthält (oder umgekehrt): Es wird mitgezählt, wie sich Plus und Minus die Waage halten, und bei Bedarf gegengesteuert.
  • 2B1Q (zwei Bits, ein Symbol mit vier Spannungsstufen): Zwei Bits werden gemeinsam als ein Symbol mit vier möglichen Stufen übertragen. Dadurch reicht die halbe Symbolrate gegenüber einem einfachen Zweipegel-Code — das spart Bandbreite. Eingesetzt u. a. im ISDN-U-Basisanschluss (160 kbit/s) und bei HDSL (784 kbit/s über Kupferdoppelader).

Fehlererkennende und -korrigierende Codes

Diese Codes verändern nicht die physikalische Signalform, sondern fügen der Nutzdatenfolge selbst Redundanz hinzu, um Übertragungsfehler zu erkennen oder zu korrigieren.

Parität und Prüfsummen

Code Prinzip Grenze
Single-Parity-Check 1 Paritätsbit über den ganzen Block erkennt nur eine ungerade Anzahl Bitfehler
Prüfsumme (Checksum) Bytes werden addiert, Übertrag verworfen einfach, aber schwach, wenn genau das höchstwertige Bit dauerhaft auf einem falschen Wert „hängt“ (Stuck-at-Fehler) — dieser Fehler geht beim Verwerfen des Übertrags oft unbemerkt unter
Residue-Checksum wie Prüfsumme, Übertrag wird zur Summe zurückaddiert behebt die Schwäche der einfachen Prüfsumme bei MSB-Fehlern
CRC (u. a. CRC-16, CRC-32) Polynomdivision des Datenblocks, Rest wird angehängt erkennt >99,9 % der Fehler; lokalisiert die Fehlerposition nicht — nur für Protokolle mit Neuübertragung (ARQ) geeignet

Vorwärtsfehlerkorrektur (FEC)

Wo eine Neuübertragung nicht möglich oder zu teuer ist, korrigiert der Empfänger Fehler direkt aus der empfangenen Redundanz:

  • Hamming-Code — mehrere überlappende Paritätsprüfungen lokalisieren und korrigieren einen Einzelbitfehler direkt über das Syndrom; ausführlich samt interaktivem Simulator im eigenen Artikel.
  • BCH-Code — zyklische Blockcodes, die (anders als der auf 31 Bit begrenzte Hamming-Code) eine frei wählbare Fehlerkorrekturstärke $t$ und beliebig lange Codewörter erlauben. Statt der einfachen XOR-Paritätsprüfung von Hamming steckt dahinter eine deutlich abstraktere mathematische Konstruktion (Polynom-Arithmetik über einem endlichen Zahlbereich) — der Preis für die frei wählbare Korrekturstärke ist ein spürbar komplexeres Konstruktionsverfahren; ausführlich samt interaktivem Simulator im eigenen Artikel.
  • Faltungscodes (Convolutional Codes) — im Gegensatz zu Blockcodes ein Coder mit Gedächtnis: Jedes Ausgangsbit hängt nicht nur vom aktuellen, sondern auch von vorangegangenen Eingangsbits ab, decodiert mit dem Viterbi-Algorithmus. Weit verbreitet, da Leistung und Implementierungsaufwand meist günstiger ausfallen als bei vergleichbaren Blockcodes — ausführlich samt interaktivem Trellis-Simulator im eigenen Artikel.
  • LDPC-Code (Low-Density Parity-Check) — ein Blockcode wie Hamming/BCH/Golay, aber mit dünn besetzter Prüfmatrix und iterativer Decodierung (Message Passing) statt Syndromtabelle, weil er typischerweise mit hunderten bis zehntausenden Bit Blocklänge eingesetzt wird. Standard bei FT8, DVB-S2 und modernem WLAN — ausführlich samt interaktivem Bit-Flipping-Simulator im eigenen Artikel.
Die vier Fehlerkorrekturfamilien unterscheiden sich vor allem darin, wo sie ansetzen: Leitungscodes (NRZ, Manchester, AMI, …) formen das physikalische Signal, Paritäts-/Prüfsummen-/CRC-Codes erkennen Fehler auf Datenebene, und Hamming-/BCH-/Faltungscodes korrigieren sie direkt beim Empfänger, ohne Rückkanal.

Auf dieser Seite behandelte Codes