Kryentech Logo Elektrotechnik Tool

Hamming Code und LDPC: Fehlerkorrektur interaktiv verstehen

Interaktive Demos für Fehlerkorrekturcodes: Hamming(7,4) zeigt die direkte 1-Bit-Korrektur, der LDPC-Tanner-Graph zeigt Paritätsprüfungen und einfache Bit-Flipping-Korrektur.

Passender Hintergrund: Dieses Tool ergänzt den Bericht Fehlerkorrekturcodes in biometrischen Authentifizierungssystemen. Hamming(7,4) ist bewusst einfach gewählt, damit Syndrom und Fehlerkorrektur direkt sichtbar werden.

Fehlerkorrekturcodes bauen gezielt Redundanz in Daten ein. Dadurch kann ein Empfänger erkennen, ob ein Bitmuster noch zu den gültigen Codewörtern passt. Hamming(7,4) zeigt dieses Prinzip sehr direkt: Ein einzelner Bitfehler erzeugt ein Syndrom, das unmittelbar auf die fehlerhafte Position zeigt. LDPC-Codes gehen einen Schritt weiter und beschreiben viele einfache Paritätsprüfungen als dünn besetztes Netz aus Bits und Prüfungen. Genau dieses Netz wird als Tanner-Graph dargestellt.

Interaktiver Hamming(7,4)-Demonstrator

Hamming(7,4) nimmt 4 Datenbits und ergänzt 3 Paritätsbits. Damit entsteht ein 7-Bit-Codewort, das genau einen Bitfehler erkennen und korrigieren kann.

1. Datenbits eingeben

2. Codewort

Positionen 1, 2 und 4 sind Paritätsbits. Positionen 3, 5, 6 und 7 enthalten die Datenbits.

3. Fehler simulieren

Klicke ein Bit im empfangenen Wort an, um einen Übertragungsfehler zu simulieren.

4. Syndrom und Korrektur

Korrigiertes Codewort

Korrigierte Datenbits

Prüfmatrix H

H = [1 0 1 0 1 0 1]
[0 1 1 0 0 1 1]
[0 0 0 1 1 1 1]

Die Spalten der Matrix entsprechen den Bitpositionen 1 bis 7. Das Syndrom zeigt bei einem 1-Bit-Fehler direkt auf die Spalte und damit auf die fehlerhafte Position.

LDPC-Code als Tanner-Graph

Low Density Parity Check Codes werden häufig über einen Tanner-Graph dargestellt. Links stehen die Daten- beziehungsweise Codebits, rechts die Paritätsprüfungen. Jede Verbindung bedeutet: Dieses Bit ist Teil dieser Prüfung.

Der Begriff „low density“ bedeutet, dass jede Paritätsprüfung nur wenige Bits betrachtet und jedes Bit nur in wenigen Prüfungen vorkommt. Dadurch bleibt die Prüfmatrix groß, aber dünn besetzt. Das ist praktisch, weil der Decoder nicht eine riesige Gleichung auf einmal lösen muss, sondern viele lokale Prüfungen auswertet.

In der Grafik sind die runden Knoten Variablenknoten \(v1\) bis \(v6\). Sie stehen für die Bits des Codeworts. Die rechteckigen Knoten c1 bis c3 sind Prüfknoten. Eine Prüfung ist erfüllt, wenn die XOR-Summe aller verbundenen Bits 0 ergibt. Ist die XOR-Summe 1, ist diese Prüfung verletzt und wird rot markiert.

Codewort prüfen

H = [1 1 0 1 0 0]
[0 1 1 0 1 0]
[1 0 1 0 0 1]

Tanner-Graph

v1 v2 v3 v4 v5 v6 c1 c2 c3

Rot markierte Prüfknoten sind verletzt. Ein einfacher Bit-Flipping-Decoder zählt, welches Bit an den meisten verletzten Prüfungen beteiligt ist. Das ist nicht der vollständige LDPC-Decoder moderner Kommunikationssysteme, zeigt aber die Grundidee: Fehler werden über mehrere lokale Paritätsprüfungen eingegrenzt.

