BCH-Code

Aus testwiki
Zur Navigation springen Zur Suche springen

BCH-Codes (Bose-Chaudhuri-Hocquenghem-Codes) sind zyklische fehlerkorrigierende Codes, welche in der digitalen Signalverarbeitung und Datenspeicherung eingesetzt werden. Der Name BCH ergibt sich aus den Anfangsbuchstaben der drei Wissenschaftler, die diesen Code entwickelt haben: R. C. Bose, D. K. Ray-Chaudhuri und A. Hocquenghem (1908–1990). BCH-Codes korrigieren mehrere 1-Bit-Fehler in einem längeren Nutzer-Datenwort.

Definition

Sei β eine primitive n-te Einheitswurzel in einem Erweiterungskörper des endlichen Körpers 𝔽q. Seien l,δ, δ2, und C der zyklische Code, dessen Generatorpolynom das Produkt der verschiedenen Minimalpolynome von βl,,βl+δ2 ist. (Dann besteht C also aus allen f𝔽q[x]/(xn1) mit f(βl)==f(βl+δ2)=0), dann nennt man C einen BCH-Code mit geplantem Minimalabstand δ, wobei C den Minimalabstand dδ hat.

Für den Fall l=1 spricht man von einem BCH-Code im gewöhnlichen Sinn.

Falls ein m existiert mit n=qm1 (d. h. β ist ein Erzeuger der multiplikativen Gruppe eines Körpers 𝔽qm), so spricht man von einem primitiven BCH-Code.

Ein Reed-Solomon-Code ist ein primitiver BCH-Code im gewöhnlichen Sinn, für den n=q1 gilt. Hier sind die Minimalpolynome also von der Form xβi𝔽q[x],i=1,,δ1.

Einsatzbereiche

  • Die sogenannten Reed-Solomon-Codes sind spezielle BCH-Codes und werden z. B. zur Fehlerkorrektur auf Audio-CDs eingesetzt.
  • Der BCH-Code wird auch bei der Sicherung der TPS-Daten im DVB-T-Standard genutzt.
  • Der BCH-Code wird zur Sicherung der Nutzdaten in den DVB-S-Standards genutzt. Die Daten werden zunächst BCH-, dann LDPC-kodiert. Der BCH korrigiert hierbei die Restfehlerbits, die nach der LDPC-Korrektur verbleiben können.
  • Die Funkruf-Protokolle POCSAG und FLEX verwenden den BCH(31,21)-Code

BCH(15, 7, 5)

Als Beispiel sei ein (n=15,k=7,dmin=5) BCH-Code gegeben. Die Parameter n,k,dmin sind dabei wie folgt zu interpretieren. Der Code erzeugt Codewörter mit einer Länge von n=15 Bits, wovon k=7 Bits die kodierte Information enthalten und nk Bits Redundanz zur Korrektur von Übertragungsfehlern dienen. Der Parameter dmin gibt die minimale Hammingsdistanz des Codes an.

Es gilt: Es können Übertragungsfehler von bis zu dmin1 Einzelbitfehlern erkannt werden, es können Übertragungsfehler von bis zu (dmin1)/2 Einzelbitfehlern korrigiert werden. Bündelfehler von bis zu fbk Bits werden erkannt.

Ein BCH-Code wird in der Regel durch sein Generatorpolynom beschrieben. Im gegebenen Beispiel lautet das Generatorpolynom g(x)=x8+x7+x6+x4+1. Die Anzahl der Prüfbits nk lässt sich übrigens immer aus dem Generatorpolynom ablesen. Es gilt nk=Grad(g).

Für die Dimension des Codes gilt: dimC=nGrad(g)=158=7=k.

Kodieren

Zum Kodieren mit BCH-Kodes können das Multiplikations- oder das Divisionsverfahren verwendet werden.

Multiplikationsverfahren

