Entropiekodierung
Formeln
P( xi ) - Wahrscheinlichkeit für x P( x, y ) P( x) * P( y )
Komprimierung
loosy
* bildet Daten unter einer
bestimmten Fehlerquote ab
*bildet verschiedene Eingaben
auf die selben Ausgaben a
loosless
X - Menge der möglichen Ereignisse (Zeichen) mit ihren
* Bildet eine einige Eingaben
dazugehörigen Wahrscheinlichkeiten
auf kürze Ausgaben
* bildet immer einige Eingaben auf X Anzahl der Ereignisse (Zeichen) in X
längere Ausgaben ab
h(x) - Shannon information content
h( x) log 2
1
(in
P( x)
Source Coding Theorem
Bit); h( x, y ) h( x) h( y ) ; gibt an wie viel Information ein
für eine gegebene Fehlerquote 0 1 und ein beliebiges aber
bestimmtes Ereignis (Zeichen) hat. Daher ist h(x) die optimale
festes 0 gilt: Es existiert ein N 0 so das für alle N N 0 gilt:
Codelänge für x.
1
N
H ( X ) -Entropie; Informationsgehalt für eine bestimmte
H ( X ) L ( X ) H ( X )
N
Menge H ( X ) P( xi ) * h( xi )
1
i
N
L ( X ) H ( X )
=>
N
L0 ( X ) log 2 X Bitlänge pro Zeichen ohne Fehler
N
mit X eine N-Elementige Kette von Werten aus X
L ( X ) log 2 S mit S {x | x X P( x) 1 }
=> jede Komprimierung die auf weniger als N*H(X) Bits
komprimiert ist verlustbehaftet!
Symbolcodes
Quellalphabets mit
konstanter Länge
pro Zeichen (z.B. 8 Bit)
Zielalphabet mit variabler
Länge pro Zeichen
*häufige Zeichen kürzer,
seltenere Zeichen länger
*muss eindeutig decodierbar sein
*sollte einfach zu decodieren
*so kompakt wie möglich
Huffman coding:
Kraft-McMillan-Ungleichung
l(x )
Jeder Code hat ein Gewicht von 2 i wobei l ( x i ) die Länge
xi ist. Damit ein (Präfix-) Symbolcode eindeutig
1
ist muss gelten: l ( x ) 1
i
i 2
des Codewortes
Probleme bei Huffman coding:
1) repräsentiert zunächst alle möglichen Zeichen als einfache
Bäume, die nur aus einem Blatt bestehen. Der Knoten jedes dieser
Bäume enthält außerdem den Wahrscheinlichkeitswert für das
entsprechende Zeichen.
2) fasse solange die zwei Teilbäume mit den geringsten
Wahrscheinlichkeiten zusammen bis nur noch ein Baum existiert.
Bei jedem Zusammenfassen erhält die neu Wurzel den Wert der
der Summe der Teilbäume entspricht.
3) das Ergebnis ist ein Binärbaum mit nahezu optimaler Codelänge
Arithmetic Coding:
Bitlänge pro Zeichen mit Fehler
bildet jede Eingabe auf eine Zahl im Intervall 0,1 R ab.
benötigt besonderes Steuerzeichen um das Ende des kodierten
Textes zu signalisieren
Kodierung:
1) partioniere Intervall entsprechend der Wahrscheinlichkeit der
möglichen Zeichen
2) Wähle das Teilintervall in dem nächstes Eingabezeichen liegt.
3) wiederhole Schritt 1-2 für jedes weitere Zeichen
Dekodierung:
1) partioniere Intervall entsprechend der Wahrscheinlichkeit der
möglichen Zeichen
2) Wähle das Teilintervall in dem das Codewort liegt.
3) schreibe das den Teilintervall entsprechende Zeichen
4) wiederhole Schritt 1-3 bis das EOF-Zeichen gelesen wurde
Code mitspeichern oder suboptimalen statischen Code
verwenden
betrachtet nur einzelne Zeichen, nicht die Wahrscheinlichkeit
von Zeichenpaaren
verwendet immer n ganze Bits pro Zeichen h(x) muss nicht
ganzzahlig sein
Probleme bei Arithmetic Coding:
benötigt immer ein Wahrscheinlichkeitsmodel
Qualität vom verwendeten Model abhängig
Probleme bei der Implementierung: Floating Zahlen haben nur
beschränkte Genauigkeit.
Wörterbuchtechniken
Statische Verfahren:
festen Wörterbuch (Grundzeichen + häufige Zeichenpaare)
einfach + wenig effizient
Semiadaptive Verfahren
erzeugen zu jeder Eingabe optimales Wörterbuch
muss aber Wörterbuch mit Daten speichern
Entscheidung welche Phrasen im Wörterbuch auftreten
kompliziert
Adaptive Verfahren
beginnen mit leerem/kleinem Wörterbuch
erweitern Wörterbuch erst beim auftreten einer Phrase =>müssen
Wörterbuch nicht speichern
können u.U. auch Phrasen aus Wörterbuch wieder entfernen
LZ77
1) vergleiche die nächsten zu kodierenden Zeichen (Look-AheadBuffer) mit bereits kodierten Zeichen (Search-Buffer) um die
längste Übereinstimmung zu finden.
2) speichere Entfernung zur Übereinstimmung und deren Länge,
sowie das nächste zu kodierende Zeichen
beachte das auch die Zeichen im Look-Ahead-Buffer zum
Search-Buffer
gzip, png
LZ78
verwendet separates Wörterbuch, zu beginn leer
1) finde längste Übereinstimmung zwischen nächsten zu
kodierenden Zeichen und Wörterbuch
2) speichere Indexnummer des Wörterbucheintrages und das erste
Zeichen nach der Übereinstimmung (Folgezeichen)
3) nimm Übereinstimmung + Zeichen als neuen
Wörterbucheintrag auf
speichere die Indexnummer nur mit soviel Bits das der höchste
momentane Index gespeichert werden könnte
compress, gif
Variationen zu LZ77:
unbeschränkter Search-Buffer (LZR)
kurze Übereinstimmungen als Klartext speichern (LZSS)
Teilstrings aus Search-Buffer zwischenspeichern
(Kodiergeschwindigkeit) (LZSS)
Offset-Wert-Länge dynamisch verkürzen (LZB)
Länge-Wert-Länge dynamisch verkürzen (LZB)
Token mit Huffman-Code komprimieren (LZH)
Variationen zu LZ78:
Wörterbuch begrenzen, wenn voll komplett löschen
Wörterbuch begrenzen, wenn voll statisch weiterverwenden
Folgezeichen nicht explizit speichern (LZW, patentiert)
variable Bitlänge für Token verwenden (LZC)
Wörterbuch begrenzen, wenn voll statisch weiterverwenden bis
Komprimierungsrate spürbar absinkt, dann löschen (LZC)