10.01.2015 Aufrufe

Skript als PDF Skript

Skript als PDF Skript

Skript als PDF Skript

MEHR ANZEIGEN
WENIGER ANZEIGEN

Sie wollen auch ein ePaper? Erhöhen Sie die Reichweite Ihrer Titel.

YUMPU macht aus Druck-PDFs automatisch weboptimierte ePaper, die Google liebt.

2.7 Der Shannon-Fano-Elias Code<br />

Die Huffman-Codierung ist ein asymptotisch optimales Verfahren. Wir haben<br />

auch gesehen, dass sich die Huffman-Codierung gut berechnen und dann<br />

auch gut decodieren lassen. Die letzte Aussage trifft allerdings nur zu, wenn<br />

das Quellalphabet nicht zu groß ist. Denn zur Berechnung der Codeworte<br />

eines Huffman-Codes wird Zeit O(n log n) benötigt, wenn n die Größe<br />

des Alphabets ist. Da wir die Wahrscheinlichkeiten in der Verteilung (implizit)<br />

sortieren müssen, können wir auch nicht hoffen, die Codeworte in Zeit<br />

weniger <strong>als</strong> n log n zu berechnen. Für die eigentliche Codierung und Decodierung<br />

wird auch der Huffman-Baum benötigt. Dieser hat immer Größe Θ(n).<br />

Wollen wir nun die Huffman-Codierung etwa auf das Alphabet {0, 1} 50 anwenden,<br />

so sehen wir, dass dieses kaum noch praktikabel ist. Deshalb wollen<br />

wir nun ein Codierungsverfahren kennen lernen, das angewandt auf Alphabete<br />

der Form A b deutlich effizienter ist <strong>als</strong> die Huffman-Codierung. Dieses<br />

Verfahren wurde von Shannon, Fano und Elias entwickelt. Wir nennen es<br />

die Shannon-Fano-Elias-Codierung, kurz SFE-Codierung. Wir werden dieses<br />

Verfahren zunächst für allgemeine Quelle erklären und dann für Quellen<br />

mit Alphabeten der Form A b effiziente Codier- und Decodieralgorithmen<br />

beschreiben. In diesem Fall wird das Verfahren arithmetische Codierung genannt.<br />

Wir betrachten eine Quelle mit Alphabet A = {a 1 , . . . , a n } und Wahrscheinlichkeitsverteilung<br />

p = (p 1 , . . . , p n ). Die p i müssen nicht sortiert sein. Für<br />

jedes i = 1, . . . , n definieren wir nun<br />

w i := ⌈log 1 p i<br />

⌉ + 1<br />

∑i−1<br />

L i := p j<br />

j=1<br />

(2.1)<br />

T i := L i + p i−1<br />

i<br />

2 = ∑<br />

p j + p i<br />

2 .<br />

Zusätzlich setzen wir L n+1 = 1. Die L i partitionieren das Einheitsintervall<br />

[0, 1) in n Teilintervalle I i := [L i , L i+1 ). Die Werte T i sind jeweils Mittelpunkt<br />

des Teilintervalls I i = [L i , L i+1 ). Die Breite von I i ist genau p i . Wir<br />

ordnen nun dem Symbol a i das i-te Teilintervall I i zu. Damit wird Symbolen<br />

ein Teilintervall mit Breite genau ihrer Quellwahrscheinlichkeit zugeordnet.<br />

j=1<br />

38


Nach Wahl von w i gilt<br />

2 −w i<br />

≤ p i<br />

2 .<br />

Weiter bezeichnen wir für eine Zahl x ∈ [0, 1] und ein c ∈ N mit ⌊x⌋ c die<br />

obersten c Bits der Binärdarstellung von x. Es gilt dann<br />

x − 0.⌊x⌋ c < 2 −c . (2.2)<br />

Die SFE-Codierung C ordnet nun dem Quellsymbol a i das Codewort<br />

C(a i ) = ⌊T i ⌋ wi (2.3)<br />

zu. Jedem Symbol a i wird <strong>als</strong>o der Mittelpunkt seines Teilintervalls I i , dargestellt<br />

mit w i Bits, zugeordnet.<br />

Beispiel: Betrachten wir die Quelle mit Quellsymbolen a 1 , a 2 , a 3 , a 4 und<br />

den Wahrscheinlichkeiten<br />

1<br />

16 , 3 16 , 9<br />

16 , 3 16 .<br />

Wir erhalten dann die folgenden Werte für w i , T i , C(a i ):<br />

