# Low-Density-Parity-Check-Code

Low-Density-Parity-Check-Codes, auch als LDPC oder Gallager-Codes bezeichnet, sind lineare Blockcodes zur Vorwärtsfehlerkorrektur. Sie wurden 1962 von Robert Gray Gallager im Rahmen seiner Dissertation am MIT entwickelt.
Low-Density-Parity-Check-Codes beschreiben mit Hilfe einer Matrix viele zusammenhängende Paritätsprüfungen. Es wird dabei das Prinzip einer Kontrollmatrix angewandt: $H\cdot b^{T}=0$, wobei $H$ die Kontrollmatrix (parity-check matrix) und $b$ die Folge der empfangenen Codesymbole (repräsentiert als Zeilenvektor) darstellt. H ist nur dünn besetzt (daher die Bezeichnung low-density).
Nachdem sie lange vergessen waren, erlebten sie eine Renaissance, als Rüdiger Urbanke und Thomas J. Richardson 2001 zeigten, dass sie nahe der Shannon-Grenze operieren konnten und als irreguläre LDPC effizient implementiert werden konnten. Zu den irregulären LDPC gehören die Tornado Codes für Erasure Coding (Michael Luby, Michael Mitzenmacher, Daniel A. Spielman, Amin Shokrollahi 2001).

## Notation

$(n,l,R)\;{\text{LDPC}}$
* $n$ = Codewortlänge
* $k$ = Anzahl der Paritätsbits
* $l$ = Anzahl an Informationsstellen
* $R$ = Coderate

## Begriffsdefinition

* $a^{*}$ oder $a_{l}$ Quellcodewort (Infowort)
* $a_{k}$ redundanter Teil des Kanalcodewortes
* $a$ Kanalcodewort
* $b$ Empfangsfolge
* $H$ Kontrollmatrix

## Reguläre und nicht reguläre Codes

Wichtige Kennzeichen des LDPC-Codes sind die Anzahl der 1-Bits pro Zeile ($w_{r}$) sowie die 1-Bits pro Spalte ($w_{c}$) in der Kontrollmatrix $H$. Für diese Kennzeichen gilt:
$w_{r}\ll n$ sowie $w_{c}\ll k$
Ist $w_{r}$ konstant für alle Zeilen und $w_{c}$ konstant für alle Spalten von $H$, so wird dieser Code regulär genannt.
Für einen regulären LDPC-Code gilt $w_{r}=w_{c}\cdot (l+k)/k$.
Variiert die Anzahl der Einsen, handelt es sich um einen irregulären Code. Typischerweise sind irreguläre LDPC-Code leistungsfähiger als reguläre.

## Codierung

Es gilt eine zu sendende Folge $a$ zu finden, die der Gleichung $H\cdot a^{T}=0$ genügt.
Eine mögliche Form der Codierung funktioniert folgendermaßen: Das Kanalcodewort $a$ ist zusammengesetzt aus den zu sendenden Daten $a_{l}$ (welche bekannt sind) und dem redundanten Teil $a_{k}$. Da $a$ oben genannte Formel erfüllen muss, muss $a_{k}$ entsprechend berechnet werden:
* Sei $a=[a_{k},a_{l}]$ und $H=[H_{k},H_{l}]$
* Es soll gelten: $[H_{k},H_{l}]*[a_{k},a_{l}]^{T}=0$
* Dies kann umgeformt werden: $[H_{k}][a_{k}]=[H_{l}][a_{l}]$
* Daraus ergibt sich $a_{k}^{T}=H_{k}^{-1}\cdot H_{l}\cdot a_{l}$
In Worten ausgedrückt muss dabei der invertierte quadratische – der erste – Teil H$_k$ der Kontrollmatrix mit dem verbleibenden Rest H$_l$ der Kontrollmatrix und den zu sendenden Daten a$_l$ multipliziert werden.

## Decodierung

Hierbei gilt es ebenso, das Problem $H\cdot b^{T}=0$ zu lösen. Hierzu werden häufig iterative Graph-basierte Algorithmen gewählt. Nach der Übertragung des Kanalcodewortes $a$ über einen Übertragungskanal, z. B. einen AWGN-Kanal (additives weißes gaußsches Rauschen), wird in der Regel das Wort $b_{M}$, bestehend aus reellen Werten, empfangen. Aus diesen wird, im Regelfall mit Hilfe eines iterativen Verfahrens, eine Näherungslösung berechnet. Durch die Gleichungsmatrix H werden N Gleichungen vorgegeben; jede dieser Gleichungen erlaubt es, unabhängige Informationen zu den enthaltenen Elementen zu berechnen. Nun werden diese Informationen in den anderen Gleichungsberechnungen wiederverwendet. Zu beachten ist dabei, dass die Informationen, die mit einer Gleichung berechnet wurden, in der nächsten Iteration vor der erneuten Berechnung entfernt werden müssen.

## Konstruktion von LDPC-Codes