Beim Multiplikationsverfahren wird das zu kodierende Quellkodewort aus l=7 Bits einfach mit dem Generatorpolynom des BCH-Codes multipliziert. Es gilt: a(x)=a*(x)g(x). Dabei steht a(x) für das kodierte Kanalkodewort, a*(x) steht für das unkodierte Quellkodewort. Die Multiplikation kann sowohl mit Polynomen als auch mit einer binären Darstellung der Polynome durchgeführt werden.

Hier wollen wir ein Beispiel in binärer Darstellung durchrechnen:

Das gegebene Generatorpolynom g(x)=x8+x7+x6+x4+1 lässt sich binär als die Folge g=111010001 darstellen (die Folge ist dabei zu interpretieren als g(x)=1x8+1x7+1x6+0x5+1x4+0x3+0x2+0x1+1x0).

Als zu kodierendes Quellkodewort dient in unserem Beispiel a*=1001011 bzw. a*(x)=1x6+0x5+0x4+1x3+0x2+1x1+1x0.

Um das kodierte Kanalkodewort zu erhalten, müssen wir jetzt also einfach a* mit g multiplizieren:

a=a*g=1001011111010001=111100010111011

Divisionsverfahren

Das Divisionsverfahren ermöglicht es zu einem gegebenen Quellkodewort genau jenes Kanalkodewort zu ermitteln, welches das gegebene Quellkodewort als Präfix hat, weswegen man sagt, das Verfahren liefert einen systematischen Kode. Für ein gegebenes Generatorpolynom g und ein Quellkodewort a* errechnet man das zugehörige Kanalkodewort a nach Divisionsverfahren wie folgt:

a:=a*xk(a*xk)modg

Das heißt, man muss den Rest der Polynom-Division (a*xk):g ermitteln und diesen von a*xk subtrahieren. Am Beispiel von oben:

g=x8+x7+x6+x4+1=^111010001a*=x6+x3+x+1=^1001011a*xk=x14+x11+x9+x8=^100101100000000

Die Division in Koeffizienten-Schreibweise lautet dann:

 100101100000000 : 111010001 = 1100111
  111111010
   001010110
    010101100
     101011000
      100010010
       110000110
        --------
        01010111


Damit gilt a=10010110000000001010111=1001011a*01010111.

Dekodieren

Die Dekodierung kann mittels verschiedener Verfahren nach folgendem Muster erfolgen:

  1. Bestimmung des Syndromwertes (Divisionsrest), indem das empfangene Kanalkodewort a(x) durch das Generatorpolynom g(x) dividiert wird. Ist der Rest ungleich 0 liegen ein oder mehrere Fehler vor.
  2. Bestimmen des Fehlerpolynoms.
  3. Bestimmung der Nullstellen des Fehlerpolynoms zur Ermittlung der Fehlerpositionen im Codewort.
  4. Bestimmung der Fehlerwerte

Übliche Algorithmen zur Dekodierung von BCH-Codes sind der Berlekamp-Massey-Algorithmus oder der Peterson-Gorenstein-Zierler-Algorithmus.

Beispiel

Wenn das Codewort vom obigen Beispiel ohne Fehler übertragen wird, bleibt als Rest der Division a:g Null. Die Division in Koeffizienten-Schreibweise lautet dann:

<!-- Berechnungen können hier nachgerechnet werden: http://www.flechtmann.net/crc/index.php -->
  100101101010111 : 111010001 = 1100111
   111010001
    001010011
     010100110
      111010001
       100111001
        111010001
         --------
         '''00000000'''

Würde das Codewort während der Übertragung verfälscht, beispielsweise zu 101101011010111 (Stellen 3, 7 und 8), ergibt sich nach der Polynomdivision ein von 0 verschiedenes Fehlersyndrom:

  101101011010111 : 111010001 = 1111100
   101110100
    101001011
     100110100
      111001011
       000110101
        001101011
         --------
         '''01101001'''

Literatur