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)