LDPC-Codes werden durch ihre Kontrollmatrix H beschrieben. Einen LDPC-Code zu entwickeln heißt also, eine geeignete Kontrollmatrix zu finden oder zu konstruieren. Die zum Erstellen von Codewörtern benötigte Generatormatrix G kann mit Hilfe des Gauß-Jordan Verfahrens aus H hergeleitet werden. Zur Generierung von Kontrollmatrizen eignen sich u. a. die folgenden Verfahren, welche teilweise darauf basieren, die Kontrollmatrix als Tanner-Graph zu versinnbildlichen und diesen unter Zuhilfenahme verschiedener Algorithmen zu bearbeiten:
* Progressive Edge Growth (PEG)
* Konstruktion nach David J. C. MacKay und Radford M. Neal
* Zufällige Konstruktion der Kontrollmatrix
Um die Anzahl der in der Matrix vorkommenden Einsen verhältnismäßig gering zu halten, können auch noch sogenannte Row Splitting und Column Splitting Algorithmen eingesetzt werden.
Im LDPC-Code können die Paritätsprüfungen als dünnbesetzte Paritätsprüfmatrix mit $n$ Spalten und $n-k$ Zeilen ausgedrückt werden. Das heißt, dass die Anzahl der Elemente 1 viel geringer ist als die Anzahl der Elemente 0. Es gibt drei Parameter, die die dünnbesetzte Paritätsprüfungsmatrix definieren, nämlich $n$, $w_{c}$ und $w_{r}$. Dort ist $n$ die Länge des Codeworts, $w_{c}$ die Anzahl der Elemente 1 in jeder Spalte und $w_{r}$ die Anzahl der Elemente 1 in jeder Zeile. Damit die Matrix als dünnbesetzt bezeichnet wird, muss $w_{c}\ll n\cdot (n-k)$ und $w_{r}\ll n\cdot (n-k)$ gelten. Damit diese Bedingungen erfüllt sind, muss die Paritätsprüfmatrix sehr groß sein.
Es gibt reguläre und irreguläre Paritätsprüfungsmatrixen. Eine Paritätsprüfungsmatrix ist regelmäßig, wenn die Anzahl $w_{c}$ der Elemente 1 in jeder Spalte und die Anzahl $w_{r}$ der Elemente 1 in jeder Zeile gleich ist. Wenn diese Anzahlen nicht gleich sind, ist die Paritätsprüfungsmatrix irregulär. Für reguläre Matrizen ist die Dekodierung weniger komplex.
Jede Spalte der Matrix $H$ repräsentiert einen Bitknoten und jede Zeile der Matrix $H$ repräsentiert einen Kontrollknoten. Bitknoten geben die Elemente des Codesworts an. Kontrollknoten geben die Bedingungen der Paritätsprüfung an. Jede 1 zeigt an, dass es eine Verbindung (Kante) zwischen dem Bitknoten und dem Kontrollknoten gibt. Ein Beispiel Paritätsprüfungsmatrix mit $n=8$, $w_{c}=2$ und $w_{r}=4$ ist
$H={\begin{pmatrix}0&1&0&1&1&0&0&1\\1&1&1&0&0&1&0&0\\0&0&1&0&0&1&1&1\\1&0&0&1&1&0&1&0\\\end{pmatrix}}$

## Tanner-Graphen

LDPC-Codes können auch mit bipartiten Graphen dargestellt werden. Weil bei LDPC-Codes nur sehr wenige Bits beteiligt sind, ergibt sich auf diese Weise eine einfache und elegante Darstellung, die sogenannten Tanner-Graphen. Dabei werden die Elemente der zwei Mengen in unterschiedliche Klassen von Knoten eingeteilt, wobei Verbindungen nur Knoten aus unterschiedlichen Klassen mit Kanten verbunden werden. Diese zwei Klassen von Knoten werden in einem Tanner-Graph als Bitknoten und Kontrollknoten bezeichnet. Von einem Kontrollknoten führen Kanten, entsprechend der zugehörigen Prüfgleichung, zu allen Bitknoten.
Jeder Bitknoten repräsentiert also eine Bitstelle im Codewort, während jeder Kontrollknoten für eine Paritätsgleichung steht. Die Verbindung eines Knotens im Tanner-Graph mit einem beliebigen anderen Knoten wird Kante genannt. Mehrere Kanten können einen Pfad in einem Tanner-Graph bilden, welcher auf sich zurückführt. Solche Knoten- bzw. Kantenfolgen, die wieder zum Ausgangspunkt zurückführen, werden als Zyklus bezeichnet. Die Länge des kürzesten Zyklus im Tanner-Graph ist die Taillenweite. Bedingt durch den Aufbau des Tanner-Graph ist die Taillenweite immer gerade und mindestens gleich 4. Generell aber gilt, dass sich kurze Zyklen negativ auf den iterativen Decodierungsprozess auswirken. Daher sollten kurze Zyklen vermieden werden.

## Praktischer Einsatz von LDPC-Codes

LDPC-Codes werden in unterschiedlichen Gebieten der Technik angewendet. In der Regel werden sie verkettet eingesetzt. So dienen LDPC-Codes beispielsweise zur fehlerkorrigierenden Datenübertragung von digitalen Fernsehsignalen nach DVB-S2 und bei Digital Terrestrial Multimedia Broadcast (DTMB). Neben neueren WLAN-Standards wie dem IEEE 802.11n („n-WLAN“ oder „n-Draft WLAN“) implementiert auch der WLAN-ähnliche Standard 802.16e (Wimax) LDPC-Codes. Weitere Standards sind GMR-1, IEEE 802.3an, IEEE 802.22, CMMB, sowie WiMedia 1.5.
Im Amateurfunkdienst werden LDPC-Codes angewendet in den Übertragungsprotokollen FT8 und FT4 zur Fehlerkorrektur der Datenübertragung in Kombination mit einer zyklischen Redundanzprüfung (CRC) zur Fehlererkennung.