Hamming-Abstand

Hamming-Abstand

Der Hamming-Abstand, die Hamming-Distanz und das Hamming-Gewicht, benannt nach dem US-amerikanischen Mathematiker Richard Wesley Hamming (19151998), sind Maße für die Unterschiedlichkeit von Zeichenketten. Der Hamming-Abstand zweier Blöcke mit fester Länge (so genannter Codewörter) ist dabei die Anzahl der unterschiedlichen Stellen.

Die Hamming-Distanz wird zur Fehlererkennung und zur Fehlerkorrektur benutzt, indem Dateneinheiten, die über eine Übertragungsstrecke empfangen werden, mit gültigen Zeichen verglichen werden. Eine etwaige Korrektur der Zeichen erfolgt nach dem Wahrscheinlichkeitsprinzip. Ob eine Fehlererkennung oder -korrektur stattfinden kann, hängt von der Hamming-Distanz ab.

Häufig handelt es sich um binär dargestellte Zahlen, so zum Beispiel in der Kodierungstheorie. In diesem Fall lässt sich rechnerisch der Vergleich durch eine XOR-Operation und das Abzählen der resultierenden Einsen realisieren. Für andere Zahlensysteme oder Alphabete existieren jedoch ebenfalls wichtige Anwendungen.

Inhaltsverzeichnis

Definition

Sei Σ ein endliches Alphabet, x=(x_1,\dots,x_n) und y=(y_1,\dots,y_n) aus Σn, d. h. gleichlange Worte über diesem Alphabet. Dann definiert man den Hammingabstand zwischen den x und y als:

\Delta(x,y):=\sum_{x_i \not= y_i} 1,\quad i=1,...,n

Beispiele

00110 und 00100 → Hamming-Abstand=1
12345 und 13344 → Hamming-Abstand=2
Haus und Baum → Hamming-Abstand=2

Hamming-Gewicht

Das Hamming-Gewicht einer Zeichenkette ist definiert als die Anzahl der Zeichen mit Ausnahme des Nullzeichens. Hierbei handelt es sich zugleich um den Hamming-Abstand zum Nullvektor (einer gleichlangen Zeichenkette, die nur aus Nullzeichen besteht).

Bei ganzen Zahlen in Binärdarstellung ist es die Anzahl der gesetzten Bits. Beispiel: das Hamming-Gewicht von 1011 ist gleich 3.

Programmbeispiel

In der Programmiersprache C kann das Hamming-Gewicht eines 8-Bit-Wortes wie folgt ermittelt werden:

