2. Zahlendarstellung und Codierungs- techniken
2.1 Maschineninterne Darstellung von Zahlen und Zeichen
2.2 Fehlererkennende Codes 2.3 Fehlerkorrigierende Codes
2.1 Maschineninterne Darstellung von Zahlen und Zeichen
Alle Daten, die ein Digitalrechner speichert und ver- arbeitet, werden intern in Form von Bits dargestellt.
Frage: Wie werden die Datentypen aus den höheren Programmiersprachen in Bitmuster abgebildet?
Analoge Darstellung
In der analogen Darstellung repräsentiert der techni- sche Parameter (z. B. eine Spannung) direkt den Wert aus der Anwendung. Analoge Werte sind im Allgemei- nen reelle Zahlen (Gleitkommawerte). Beispiel: Die Spannung 1 V entspricht DM 1,00, die Spannung 2,4 V entspricht DM 2,40. Analoge Größen können innerhalb eines vorgegebenen Bereiches jeden beliebigen Wert annehmen.
0 10
20 30
40
Analogiegröße α
α
Probleme der analogen Darstellung
• Genauigkeit der analogen Größe
• Definitionsbereich der analogen Größe
• Arithmetische Operationen auf analogen Größen Wichtige Anwendungsbeispiele
• Audio im Telefonnetz und in der Unterhaltungselek- tronik
• Fernseh- und Videotechnik
Digitale Darstellung
Die Darstellung von Werten erfolgt in Form von Zahlen (lateinisch: “digitus“: der Finger; Abzählen mit den Fingern).
Beispiel: der chinesiche Abakus (Rechenrahmen)
Darstellung von Zahlen im Rechner
Alle modernen Rechner arbeiten mit Dualzahlen (im binären Zahlensystem).2.1.1 Logische Werte
Daten vom Typ “boolean“ (logische Daten) können nur die Werte true oder false annehmen. Daher genügt im Prinzip ein Bit. Häufig erfolgt aber eine Darstellung als ein Byte, da das Byte die kleinste adressierbare und damit direkt zugreifbare Einheit im Rechner ist.
Eine weitverbreitete Konvention ist, dass ein Byte mit nur 0-Bits den Wert false darstellt, während ein Byte mit mindestens einem 1-Bit dem Wert true entspricht. Be- sonders häufig wird dabei das erste Bit im Byte inter- pretiert, da der Prozessor dieses besonders leicht auf 0 oder 1 prüfen kann.
Datentyp Bitstring
Manche höhere Programmiersprachen unterstützen den Datentyp Bitstring. Dieser wird direkt auf eine Folge von Bits im Speicher abgebildet. Dazu gibt es dann eine semantische Erweiterung der Operatoren der Aussagenlogik (¬, ∧, ∨, ...) auf Bitmuster, die dann bitweise verknüpft werden.
2.1.2 Ganze Zahlen
Positive ganze Zahlen
Positive ganze Zahlen sind ein sehr häufiger Datentyp in Anwendungsprogrammen (z. B. als Feldindex, Lauf- variable in Schleifen), aber auch maschinenintern als Speicheradresse usw.
Die Darstellung erfolgt als Dualzahl (Zahl zur Zahlen- basis 2). Dabei entspricht jede Ziffernposition einer Zweierpotenz (wie bei Dezimalzahlen jede Ziffern- position einer Zehnerpotenz entspricht).
Positive ganze Zahlen
Beispiel1510 = 11112 Konvertierung
Dual → Dezimal: Ausmultiplizieren
Dezimal → Dual: fortgesetzte Division durch 2 und Notieren der Reste Beispiel
3010 als Dualzahl
30:2 = 15 Rest 0
15:2 = 7 Rest 1
7:2 = 3 Rest 1
3:2 = 1 Rest 1
1:2 = 0 Rest 1
→ 3010 = 111102
Rechnen mit Dualzahlen
Arithmetische Operationen (Addition, Subtraktion, Multiplikation, Division) werden im Dualsystem analog zum Dezimalsystem ausgeführt.
Merke
Eine Multiplikation mit 2 entspricht einem "Linksshift"
der Dualzahl, eine Division durch 2 einem Rechtsshift.
Beispiel für ganze Zahlen im Hauptspeicher
Oktalzahlen
Das Aufschreiben von langen Bitsrtings braucht viel Platz und ist unübersichtlich. Deshalb wählt man häufig eine Darstellung in Form von Oktalzahlen oder Hexa- dezimalzahlen (Sedezimalzahlen). Dabei ergeben jeweils drei bzw. vier Bits eine Ziffer.
Bitstring Oktalziffer
000 08
001 18
010 28
011 38
100 48
101 58
110 68
111 78
Beispiel
18110 = 0101101012
= 2 6 58
= 2*64 + 6*8 + 5
Hexadezimalzahlen (Sedezimalzahlen) (1)
Jeweils vier Bits ergeben eine Hexadezimalziffer.
Da wir aus dem Dezimalsystem nur zehn Ziffern
kennen, müssen weitere sechs Ziffernbezeichner dazu erfunden werden. Man wählt dazu die Großbuchstaben A bis F.
Bitstring Hexadezimalziffer
0000 016
0001 116
0010 216
0011 316
0100 416
0101 516
0110 616
0111 716
1000 816
1001 916
1010 A
1011 B
1100 C
1101 D
1110 E
1111 F
Hexadezimalzahlen (Sedezimalzahlen) (2)
Beispiel
18110 = 1011 01012
= B 516
= 11*16 + 5
Die oktale und hexadezimale Darstellung ist nicht nur für Ganzzahlen, sondern auch für beliebige andere Bitstrings gebräuchlich, z.B. zur Definition von Bitstring- Konstanten:
ALL-ONE DC X'FF' LEFT-HALF DC X'F0'
Negative ganze Zahlen
Erste Idee
Wir wählen n-1 Bits für den Betrag als ganze Zahl und ein Bit für das Vorzeichen.
Nachteile
• Die Null gibt es zweimal (+0, -0).
• Die Arithmetik wird durch Fallunterscheidungen komplizierter.
Zweite Idee
Einerkomplement
Eine negative Zahl wird durch Invertieren aller Bits der positiven Zahl desselben Betrages gebildet.
Nachteile
Immer noch zwei Nullen, immer noch komplizierte Arithmetik
Dritte Idee
Zweierkomplement
Zweierkomplement (1)
BerechnungZweierkomplement = Einerkomplement +1 Beispiel für 3-Bit Zahlen:
210 = 0102
-210 = 1012 + 1 = 1102 Vorteile
• Vorzeichen immer noch am ersten Bit erkennbar
• Die Addition negativer Zahlen geschieht wie die Addition positiver Zahlen! (beim Überschreiten der Null geht der Übertrag verloren). Deshalb braucht man nur noch eine Hardware-Schaltung!
• Subtraktion i - j durch Bildung des Zweierkomple- ments von j und Addition!
i - j = i + (-j)
Sehr einfach in Hardware zu bauen!
Zweierkomplement (2)
Die Darstellung auf dem Zahlenkreis veranschaulicht die Ähnlichkeit von Addition und Subtraktion.
2.1.3 Gleitkommazahlen
Reelle Zahlen (Gleitkommazahlen, floating point num- bers) kann man auf zwei Weisen darstellen: durch Festlegen einer Konvention, wo im Maschinenwort man sich die Kommastelle denkt (Festkommazahl, fixed- point number) oder durch eine Repräsentation in Form von Mantisse und Exponent.
Festkomma-Darstellung (fixed-point number)
• Darstellung reeller Zahlen ohne Exponent
• Festlegung einer festen Anzahl von Stellen vor und nach dem Komma durch Konvention
Beispiel
Darstellung und Addition:
19,125 =0 010011,001000 + 7,625 =0 000111,101000 26,75 =0 011010,110000
Umrechnung Dezimal x10 → Dual x2 für x10 < 1:
0,375 * 2 0,750 * 2 1,500 * 2
1,000 (alle Nachkommastellen = 0 → Ende) Ergebnis 0,37510 = 0,0112 (durch Ablesen von oben
nach unten)
VZ Vorkomma- Nachkommastellen
Gleitkommazahlen
Repräsentation der rellen Zahl in Form von Mantisse und Exponent:
z = m * ge , m Mantisse, e Exponent.
m ist eine ganze Zahl mit gedachtem Komma vor der ersten Stelle.
e ist ganze Zahl.
g ist die Basis. Sie gilt als implizit vereinbart und wird nicht explizit dargestellt. Gebräuchlich sind g = 2 oder g = 16. (IBM-Großrechner: g = 16)
Merke
m < 0: negative reelle Zahl
e < 0: reelle Zahl mit Betrag zwischen 0 und 1
Beispiele für Gleitkommazahlen
Man überlege sich, wie die arithmetischen Operationen +, -, *, / in der obigen Gleitkomma-Darstellung ausge- führt werden!
Anmerkung 1
Beim Rechnen mit Gleitkommazahlen ist die Genauig- keit beschränkt, da die Länge der Mantisse beschränkt ist. Es treten Rundungsfehler auf.
Anmerkung 2
Sehr kleine Prozessoren unterstützen manchmal Gleit- kommazahlen nicht in Hardware. Ihre Darstellung und Operationen darauf müssen dann in Software durch Unterprogramme des Laufzeitsystems realisiert wer- den. Üblich ist auch die Erweiterung des Rechners um einen zusätzlichen Gleitkommaprozessor, die wesent- lich zur Beschleunigung der Ausführung numerischer Anwendungsprogramme beitragen kann.
e m
Eine Gleitkommazahl werde in einem 32-Bit-Wort dar- gestellt mit 8 Bits für e und 24 Bits für m
Darstellung der Mantisse
Problem: 0,510 lässt sich darstellen als 0,12 * 20 oder als 0,012* 21 etc.Lösung: Eindeutigkeit der Darstellung durch normalisierte Mantisse (Basis g = 2),
z.B.: ½ ≤ m < 1, d.h. 0,510 = 0,12 * 20 1 ≤ m < 2, d.h. 0,510 = 1,02 * 2-1
Werden normalisierte Mantissen vorausgesetzt, dann ist das erste Bit immer gleich 0 bzw. 1 und braucht nicht abgespeichert zu werden (sogenanntes “hidden bit“).
Beispiel: Basis g = 2, Exponent e mit 6 Bits, normali- sierte Mantisse m (1 ≤ m < 2) mit 6 Bits, hidden bit.
7,7510 = 111,1102 = (-1)0 *1,1111002 * 22
0
VZ Exponent Mantisse
0 0 0 1 0 1 1 1 1 0 0 0
Versetzte Darstellung des Exponenten
• Diese Darstellung wird auch als Biased- oder Excess-Darstellung bezeichnet
• Zum tatsächlichen Exponenten wird ein bestimmter Wert (Bias) hinzuaddiert. Hat der Exponent n Bits, so beträgt dieser Wert 2n-1.
Beispiel: Basis g = 2, Exponent e mit 6 Bits in Excess- Darstellung, normalisierte Mantisse m (1 ≤ m < 2) mit 6 Bits,Verwendung des hidden bit.
7,7510 = 111,1102 = (-1)0 *1,1111002 * 22 Zu speichernder Exponent E = 2 + 26-1 = 1000102 Vorteil dieser Darstellung: Falls für zwei Gleitkomma- zahlen a ≤ b gilt, so gilt das Gleiche für die (gewöhn- liche) Dualdarstellung von a und b.
Beispiel
a = 0,510 = 1,02 * 2-1 = 0 011111 000000 b = 410 = 1,02 * 22 = 0 100010 000000
Ohne Excess-Darstellung wäre der Exponent von a 1111112 und von b 0000102 (Zweierkomplement).
Das IEEE-Gleitkommaformat (IEEE 754)
Spezielle Werte (für einfache Genauigkeit, single):
-1022 ... +1023 -126 ... +127
Exponent
1023 127
Excess
64 32
Gesamtbreite (bits)
52 (hidden bit) 23 (hidden bit)
Fraction (= Mantisse ohne hidden bit) (bits)
11 8
Exponent (bits)
1 (0 = positiv, 1 = negativ) Vorzeichen (bits)
double precision single precision
Genauigkeit
NaN (not a number)
≠ 0...02 -128 (1...12)
± ∞ 0...02
-128 (1...12)
1,f * 2e -126 ≤ e ≤ 127 f
0,... * 2-128 (denormale Zahlen)
≠ 0...02 -127 (0...02)
± 0 0...02
-127 (0...02)
Bedeutung Fraction f
Exponent e
2.1.4 Zeichen (characters)
Darstellung in fester Länge
Die Zuordnung von Bitmustern zu den darzustellenden Zeichen nennt man einen Zeichencode. Zur Darstel- lung von Zeichen des Alphabets (Textzeichen, Sonder- zeichen) gibt es internationale Standards. Diese
verwendet eine feste Anzahl von Bits für jedes Zeichen.
ASCII American Standard Code for Information Interchange. Ursprünglich ein 7-Bit- Code, inzwischen als 8-Bit-Code
gebräuchlich, damit auch internationale Zeichen (z. B. deutsche Umlaute) aufgenommen werden können (IA5 = International Alphabet Number 5).
EBCDIC Extended Binary Coded Decimal Inter- change Code. Ein 8-Bit-Code, der auf Großrechnern sehr weit verbreitet ist, vor allem bei IBM
Darstellung von Zeichen (1)
Beide Codes enthalten• druckbare Zeichen – Ziffern
– Kleinbuchstaben – Großbuchstaben
– Sonderzeichen (!, ?, $, ...)
• nicht druckbare Zeichen (Steuerzeichen)
– Wagenrücklauf, Zeilenvorschub, Tabulator, Klingeln, etc.
• Gerätesteuerzeichen und Übertragungssteuer- zeichen.
x
0 1 2 3 4 5 6 7 y
0 nul dle 0 @ P ` p 1 s oh dc1 ! 1 A Q ` q 2 s fx dc2 " 2 B R b r 3 e tx dc3 # 3 C S c s 4 e ot dc4 $ 4 D T d t 5 e nq na k % 5 E U e u 6 a ck s yn & 6 F V f v 7 be l e tb ' 7 G W g w 8 bs ca n ( 8 H X h x 9 ht e m ) 9 I Y i y A lf s ub * : J Z j z B vt e s c + ; K [ k { C ff fs , < L \ l | D cr qs - = M ] m } E s o rs . > N ^ n ¬
F s i us / ? O _ o de l Erste 3 Bits
ASCII-Codetabelle (7-Bit-Code)
ASCII: Bedeutung der Steuerzeichen
Abk. Funktion Funktion (Be de utung de s Ze iche ns )
NUL S OH S TX ETX EOT ENQ ACK BEL BS HT LF VT FF CR S O S I DLE DC1-3 DC4 NAK S YN ETB CAN EM S S ES C FS GS RS US S P DEL
Null
S ta rt of he a ding S ta rt of te xt End of te xt
End of tra ns mis s ion Enquiry
Acknowle dge me nt Audible s igna l Ba cks pa ce
Horizonta l ta bula tion Line fe e d
Ve rtica l ta bula tion Form fe e d Ca rrie r re turn S hift out S hift in
Da ta link e s ca pe De vice control De vice s top
Ne ga tive a cknowle dge me nt S ynchronous idle
End of tra ns mis s ion block Ca nce l
End of me dium
S ta rt of s pe cia l s e que nce Es ca pe
File s e pa ra tor Group s e pa ra tor Re cord s e pa ra tor Unit s e pa ra tor S pa ce De le te /Idle
Nichtige s (ungültige s ) Ze iche n Be ginn de s Kopfe s (Tite ls ) Te xta nfa ng
Te xte nde
Ende de r Übe rtra gung Anfra ge
Empfa ngs be s tä tigung Akus tis che s S igna l Rücks e tze n
Horizonta le Eins te llung (Ta bula tor) Ze ile nvors chub
Ve rtika le Eins te llung (Ta bula tor) Formula rvors chub
S chre ibkopfrückla uf
Ums cha ltung a us (Kle ins chre ibung) Ums cha ltung e in (Groß s chre ibung) Ums cha ltung von Te xt a uf S te ue rze iche n Einhe ite ns te ue rung
Einhe ite nha lt
Ne ga tive Empfa ngs be s tä tigung S ynchronis ie rze iche n (Le e rla uf) Ende e ine s Übe rtra gungs blocke s Aufhe bung
Ende für e in Me dium (Ge rä t) Be ginn e ine r s pe zie lle n Folge Aus wa hl, Tre nnung, Ums cha ltung Da te itre nnze iche n
Gruppe ntre nnze iche n S a tztre nnze iche n
Tre nnze iche n für e ine Informa tions e inhe it Zwis che nra um
Lös che n/ Le e rla uf
EBCDIC-Codetabelle
Zeichencodes mit variabler Bitlänge
Zeichencodes mit einer festen Anzahl von Bits haben den gravierenden Nachteil, dass sie nicht optimal sind, wenn die Häufigkeit der Zeichen in einem Text nicht gleich verteilt ist. Man kann sich dann Codes über- legen, bei denen Zeichen je nach ihrer Häufigkeit mit einer unterschiedlichen Anzahl von Bits dargestellt werden. Die Codetabelle wird gemäß den Zeichen- häufigkeiten anwendungsabhängig gewähltVorteil
Im Mittel weniger Bits zur Darstellung der Anwendungs- daten. Verringert den Speicherbedarf und beschleunigt den Datentransfer.
Nachteil
Zusatzaufwand zum Kodieren/Dekodieren zwischen gebräuchlichen Darstellungen und dem Code mit
variabler Bitlänge. Parsing (Zerlegung der Zeichenkette in die einzelnen Zeichen) wird komplizierter.
Beispiel für einen Code mit variabler Bitlänge (1)
Zeichen Häufig- Code Anzahl
keit (%) der Bits
0 55.5 0 1
1 6.7 1000 4
2 4.5 1100 4
8 3.5 10010 5
3 3.3 10100 5
A 3.2 10101 5
5 3.0 10110 5
6 2.7 11100 5
4 2.7 11101 5
9 2.2 11110 5
7 1.9 100110 6
F 1.5 101110 6
B 1.2 111110 6
[leer] 1.1 110110 6
D 1.0 110100 6
E 0.9 110101 6
Z 0.7 1011110 7
P 0.6 1111110 7
N 0.5 1101110 7
u 0.4 10011110 8
C 0.4 10011100 8
Beispiel für einen Code mit variabler Bitlänge (2)
H 0.4 10011101 8
R 0.3 10111110 8
M 0.3 11111110 8
L 0.3 11111111 8
S 0.25 11011110 8
I 0.20 100111110 9
T 0.15 110111110 9
K 0.15 110111111 9
Y 0.13 1001111110 10
X 0.12 1001111111 10
G 0.10 1011111100 10
J 0.10 1011111101 10
O 0.06 10111111100 11
Q 0.03 10111111101 11
V 0.03 10111111110 11
W 0.03 101111111110 12
. 0.01 1011111111110000 16
- 1011111111110001 16
? 1011111111110010 16
& 1011111111110011 16
/ 1011111111110100 16
+ 1011111111110101 16
< unter 1011111111110110 16 ) 0.001 1011111111110111 16
( 1011111111111000 16
% 1011111111111001 16
Beispiel für einen Code mit variabler Bitlänge (3)
= 1011111111111010 16
# 1011111111111011 16
? 1011111111111100 16
, 1011111111111101 16
@ 1011111111111110 16
1011111111111111 16
Mittlere Zeichenlänge im Code 0.555 * 1 + 0.112 * 4
+ 0.206 * 5 + 0.76 * 6 + 0.018 * 7 + 0.24 * 8 + 0.005 * 9 + 0.0045 * 10 + 0.0017 * 11 + 0.0003 * 12 + 0.0001 x 16
= 2.91 Bits pro Zeichen
Wesentlich weniger als die üblichen 8 Bits pro Zeichen!
Der Huffman-Code
David Huffman hat einen Algorithmus zur Konstruktion von optimalen Codes mit variabler Bitlänge ange- geben. Mit diesem Algorithmus konstruierte Codes bezeichnet man als Huffman-Codes.
Algorithmus Erzeuge-Huffman-Code
1. Bestimme die Auftrittshäufigkeiten der Zeichen und schreibe sie an die Blattknoten eines aufzubauen- den Binärbaums an.
2. Nimm die bisher unerledigten zwei Knoten mit den geringsten Häufigkeiten und berechne deren Summe.
3. Erzeuge einen Elternknoten für diese beiden und beschrifte ihn mit der Summe. Markiere die Ver- zweigung zum linken Sohn mit 0, die zum rechten Sohn mit 1.
4. Markiere die beiden bearbeiteten Knoten als erle- digt. Wenn es nur noch einen nicht erledigten Knoten gibt, sind wir fertig. Sonst weiter mit Schritt 2.
Huffman-Code: Beispiel
Kodierbaum
100 1
1
1 1
0
0
0 40 0
60
25
Wahrscheinlichkeit Zeichen Code
30%
30%
10%
15%
15%
A B
C D E
11 10
011 010 00
Wahrscheinlichkeiten der Zeichen:
p(A) = 0.3; p(B) = 0.3; p(C) = 0.1; p(D) = 0.15; p(E) = 0.15
Huffman-Code: Optimalität
Die Zeichen mit großen Häufigkeiten sind näher an der Wurzel des Baumes und haben somit eine kürzere Codewortlänge; deshalb ist es ein guter Code. Es ist sogar der bestmögliche Code!
Denn:
Die Länge einer kodierten Zeichenfolge ist gleich der gewichteten äußeren Pfadlänge des Huffman-Baumes.
Die “gewichtete äußere Pfadlänge” eines Baumes ist gleich der über alle äußeren Knoten gebildeten Summe der Produkte des “Gewichts” (zugehöriger Häufigkeits- zähler) mit der Entfernung von der Wurzel. Dies ist offensichtlich eine Möglichkeit, die Länge der kodierten Zeichenfolge zu berechnen; sie ist äquivalent zu der über alle Buchstaben gebildeten Summe der Produkte der Häufigkeit des Auftretens eines Buchstaben mit der Anzahl der Bits bei jedem Auftreten.
Kein Baum mit den gleichen Häufigkeiten bei den äußeren Knoten hat eine kleinere gewichtete äußere Pfadlänge als der Huffman-Baum.
Beweisidee
Mit Hilfe des gleichen Prozesses kann ein beliebiger anderer Binärbaum konstruiert werden, doch ohne bei jedem Schritt unbedingt die zwei Knoten mit dem klein- sten Gewicht auszuwählen. Mittels Induktion lässt sich beweisen, dass keine Strategie zu einem besseren Er- gebnis führen kann als die, bei der jeweils zuerst die beiden kleinsten Gewichte ausgewählt werden.
Dekodieren von Huffman-Codes (1)
Nahe liegend ist eine Dekodierung unter Verwendung des Tries (eines speziellen Binärbaumes):
1. Lies den Eingabestrom sequenziell und traversiere den Trie, bis ein Blattknoten erreicht ist.
2. Gib bei Erreichen des Blattknotens das erkannte Zeichen aus.
Beobachtung
Die Eingabe-Bitrate ist konstant, aber die Ausgabe- Zeichenrate ist variabel!
Decodieren von Huffman-Codes (2)
Als Alternative bietet sich die Verwendung einer Deko- diertabelle an.Erzeugung der Tabelle
Hat das längste Codewort L Bits, so hat die Tabelle 2L Einträge.
Sei ci das Codewort für Zeichen si. ci habe li Bits. Wir erzeugen 2L-li Einträge in der Tabelle, bei denen jeweils die ersten li Bits = ci sind und die verbleibenden L-li Bits alle möglichen Kombinationen annehmen.
An all diesen Adressen wird si als erkanntes Zeichen eingetragen, zugleich wird li als Codewortlänge ver- merkt.
Decodieren von Huffman-Codes (3)
Einsatz der Tabelle zur Dekodierung
1. Lies L Bits aus dem Eingabestrom in einen Puffer.
2. Benutze den Puffer als Adresse in der Tabelle und gib das erkannte Zeichen si aus.
3. Entferne die ersten li Bits aus dem Puffer und ziehe weitere li Bits aus dem Eingabestrom nach.
4. Weiter mit Schritt 2.
Beobachtung
Das Tabellenverfahren ist schnell.
Die Ausgabe-Zeichenrate ist konstant, aber die Ein- gabe-Bitrate ist variabel!
Huffman-Code: Kommentare
• Ein sehr guter Code für viele praktische Zwecke.
• Allerdings nur geeignet, wenn die Häufigkeiten der Zeichen a priori bekannt und immer gleich (oder ähnlich) sind.
• Variante: Ermittle die Häufigkeiten für jeden gege- benen Text neu und speichere/übertrage den Code mit den Daten.
• Ein (durchaus berechenbarer) Verlust entsteht da- durch, dass jedes Zeichen mit einer ganzen Zahl von Bits kodiert werden muss und somit die Code- länge den Häufigkeiten nicht ganz (theoretisch opti- mal) angepasst werden kann. Verbesserung: arith- metische Kodierung (auf die wir hier nicht näher eingehen).
2.2 Fehlererkennende Codes
Definition “Fehler“: Die empfangene Information ent- spricht nicht der gesendeten.
Ein fehlererkennender Code ermöglicht dem Empfän- ger einer Nachricht festzustellen, dass es einen Über- tragungsfehler gegeben hat.
Ein fehlererkorrigierender Code ermöglicht dem Empfänger einer Nachricht festzustellen, wo in der Nachricht es einen Übertragungsfehler gegeben hat;
der Empfänger kann den Fehler ohne erneute Über- tragung reparieren.
Fehlererkennung und Fehlerkorrektur erfordern Redundanz.
Wieviel Redundanz man braucht und wie man die red- undanten Bits am besten generiert, ist Gegenstand der Codierungstheorie.
Man vermutet schon: Fehlerkorrektur benötigt mehr Redundanz als Fehlererkennung.
.
Fehlererkennung (1)
Beispiel für Fehlererkennung: das Paritätsbit. Zu vier Datenbits wird ein Paritätsbit hinzu gefügt. Bei gerader Parität ist die Gesamtzahl der 1-Bits gerade, bei unge- rader Parität ungerade
Beispiel: Gerade Parität
Fehlererkennung (2)
E Ü b e rtra gu n g d e r Z a h l 7 : 0 1111
K a n a l: 0 1 0 11 F E H L E R !
E m p fa n g : 0 1 0 11
Te s t b e i E m p fä n g er: 0 1 0 11 Æ # 1 g e ra d e ⇒ E = 0
F E H L E R -E R K E N N U N G E = P a rity-B it o d e r P rü fb it!
E s m u ß ein en F e hler ge ben !
Der Sender berechnet das Paritätsbit und fügt es an die Nachricht an. Der Empfänger berechnet das Paritätsbit neu und vergleicht es mit dem übertragenen Paritätsbit.
Bei Abweichung erkennt er einen Fehler.
Beispiel
Frage: Welche Arten von Übertragungsfehlern kann man mit einem Paritätsbit erkennen? Wie mächtig ist der Code?
Fehlererkennung: Code-Beispiel
Wir betrachten einen Code, der oft in der Telekommu- nikation zur Übertragung von BCD-Zahlen (binary coded decimals) verwendet wird: den 2-aus-5-Code (auch 7-4-2-1-Code genannt).
2 aus 5 ⇒ nur zwei Einsen in 5 Bits
Die Fehlererkennung erfolgt durch Geradzahligkeits- prüfung.
2.3 Fehlerkorrigierende Codes
Eine Korrektur ist nur möglich, wenn man genau weiß, wo der Fehler liegt. Das erfordert mehr Redundanz, also mehr Bits pro Zeichen als die reine Fehlererken- nung.
Ein fehlerkorrigierender Code ist stets auch ein fehler- erkennender Code.
Prinzip eines fehlerkorrigierenden Codes
1. P o s:
a + c a + b a - c + a - b - 2a 2a O K 2. P o s:
FE H LE R ! K o rre ktur: a, ... , a+ b, a -b
a
Hamming-Abstand (1)
Hamming-Abstand d
Der Hamming-Abstand d zwischen zwei Codewörtern c1, c2 ist die Anzahl der Bitpositionen, in denen sich die beiden Codewörter unterscheiden.
Beispiel
d(10001001,10110001) = 3 (Anzahl der Bits von c1 XOR c2 )
Hamming-Abstand D eines vollständigen Codes C
( ) C : min { d ( c1, c
2) , c1, c
2 C , c
1 c
2}
, c
2C , c
1c
2}
D = ∈ ≠
Hamming-Abstand (2)
SatzDie Fähigkeit eines Codes, Fehler zu erkennen und Fehler zu beheben, hängt von seinem Hamming- Abstand ab.
Erkenne e-Bit Fehler:
Ein Abstand von e + 1 wird benötigt Behebe e-Bit Fehler:
Ein Abstand von 2e + 1 wird benötigt
Wieviel Redundanz braucht man?
Das Codewort bestehe aus m Zeichen-Bits.
Frage: Wieviele Prüfbits werden benötigt, um jeden 1- Bit-Fehler beheben zu können?
n = m + r, m Datenbits, r Redundanzbits
Es gibt 2m legale Zeichencodes.
Pro Codewort muss es n illegale Codewörter im Ab- stand von einem Bit geben.
2n ist die Gesamtzahl der darstellbaren Codewörter.
(n+1)2m ≤ 2n = 2m+r (n+1) ≤ 2r
(m + r + 1) ≤ 2r
Dies ergibt die untere Grenze für r.
(8 + r) ≤ 2r => r ≥ 4 m = 7
Beispiel:
Code-Beispiele
Fehlererkennender CodeCode mit einem einzigen Paritätsbit (gerade oder ungerade)
=> Hamming-Abstand = 2
=> Erkennung eines 1-Bit-Fehlers ist möglich (oder aller Fehler mit einer ungeraden Anzahl Bits) Fehlerbehebender Code:
Der Code besteht aus vier Codewörtern:
00000 00000, 00000 11111, 11111 00000, 11111 11111
=> Hamming-Abstand = 5
=> Korrektur von 2-Bit-Fehlern ist möglich
nächstes Codewort 2-Bit-Fehler
00000 11111
=>
00000 00111 Beispiel
Hamming-Code (1)
Der Hamming-Code ersetzt jedes Datenwort von 4 Bits durch ein Codewort mit 7 Bits. Für ein gegebenes Datenwort
m1 m2 m3 m4
bilden wir das Codewort c1 c2 c3 c4 c5 c6 c7.
Die ersten vier Bits c1c2c3c4 sind dieselben wie im Datenwort. Die weiteren Bits werden wie Paritätsbits berechnet:
c5 = Parität von c1 c2 c3 (c1 ⊗ c2 ⊗ c3) c6 = Parität von c1 c3 c4 (c1 ⊗ c3 ⊗ c4) c7 = Parität von c2 c3 c4 (c2 ⊗ c3 ⊗ c4).
Hamming-Code (2)
Insgesamt gibt es 16 Codewörter:0000000 0001011 0010111 0011100 0100101 0101110 0110010 0111001 1000110 1001101 1010001 1011010 1100011 1101000 1110100 1111111
Hamming-Code (3)
DecodierungIst das empfangene Wort ein gültiges Codewort, wird es akzeptiert. Ist es ungültig, so wird es zum nächsten Nachbarn hin korrigiert. Alle 1-Bit-Fehler können eindeutig korrigiert werden.
Beispiel
1010110 wird zu 1000110 korrigiert (Abstand 1).
Hamming-Code (3)
VeranschaulichungCodewort: fülle die Bit-Positionen c5, c6, c7 so aus, dass jeder Kreis eine gerade Anzahl Einsen hat.
Das Codewort für m1 m2 m3 m4 = 1 0 1 1 wird dann :
c1 c2 c3 c4 c5 c6 c7 = 1 0 1 1 0 1 0