Was zeigt der LDPC-Tanner-Graph?

Ein Tanner-Graph macht sichtbar, welche Bits gemeinsam geprüft werden. Im kleinen Beispiel gilt:

c1 prüft: v1 XOR v2 XOR v4 = 0
c2 prüft: v2 XOR v3 XOR v5 = 0
c3 prüft: v1 XOR v3 XOR v6 = 0

Wenn ein einzelnes Bit kippt, werden genau die Prüfungen verletzt, an denen dieses Bit beteiligt ist. Der Bit-Flipping-Schritt sucht deshalb das Bit, das in den meisten verletzten Prüfungen vorkommt, und kippt es zurück. Bei großen LDPC-Codes wird dieses Prinzip iterativ und mit Wahrscheinlichkeiten beziehungsweise Zuverlässigkeitswerten erweitert.

Datenkorrektur als Code

Für echte Anwendungen ist die Demonstration nur der erste Schritt. Entscheidend ist, dass die Korrektur reproduzierbar im Code umgesetzt wird. Hier sind kompakte Beispiele für Hamming(7,4) in Python, Structured Text und C.

Python

def hamming74_correct(bits):
    # bits: Liste mit 7 Werten, Positionen 1..7 werden intern 0..6 adressiert
    s1 = bits[0] ^ bits[2] ^ bits[4] ^ bits[6]
    s2 = bits[1] ^ bits[2] ^ bits[5] ^ bits[6]
    s4 = bits[3] ^ bits[4] ^ bits[5] ^ bits[6]
    position = s1 + 2 * s2 + 4 * s4

    corrected = bits[:]
    if 1 <= position <= 7:
        corrected[position - 1] ^= 1

    data = [corrected[2], corrected[4], corrected[5], corrected[6]]
    return corrected, data, position

Structured Text (IEC 61131-3)

s1 := bits[1] XOR bits[3] XOR bits[5] XOR bits[7];
s2 := bits[2] XOR bits[3] XOR bits[6] XOR bits[7];
s4 := bits[4] XOR bits[5] XOR bits[6] XOR bits[7];

errorPosition := BOOL_TO_INT(s1) + 2 * BOOL_TO_INT(s2) + 4 * BOOL_TO_INT(s4);

IF (errorPosition >= 1) AND (errorPosition <= 7) THEN
    bits[errorPosition] := NOT bits[errorPosition];
END_IF;

data[1] := bits[3];
data[2] := bits[5];
data[3] := bits[6];
data[4] := bits[7];

C

int hamming74_correct(unsigned char bits[7], unsigned char data[4]) {
    int s1 = bits[0] ^ bits[2] ^ bits[4] ^ bits[6];
    int s2 = bits[1] ^ bits[2] ^ bits[5] ^ bits[6];
    int s4 = bits[3] ^ bits[4] ^ bits[5] ^ bits[6];
    int position = s1 + 2 * s2 + 4 * s4;

    if (position >= 1 && position <= 7) {
        bits[position - 1] ^= 1;
    }

    data[0] = bits[2];
    data[1] = bits[4];
    data[2] = bits[5];
    data[3] = bits[6];
    return position;
}

Einordnung

Die Hamming-Demo zeigt den einfachsten Fall sehr klar: Ein einzelner Fehler erzeugt ein eindeutiges Syndrom und kann direkt korrigiert werden. Der LDPC-Teil zeigt die gleiche Grundidee in einer graphischen Form: Viele lokale Paritätsprüfungen liefern Hinweise darauf, welche Bits wahrscheinlich fehlerhaft sind.

In echten Systemen werden solche Verfahren größer und robuster aufgebaut. Statt nur sieben oder sechs Bits werden lange Codewörter verwendet, und die Korrektur läuft iterativ über viele Prüfungen. Das Prinzip bleibt aber gleich: Redundanz macht Fehler sichtbar und ermöglicht, verrauschte Daten wieder in ein gültiges Bitmuster zurückzuführen.