int hammingWeight( unsigned char word )
{
  int weight = 0; // Anzahl 1-Bits, beginnt mit 0
  while( word ) { // Solange noch Bits vorhanden sind...
  {
    if( word & 1 ) { // Zähle das unterste Bit, sofern es nicht 0 ist
      weight++;
    }
    word >>= 1; // Entferne unterstes Bit, verschiebe restliche Bits um 1 nach rechts
  }
  return weight; // Rückgabe der Anzahl der Bits
}

Hamming-Abstand eines Codes

Unter dem Hamming-Abstand eines kompletten Codes versteht man das Minimum aller Abstände zwischen Wörtern innerhalb des Codes.

Beispiel:

Ein Code besteht aus folgenden drei Wörtern:
x = 00110,
y = 00101,
z = 01110.
Der Hamming-Abstand zwischen x und y ist 2.
Um y zu generieren muss man zwei Bits (von rechts nach links das erste und zweite Bit) ändern: y = x XOR 00011.
Der Hamming-Abstand zwischen x und z ist 1.
Um z zu generieren muss man ein Bit (das vierte) ändern: z = x XOR 01000.
Der Hamming-Abstand zwischen y und z ist 3.
Um z zu generieren muss man drei Bits ändern: z = y XOR 01011.

Der kleinste der drei Abstände ist 1, also ist der Hamming-Abstand des Codes ebenfalls gleich 1.

Wichtig ist die Hamming-Distanz, wenn man Codes entwickeln möchte, die Fehlererkennung (EDC) oder -korrektur (ECC) ermöglichen.

Bei Codes mit Hamming-Abstand h können alle (h-1)-Bit-Fehler erkannt werden. In dem Beispiel mit h = 1 kann somit nicht einmal jeder 1-Bit-Fehler erkannt werden (x↔z fällt nicht auf, alle anderen 1-Bit-Fehler erzeugen ungültige Codes, z. B. 00111 aus x oder y).

Bei h = 2 können alle 1-Bit-Fehler erkannt werden. Um die Fehler auch korrigieren zu können, muss die Hamming-Distanz auf mindestens 2r+1 vergrößert werden, wobei r für die Anzahl der korrigierbaren Bit-Fehler steht.

Bei h = 3 können alle 1-Bit-Fehler erkannt und korrigiert werden. Treten 2-Bit-Fehler auf, werden diese unter Umständen falsch „korrigiert“, da das fehlerhafte Wort möglicherweise den Abstand 1 zu einem anderen gültigen Codewort hat.

Bei h = 4 können ebenfalls alle 1-Bit-Fehler erkannt und korrigiert werden. Treten 2-Bit-Fehler auf, können diese zwar erkannt, aber nicht mehr korrigiert werden. Eine falsche „Korrektur“ ist ab 3-Bit-Fehlern möglich.

Der Hamming-Abstand eines Codes ist notwendigerweise eine natürliche Zahl. Ein Code mit Hamming-Abstand 0 ist nicht möglich, da sich in diesem Fall zwei Codewörter nicht unterscheiden ließen.

Ermitteln des Hamming-Abstands eines Codes

Karnaugh-Veitch-Diagramm
4 3 2 3 4
3 2 1 2 3
2 1 X 1 2
3 2 1 2 3
4 3 2 3 4

Die manuelle Ermittlung erfolgt am besten mit dem Karnaugh-Veitch-Diagramm. Dort trägt man für jeden vorkommenden Codewert ein Kreuz ein. Liegen anschließend mindestens 2 Kreuze horizontal oder vertikal direkt aneinander, wobei gegenüberliegende Ränder zusammenfallen, so ist der Hamming-Abstand = 1. Liegen 2 Kreuze entweder nur diagonal aneinander oder mit einem Feld dazwischen horizontal oder vertikal zueinander, so ist der Hamming-Abstand = 2. Das nebenstehende Karnaugh-Veitch-Diagramm für 4 Bit (graue Felder sind zyklische Wiederholungen) zeigt den Abstand eines Codewerts von einem gegebenen (Kreuz). So kann man z.B. erkennen, dass es mit 4 Bit nur zwei Werte mit Hamming-Abstand = 4 gibt, und zwar ein komplementäres Paar.

Bei binären Codes kann der Hamming-Abstand zweier Codeworte a und b auch durch (a XOR b) und das Auszählen der Einsen im Ergebnis ermittelt werden.

Anwendungsbeispiel

Bei der Übertragung von Daten muss sichergestellt werden, dass Informationen nicht verfälscht, bzw. das Veränderungen der Daten zumindest bemerkt werden (Erkennen von n-fach-Fehlern) und vielleicht noch korrigiert werden können.

Nehmen wir als Beispiel einen Drehschalter, der vier Einstellmöglichkeiten hat und diese elektronisch als binäre Zahl (Codewort) an einen Empfänger übermittelt: 00, 01, 10, 11; Der Empfänger erhält das Codewort, soll aber sonst keine Möglichkeit haben, die Schalterstellung zu erkennen.

Der Hamming-Abstand zwischen diesen Werten ist jeweils 1, d.h. falls durch einen Fehler nur ein Bit umgekehrt wird, erhält der Empfänger zwar ein anderes, aber ebenso gültiges Codewort. Wird eine 00 zu 01 verfälscht, kann der Empfänger das alleine an der Nachricht nicht erkennen, weil beide Werte eine gültige Stellung des Schalters beschreiben.

Um die Situation zu verbessern, einigen sich Sender und Empfänger zunächst darauf, nur bestimmte (dafür aber längere) Codewörter zu verwenden und in einer Tabelle deren Bedeutung festzulegen. Dazu können beide beispielsweise die Codewörter 001, 010, 100, 111 verwenden, die jeweils zueinander den Hamming-Abstand von 2 haben - die übrigen vier Codewörter mit drei Bit Länge werden nicht verwendet.

Bei einem einzelnen fehlerhaften Bit (Einfachfehler) verändert sich keines dieser vier Codewörter 001, 010, 100, 111 in eines der anderen drei gültigen Codeworte. Der Empfänger erkennt also, wenn ein 011 ankommt, dass ein Fehler passiert sein muss. Ein Code mit dem Hamming-Abstand 2 ist aber nicht korrigierbar, im Beispiel könnte 011 durch umkehren nur eines Bits aus jedem der vier gültigen Codeworte 001, 010, 100, 111 entstanden sein.

Wenn der Empfänger annimmt, dass nur Einfachfehler auftreten und diese korrigieren möchte, muss er mit dem Sender Codeworte vereinbaren, die jeweils einen Hamming-Abstand ≥ 3 haben, z.B. 01011, 01100, 10010, 10101. Wenn der Empfänger nun 01111 empfängt, und er annimmt, dass ein Einfachfehler aufgetreten ist, dann kann 01111 nur aus dem gültigen Codewort 01011 entstanden sein, bei dem das mittleren Bit verändert wurde. Ein Doppelfehler kann ebenfalls erkannt werden. Da aber Sender und Empfänger wissen, dass sie nur bestimmte Codewörter verwenden, die sich um mindestens drei Bit (Hamming-Abstand ≥ 3) unterscheiden, fällt auch ein Doppelfehler (nur zwei Bits geändert) auf, der aber mit den gesendeten Informationen nicht korrigiert werden kann.

Der Doppelfehler öffnet die Möglichkeit eines Irrtums, wie sich am Beispiel 01111 zeigen lässt: Wenn 01111 durch einen Doppelfehler aus 01100 entstanden sein sollte, aber der Empfänger es für einen Einfachfehler hält und korrigiert, dann wird aus dem eigentlich vom Sender gewollten 01100 durch den Fehler ein 01111 und durch die Korrektur des Empfängers fälschlicherweise eine 01011.

Da Mehrfachfehler (n-fach-Fehler) mit steigendem n in den meisten Anwendungen immer unwahrscheinlicher werden, kommt man in der Regel mit einem Hamming-Abstand von 4 (Erkennen von Dreifachfehlern) bis 5 (Korrigieren von Doppelfehlern) aus.

Die notwendige Länge des Codewortes hängt vom geforderten Hamming-Abstand und der Zahl der möglichen Schalterstellungen ab und ist in der oben stehende Tabelle dargestellt. Dort sieht man beispielsweise, dass für 20 verschiedene Positionen eines Schalters mindestens 8 Bit übertragen werden müssen, wenn zwischen alle 20 Codewörter zueinander mindestens den Hamming-Abstand ≥ 3 erreichen sollen.

Repräsentation der Bit-Strings in einem Hyperwürfel

Die Idee der Hamming-Distanz kann gut mit Hilfe von Hyperwürfeln dargestellt werden. Ein Hyperwürfel ist die Generalisierung eines dreidimensionalen Würfels auf die Dimension d. Jeder Knoten der Figur entspricht einer Bitkombination, die auch als Koordinatenangabe im Raum verstanden werden kann. Die minimale Anzahl der Kanten, die traversiert werden müssen, um von einem gültigen Wort eines Codes zu einem anderen gültigen Wort des Codes zu gelangen, entspricht der Hamming-Distanz.

Beispiel

Hyperwürfel mit d = 1 bis d = 4

Wenn im nebenstehenden Würfel mit d = 3 die beiden Worte {101, 010} für einen Code gewählt werden, so beträgt die minimale Hamming-Distanz 3. Damit können in einer Sphäre mit dem Abstand 1 um einen Punkt mit einem gültigen Wort (z. B. für das gültige Code-Wort 010) alle Fehler (1-Bit-Fehler) erkannt und korrigiert werden {000, 110, 011}.

Wird ein Code mit den Worten {000, 101, 110, 011} gewählt, so beträgt die minimale Hamming-Distanz 2. Mit einem Hamming-Abstand von 2 lassen sich 1-Bit-Fehler lediglich erkennen, aber nicht korrigieren (beispielsweise lässt sich zwar erkennen, dass 111 ein fehlerhaftes Wort darstellt, jedoch nicht, ob es nach 110 oder 011 oder 101 korrigiert werden soll).

Mindestdistanz

Die Mindestdistanz zwischen zwei benachbarten Codewörtern ist für die Konstruktion eines Codes interessant, der bei m Bitstellen für Nutzinformation k Fehler korrigieren kann. Bei Blockcodes mit fixiertem Alphabet liefern die Singleton-Schranke, die Hamming-Schranke (Stichwort t-perfekt) und die Plotkin-Schranke allgemeinere Aussagen über den maximalen Minimalabstand.

Es gilt für einen Code mit Mindestabstand h, dass k<\tfrac{h}{2} Fehler korrigierbar und h − 1 Fehler erkennbar sind.

Beispiel

Sollen alle Einzelfehler korrigierbar sein, also k = 1, so folgt durch Einsetzen und Umstellen h > 2. Mit h = 3 kann man 2-Bit-Fehler zwar erkennen, aber nur Einzelfehler auch korrigieren.

Folgerung

Bei jedem Code muss die Hammingdistanz h somit mindestens 3 betragen, damit überhaupt Fehler korrigierbar sind.

Siehe auch: Hamming-Ähnlichkeit, Hamming-Code, Levenshtein-Distanz, Gray-Code

Literatur

Weblinks


Wikimedia Foundation.

Игры ⚽ Поможем написать реферат

Schlagen Sie auch in anderen Wörterbüchern nach:

  • Hamming Abstand — Der Hamming Abstand, die Hamming Distanz und das Hamming Gewicht, benannt nach dem US amerikanischen Mathematiker Richard Wesley Hamming (1915–1998), sind Maße für die Unterschiedlichkeit von Zeichenketten. Häufig handelt es sich um binär… …   Deutsch Wikipedia

  • Hamming-Distanz — Der Hamming Abstand, die Hamming Distanz und das Hamming Gewicht, benannt nach dem US amerikanischen Mathematiker Richard Wesley Hamming (1915–1998), sind Maße für die Unterschiedlichkeit von Zeichenketten. Häufig handelt es sich um binär… …   Deutsch Wikipedia

  • Hamming-Gewicht — Der Hamming Abstand, die Hamming Distanz und das Hamming Gewicht, benannt nach dem US amerikanischen Mathematiker Richard Wesley Hamming (1915–1998), sind Maße für die Unterschiedlichkeit von Zeichenketten. Häufig handelt es sich um binär… …   Deutsch Wikipedia

  • Hamming-Kode — Der Hamming Code ist ein von Richard Hamming entwickelter linearer fehlerkorrigierender Blockcode, der in der digitalen Signalverarbeitung und der Nachrichtentechnik zur gesicherten Datenübertragung oder Datenspeicherung verwendet wird. Beim… …   Deutsch Wikipedia

  • Hamming-Code — Der Hamming Code ist ein von Richard Hamming entwickelter linearer fehlerkorrigierender Blockcode, der in der digitalen Signalverarbeitung und der Nachrichtentechnik zur gesicherten Datenübertragung oder Datenspeicherung verwendet wird. Beim… …   Deutsch Wikipedia

  • Hamming — Richard Wesley Hamming ( * 11. Februar 1915 in Chicago, Illinois, USA; † 7. Januar 1998 in Monterey, Kalifornien) war ein US amerikanischer Mathematiker, dessen Arbeit großen Einfluss auf die Informatik und Telekommunikation hatte.… …   Deutsch Wikipedia

  • Levenshtein-Abstand — Die Levenshtein Distanz (auch Edit Distanz, Editierdistanz oder Editierabstand) bezeichnet in der Informationstheorie ein Maß für den Unterschied zwischen zwei Zeichenketten bezüglich der minimalen Anzahl der Operationen Einfügen, Löschen und… …   Deutsch Wikipedia

  • Richard W. Hamming — Richard Wesley Hamming ( * 11. Februar 1915 in Chicago, Illinois, USA; † 7. Januar 1998 in Monterey, Kalifornien) war ein US amerikanischer Mathematiker, dessen Arbeit großen Einfluss auf die Informatik und Telekommunikation hatte.… …   Deutsch Wikipedia

  • Richard Wesley Hamming — ( * 11. Februar 1915 in Chicago, Illinois, USA; † 7. Januar 1998 in Monterey, Kalifornien) war ein US amerikanischer Mathematiker, dessen Arbeit großen Einfluss auf die Informatik und Telekommunikation hatte. Inhaltsverzeichnis 1 Leben …   Deutsch Wikipedia

  • Richard Hamming — Richard Wesley Hamming (* 11. Februar 1915 in Chicago, Illinois; † 7. Januar 1998 in Monterey, Kalifornien) war ein amerikanischer Mathematiker, dessen Arbeit großen Einfluss auf die Informatik und Telekommunikation hatte. Inhaltsverzeichnis 1… …   Deutsch Wikipedia

Share the article and excerpts

Direct link
Do a right-click on the link above
and select “Copy Link”