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
- Fehlerkorrektur (FEC-Codes) – Erkennen und Korrigieren von Fehlern, die durch Rauschen und Störungen entstehen
- Datenkompression – Reduzierung von Speicherbedarf und Bandbreite
- Modulation – Umwandlung digitaler Signale in analoge Signale zur Übertragung
- Synchronisation – Koordination mehrerer Systeme bei der Verarbeitung digitaler Signale
- Kryptographie – Verschlüsselung digitaler Daten gegen unbefugten Zugriff
- Leistungssteigerung – Verbesserung der Performance von DSP-Algorithmen durch Reduzierung des Rechenaufwands
- 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 |
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.
Auf dieser Seite behandelte Codes
Gold-Code
Pseudozufallsfolgen
Gray-Code
Ein-Bit-Übergänge
Hamming-Code
Fehlerkorrigierende Codes, 1950
BCH-Code
Zyklischer Code mit frei wählbarer Korrekturstärke
Golay-Code
Perfekter Code für drei gleichzeitige Bitfehler
CRC-Code
Polynomdivision zur Fehlererkennung
Faltungscode / Viterbi
Fehlerkorrektur mit Gedächtnis statt festen Blöcken
LDPC-Code
Dünn besetzte Prüfmatrix, iterativ decodiert per Message Passing
Manchester-Code
Leitungscodierung über Signalübergänge
BCD-Code
8-4-2-1-Codierung für Dezimalstellen
Baudot-Code
5-Bit-Zeichencode für Fernschreiber und RTTY
Varicode
Selbstsynchronisierender Zeichencode für PSK31