i = 1 i = 2 i = 3 i = 4<br />

w i 5 4 2 4<br />

1<br />

T i 32<br />

5<br />

32<br />

17<br />

32<br />

29<br />

32<br />

C(a i ) 00001 0010 10 1101<br />

Abbildung 2.10 zeigt die Intervalle I i und ihre Mittelpunkte. Das zu a 3<br />

gehörige Intervall L 3 , L 4 ist fett in Rot eingezeichnet.<br />

Abbildung 2.10: Intervalleinteilung bei SFE-Codierung<br />

Wir erhalten nun<br />

Satz 2.7.1 Die SFE-Codierung liefert einen Präfix-Code.<br />

Beweis: Sei C(a i ) ein Präfix von C(a j ), d.h., C(a i ) und C(a j ) stimmen in<br />

den ersten w i Bits überein. Dann muss gelten |T i − T j | < 2 −w i<br />

, denn mit<br />

C(a i ), C(a j ) stimmen auch T i , T j in den obersten w i Bits überein. Nun gilt<br />

39


aber 2 −w i<br />

≤ p i /2 und |T i − T j | ≥ p i /2. Damit ist die Annahme, dass C(a i )<br />

ein Präfix von C(a j ) ist, zum Widerspruch geführt.<br />

Die SFE-Codierung ordnet wahrscheinlichen Symbolen Intervalle großer<br />

Breite zu. Mittelpunkte großer Intervall müssen aber nur mit wenigen Bits<br />

Präzision dargestellt werden, um nicht mit anderen Mittelpunkten verwechselt<br />

werden zu können. Dieses liefert die Kompression bei der SFE-Codierung.<br />

Satz 2.7.2 Für die erwartete Länge E(C) der SFE-Codierung C einer Quelle<br />

mit Wahrscheinlichkeitsverteilung p = (p 1 , . . . , p n ) gilt<br />

Beweis: Der Satz folgt aus<br />

H(p) < E(C) ≤ H(p) + 2.<br />

− log p i < w i ≤ − log p i + 2.<br />

Aus diesem Satz folgt unmittelbar, dass auch die SFE-Codierung ein asymptotisch<br />

optimales Codierungsverfahren ist. Denn angewandt auf das Alphabet<br />

A b mit Verteilung p b erreicht die SFE-Codierung eine erwartete Codierungslänge<br />

von höchstens H(p b ) + 2 = bH(p) + 2. Damit ist im Grenzwert<br />

die erwartete Codierungslänge pro Quellsymbol genau H(p).<br />

2.8 Arithmetische Codierung<br />

In diesem Abschnitt lernen wir effiziente Codier- und Decodieralgorithmen<br />

für die SFE-Codierung kennen, wenn das Quellalphabet A b und die Wahrscheinlichkeitsverteilung<br />

p b , b ∈ N, ist, wobei p eine Wahrscheinlichkeitsverteilung<br />

auf A = {a 1 , . . . , a n } ist. Die in diesem Abschnitt beschriebenen<br />

Techniken werden <strong>als</strong> arithmetische Codierung bezeichnet.<br />

Betrachten wir <strong>als</strong>o eine Quelle mit Alphabet A b , A = {a 1 , . . . , a n }. Die<br />

Verteilung auf A ist von der Form p = (Pr(a 1 ), . . . , Pr(a n )) = (p 1 , . . . , p n ).<br />

Die Wahrscheinlichkeit für das Quellsymbol x = (x 1 , . . . , x b ) ∈ A b bezeichnen<br />

wir mit p(x). Es gilt<br />

p(x) =<br />

b∏<br />

Pr(x i ).<br />

i=1<br />

Auf den Elementen aus A b definieren wir nun eine (totale) Ordnung


. . . < a n . Auf A b benutzen wir nun die lexikographische Ordnung bezüglich<br />

der Ordnung auf A. Sind <strong>als</strong>o x = (x 1 , . . . , x b ) und y = (y 1 , . . . , y b ) zwei<br />

Elemente aus A b so gilt x < y genau dann, wenn für den kleinsten Index<br />

1 ≤ k ≤ b mit x k ≠ y k gilt x k < y k .<br />

Um die arithmetische Codierung für A b mit Wahrscheinlichkeitsverteilung<br />

p b zu beschreiben, benutzen wir die folgende Notation. Wir setzen<br />

w(x) := ⌈log 1<br />

p(x) ⌉ + 1<br />

L(x) := ∑ p(y)<br />

y


müssen, um die die Codierung eines einzelnen Symbols zu bestimmen. Vielmehr<br />

kann die gerade beschriebene Idee des sukzessiven Verfeinerns benutzt<br />

werden, um einzelne Codeworte zu berechnen. Hierzu wird bei gegebenem<br />

Wort m = m 1 m 2 · · · m b zunächst das Teilintervall I s berechnet, indem das<br />

Intervall für m liegt. Dann wird nur in diesem Teilintervall nach dem korrektem<br />

Intervall für m gesucht. Die Bestimmung von I j ist einfach, denn der<br />

Index s ist gegeben durch 1 ≤ s ≤ n mit m 1 = a s . Weitere Teilintervalle<br />

können dann genauso bestimmt werden. Dieses liefert den folgenden Algorithmus<br />

zur Berechnung des Codewortes für m. Die Zahlen L s sind dabei<br />

definiert wie in der SFE-Codierung für das Alphabet A mit den Wahrscheinlichkeiten<br />

p 1 , . . . , p n .<br />

Eingabe m = m 1 m 2 · · · m b ∈ A b .<br />

Ideal-Encode-AC (IE-AC)<br />

1. Schritt Setze l 0 := 0, u 0 := 1, w 0 := 1.<br />

2. Schritt Für i = 1, . . . , b wiederhole die folgenden Schritte.<br />

3. Schritt Finde s mit a s = m i .<br />

4. Schritt Setze<br />

l i := l i−1 + w i−1 L s<br />

u i := l i−1 + w i−1 L s+1<br />

w i = w i−1 p s<br />

(2.7)<br />

5. Schritt Gib l b + w b<br />

2<br />

mit ⌈log 1 w b<br />

⌉ + 1 Bits Genauigkeit aus.<br />

Der Wert w i gibt jeweils die Breite des aktuellen Intervalls an. Es gilt w i =<br />

u i − l i .<br />

Mit dem oben Gesagten folgt leicht, dass dieser Algorithmus die Codierung<br />

C(m i ) korrekt berechnet. Etwas formaler folgt die Korrektheit durch<br />

vollständige Induktion über i aus den Gleichungen<br />

L(m) = ∑ y


Da jeder Durchlauf der Schleife im 2. Schritt nur konstante Anzahl von<br />

arithmetischen Operationen benötigt, ist die Laufzeit von IE-AC im RAM-<br />

Modell gegeben durch O(b). Wir werden hierzu allerdings noch viel mehr<br />

sagen müssen. Zunächst jedoch einige Beispiele.<br />

Beispiel 1: A = {a 1 , a 2 , a 3 }, p 1 = 0.8, p 2 = 0.02, p 3 = 0.18. Codiert werden<br />

soll m = a 1 a 3 a 2 a 1 . In der folgenden Tabelle sind die Werte s, l i − u i , w i<br />

im Laufe des Algorithmus IE-AC zusammengefasst. Die Werte für l i , u i , w i<br />

ergeben sich jeweils aus (2.7).<br />

s l i u i w i<br />

i = 0 − 0 1 1<br />

i = 1 1 0 0.8 0.8<br />

i = 2 3 0.656 0.8 0.144<br />

i = 3 2 0.7712 0.77408 0.00288<br />

i = 4 1 0.7712 0.773504 0.002304<br />

Da ⌈log(0.002304) −1 ⌉ = 9 und u 4 + w 4<br />

2<br />

= 0.772352 ist die Codierung von m<br />

gegeben durch 1100010110.<br />

Beispiel 2: Es sei A = {0, 1} mit den Quellwahrscheinlichkeiten p 1 =<br />

3<br />

4 , p 2 = 1 4<br />

. Weiter sei b = 5. Codiert werden soll m = 00101. Wir setzen<br />

a 1 = 0, a 2 01 und erhalten dann L 1 = 0, L 2 = 3 4 , L 3 = 1. Wir erhalten dann<br />

die folgende Tabelle für die Werte s, l i − u i , w i im Laufe des Algorithmus<br />

IE-AC.<br />

s l i u i w i<br />

i = 0 − 0 1 1<br />

i = 1 1 0<br />

3<br />

4<br />

i = 2 1 0<br />

9<br />

16<br />

3<br />

4<br />

9<br />

16<br />

i = 3 2<br />

27<br />

64<br />

i = 4 1<br />

27<br />

64<br />

9<br />

16<br />

135<br />

256<br />

9<br />

64<br />

27<br />

256<br />

i = 5 2<br />

513<br />

1024<br />

135<br />

256<br />

27<br />

1024<br />

Da ⌈log 27<br />

1024 ⌉ = 6 und u 5+l 5<br />

2<br />

= l 5 + w 5<br />

2<br />

= 1053<br />

2048<br />

ist die Codierung von m<br />

gegeben durch 1000001. In Abbildung 2.11 sind die einzelnen Teilintervalle,<br />

die im Laufe des Algorithmus berechnet werden, schematisch dargestellt.<br />

43


Abbildung 2.11: Beispiel für IE-AC<br />

Die sukzessive Unterteilung von Intervallen führt auch sofort auf den folgenden<br />

Algorithmus zur Decodierung eines einzelnen Codewortes.<br />

Eingabe Ein Codewort c ∈ {0, 1} ∗ .<br />

Ideal-Decode-AC (ID-AC)<br />

1. Schritt Setze l 0 := 0, u 0 := 1, w 0 := 1, m = ɛ, t = 0.c.<br />

2. Schritt Für i = 1, . . . , b wiederhole die folgenden Schritte.<br />

3. Schritt Finde s mit l i−1 + w i−1 L s ≤ t < l i−1 + w i−1 L s+1 .<br />

4. Schritt Setze<br />

5. Schritt Ausgabe m.<br />

l i := l i−1 + w i−1 L s<br />

u i := l i−1 + w i−1 L s+1<br />

w i = w i−1 p s<br />

m := ma s<br />

(2.9)<br />

Die Korrektheit des Algorithmus folgt aus der oben definierten Unterteilung<br />

in Teilintervalle und den Gleichungen in (2.8).<br />

44


Beispiel 4: Gegeben ist eine Quelle mit Alphabet A := {0, 1} und den<br />

Wahrscheinlichkeiten p 1 = p(0) = 3 4 und p 2 = p(1) = 1 4 . Damit gilt L 1 =<br />

0, L 2 = 3 4 und L 3 = 1. Ausserdem sei b = 3. Wir erhalten das Codewort<br />

c = 1010. Zunächst setzen wir l 0 = 0, u 0 = 1, m = ɛ und t := 0.10100 = 5 8 .<br />

Da 0 ≤ 5 8 < 3 4 , setzen wir s = 1 und damit ist m 1 = 0. Die neuen Parameterwerte<br />

sind nun<br />

l 1 = 0, u 1 = 3 4 , w 1 = 3 4 , m = 0.<br />

Als nächstes erhalten wir s = 2 und m 2 = 1, denn<br />

l 1 + w 1 L 2 = 0 + 3 3<br />

4 4 = 9<br />

16 ≤ 5 8 < 3 4 = l 1 + w 1 L 3 .<br />

Als neue Parameter erhalten wir<br />

Jetzt berechnen wir s = 1, denn<br />

l 2 = 9<br />

16 , u 2 = 3 4 , w 2 = 3<br />

16 , m = 01.<br />

l 2 + w 2 L 1 = 9 16 + 3 16 · 0 = 9 16 ≤ 5 8 < 9<br />

16 = l 2 + w 2 L 2 = 9 16 + 3 3<br />

16 4 = 45<br />

64 .<br />

Die neuen Parameterwerte sind<br />

l 3 = 9 16 , u 3 = 45<br />

64 , w 3 = 9<br />

64 , m = 010.<br />

Damit ist das Wort m = 010 decodiert.<br />

Beispiel 3: Gegeben ist die Quelle aus Beispiel 1. Es sei b = 2. Wir erhalten<br />

das Codewort c = 1111011100. Es gilt t = 0.c = 0.9648375. Wir setzen<br />

l 0 = 0, u 0 = 1, w 0 = 1 und m = ɛ. Da 0.82 ≤ 0.9648375 < 1, ist m 1 = a 3 .<br />

Die neuen Parameterwerte sind dann<br />

Da<br />

l 1 = 0.82, u − 1 = 1, w 1 = 0.18.<br />

0.82 + 0.18 · 0.8 ≤ 0.0.9648375 < 0.82 + 0.18 · 0.82,<br />

ist m 2 = a 2 . Das Codewort ist zu a 3 a 2 decodiert.<br />

45

Hurra! Ihre Datei wurde hochgeladen und ist bereit für die Veröffentlichung.

Erfolgreich gespeichert!

Leider ist etwas schief gelaufen!