Präsentation herunterladen
Die Präsentation wird geladen. Bitte warten
1
Arithmetische Kodierung
Eric Bodden, Malte Clasen, Joachim Kneis
2
Eric Bodden, Malte Clasen, Joachim Kneis
Motivation Ziel des Verfahrens: beliebige Daten verlustfrei komprimieren Mittel und Weg: Sequenzen durch Codes ersetzen Methode: Symbole durch Codes ersetzen (Huffman) Sequenzen durch Codes ersetzen (Arithmetische Kodierung) Kodierung im Intervall [0,1) Eric Bodden, Malte Clasen, Joachim Kneis
3
Eric Bodden, Malte Clasen, Joachim Kneis
Geschichte 1960: Elias, Abramson – Erste Ansätze 1976: Pasco, Rissanen – Beweis, das endlich genaue Arithmetik ausreicht 1980: Rubin, Guazzo, Rissanen, Langdon - Erster praktikabler Algorithmus Scaling FIFO-Prinzip Erste hardwarenahe Realisierungen Eric Bodden, Malte Clasen, Joachim Kneis
4
Definition: Alphabet, Symbol, Sequenz
endliche, nichtleere Menge z.B. A = {a,b,c,d} Symbol: Element des Alphabets z.B. a A Sequenz: Symbolfolge z.B. S = abaabcda A* Eric Bodden, Malte Clasen, Joachim Kneis
5
Eric Bodden, Malte Clasen, Joachim Kneis
Definition: Modell Modell: Abbildung A [0,1): ai PM(ai) PM(ai) ist angenommene Wahrscheinlichkeit Nicht zwingend gleich mit P(ai), der korrekten Wahrscheinlichkeit Im Folgenden: Annahme eines einfachen Modells Eric Bodden, Malte Clasen, Joachim Kneis
6
Eric Bodden, Malte Clasen, Joachim Kneis
Beispiel: Modell a 6,51 % h 4,76 % o 2,51 % v 0,67 % b 1,89 % i 7,55 % p 0,79 % w c 3,06 % j 0,27 % q 0,02 % x 0,03 % d 5,08 % k 1,21 % r 7,00 % y 0,04 % e 17,40 % l 3,44 % s 7,27 % z 1,13 % f 1,66 % m 2,53 % t 6,15 % g 3,01 % n 9,78 % u 4,35 % Eric Bodden, Malte Clasen, Joachim Kneis
7
Eric Bodden, Malte Clasen, Joachim Kneis
Definition: Entropie Entropie H ist Maß für Informationsgehalt einer Sequenz S Definition: Beachte: [H] = Bits / Symbol Eric Bodden, Malte Clasen, Joachim Kneis
8
Definition: Modellabhängige Entropie
Problem: Korrekte Wahrscheinlichkeiten nicht bekannt Also Differenzierung nötig Modellabhängige Entropie Definition: Eric Bodden, Malte Clasen, Joachim Kneis
9
Eric Bodden, Malte Clasen, Joachim Kneis
Beispiel: Entropie (1) Angepaßte Entropie der Sequenz „abaabcda“ unter dem Modell a=50%, b=25%, c=12,5%, d=12,5%. (Modell mit korrektem PM) Eric Bodden, Malte Clasen, Joachim Kneis
10
Eric Bodden, Malte Clasen, Joachim Kneis
Beispiel: Entropie (2) Angepaßte Entropie der Sequenz „abaabcda“ unter dem Modell a=12,5%, b=12,5%, c=50%, d=25% (Modell mit schlechtem PM) Eric Bodden, Malte Clasen, Joachim Kneis
11
Definition: Kodierer/Dekodierer
Algorithmus, der eine gegebene Sequenz S kodiert Ausgabe: Code(S) Dekodierer: Algorithmus, der S wieder aus Code(S) herstellt Eric Bodden, Malte Clasen, Joachim Kneis
12
Einführung: Kodierung
Relative Häufigkeiten aller Symbole über Alphabet A ergeben addiert 1 Einzelne relative Häufigkeiten können als Teilintervalle von [0,1) aufgefasst werden Logische Konsequenz: Überschneidungsfreies Verteilen der Teilintervalle über das Gesamtintervall Resultat: Partition von [0,1) Eric Bodden, Malte Clasen, Joachim Kneis
13
Kodierung in R: Grundidee Intervallbildung
Idee: Wahrscheinlichkeiten werden kumuliert Dies liefert Teilintervall von [0,1) für jedes Symbol des Alphabets Eric Bodden, Malte Clasen, Joachim Kneis
14
Kodierung in R: Kumulierte Wahrscheinlichkeiten
Intervall aufteilen durch kumulierte Wahrscheinlichkeiten dazu Definition von K(ak) für ak A: Eric Bodden, Malte Clasen, Joachim Kneis
15
Intervallschachtelung
Für das erste Symbol ordnen wir diesem ein Teilintervall zu Für das zweite betrachten wir dann dieses Teilintervall und partitionieren dies Iterieren bis Sequenzende... Ergebnis: Teilintervall von [0,1) Eric Bodden, Malte Clasen, Joachim Kneis
16
Kodierung in R: Die Grenzen low und high
Bezeichnung der Intervallgrenzen: untere Grenze: low obere Grenze: high Grenzen werden im weiteren Verlauf nach dem Lesen jeden Symbols aktualisiert: Eric Bodden, Malte Clasen, Joachim Kneis
17
Kodierung in R: Baumartige Partitionierung
daraus resultiert: Baumartige Partitionierung von [0,1) Eric Bodden, Malte Clasen, Joachim Kneis
18
Kodierung in R: Beispiel (1)
Eric Bodden, Malte Clasen, Joachim Kneis
19
Kodierung in R: Beispiel (2)
Eric Bodden, Malte Clasen, Joachim Kneis
20
Kodierung in R: Algorithmus in Pseudocode
low =0; high=1; do { temp = lies_zeichen(); low‘ = Modell-> untere_Grenze(temp,low,high); high‘ = Modell-> obere_Grenze (temp,low,high); low = low‘; high = high‘; } while ( !ende_der_sequenz() ); return( wert_im_intervall(low,high) ); Eric Bodden, Malte Clasen, Joachim Kneis
21
Abschluß der Codesequenz
Sequenzende muß dem Dekodierer mitgeteilt werden Möglichkeiten: Intervallgrenzen übertragen Länge der Sequenz übertragen Endsymbol mit minimaler Wahrscheinlichkeit im Modell bereitstellen Eric Bodden, Malte Clasen, Joachim Kneis
22
Einführung: Dekodierung
Idee: Schritte des Kodierers nachvollziehen Schritte laufen genau parallel zum Kodierungsvorgang Eingabe: Code in Form einer Zahl aus dem Zielintervall des Kodierers Verfahren: Überprüfen, in welches Teilintervall diese Zahl fällt, Teilintervall neu aufteilen und iterieren bis Sequenzende erreicht Eric Bodden, Malte Clasen, Joachim Kneis
23
Dekodierung in R: Beispiel (1)
Eric Bodden, Malte Clasen, Joachim Kneis
24
Dekodierung in R: Beispiel (2)
Eric Bodden, Malte Clasen, Joachim Kneis
25
Dekodierung in R: Algorithmus in Pseudocode
Eingabe: „Zahl“ seq =''; low =0; high =1; do { low‘ = modell->untere_grenze(Zahl,low,high); high‘ = modell->obere_grenze (Zahl,low,high); low = low‘; high = high‘; seq .= modell->symbol_zu_intervall(low,high); } while ( !ende_der_sequenz() ); return(seq); Eric Bodden, Malte Clasen, Joachim Kneis
26
Eric Bodden, Malte Clasen, Joachim Kneis
Zusammenfassung Bisher: Kodierung über reellen Zahlen [0,1) in Teilintervalle aufteilen sukzessive Intervalle aufziehen Problem: unendliche Genauigkeit vorausgesetzt Eric Bodden, Malte Clasen, Joachim Kneis
27
Kodierung mittels Integers (Implementierung)
Warum Integers? keine unendlichen reellen Zahlen im Rechner Integer in einfachen CPU schneller als Float geringer Speicherbedarf Konsequenz diskretes Intervall: [0,max_int] , max_int N max_int: größter darstellbarer Integerwert Eric Bodden, Malte Clasen, Joachim Kneis
28
Die Wahrscheinlichkeitsgrenzen low_count und high_count
Wahrscheinlichkeitsgrenzen entsprechend anpassen: low_count = low * total high_count = high * total total = Summe der Häufigkeiten der Symbole Eric Bodden, Malte Clasen, Joachim Kneis
29
Eric Bodden, Malte Clasen, Joachim Kneis
Der Kodierer 3 statische Variablen mLow = untere Grenze (0) mHigh = obere Grenze (max_int) mStep = Schrittweite Interface void Encoder( unsigned int low_count, unsigned int high_count, unsigned int total ); Eric Bodden, Malte Clasen, Joachim Kneis
30
Eric Bodden, Malte Clasen, Joachim Kneis
Grenze Eric Bodden, Malte Clasen, Joachim Kneis
31
Eric Bodden, Malte Clasen, Joachim Kneis
Beispiel: Kodierung „a“:Encode( 0, 4, 8 ); [Pa=4,Pb=2,Pc=1,Pd=1] mStep = ( mHigh - mLow + 1 ) / total; = ( ) / 8 = 128 / 8 = 16 mHigh = mLow + mStep * high_count - 1; = * 4 - 1 = 64 – 1 = 63 mLow = mLow + mStep * low_count; = * 0 = 0 eventuell noch ein bild dazu. Eric Bodden, Malte Clasen, Joachim Kneis
32
Eric Bodden, Malte Clasen, Joachim Kneis
Der Dekodierer Interface: Wahrscheinlichkeitsintervall bestimmen uint Decode_Target( unsigned int total ); Encoder nachbilden void Decode( unsigned int low_count, unsigned int high_count ); todo grafik Eric Bodden, Malte Clasen, Joachim Kneis
33
Beispiel: Dekodierung (1)
Decode_Target( 8 ); [Pa=4,Pb=2,Pc=1,Pd=1] mStep = ( mHigh - mLow + 1 ) / total; = ( ) / 8 = 128 / 8 = 16 value = ( mBuffer - mLow ) / mStep; = ( ) / 16 = 40 / 16 = 2 return value; // 2 [0,4) = „a“ Eric Bodden, Malte Clasen, Joachim Kneis
34
Beispiel: Dekodierung (2)
Decode( 0, 4 ); [Pa=4,Pb=2,Pc=1,Pd=1] mHigh = mLow + mStep * high_count - 1; = * 4 - 1 = 64 – 1 = 63 mLow = mLow + mStep * low_count; = * 0 = 0 Eric Bodden, Malte Clasen, Joachim Kneis
35
Problem: Begrenzt genaue Arithmetik
Bei bisherigem Verfahren wird betrachtetes Intervall beliebig klein. Folge: total > mHigh – mLow also: (mHigh – mLow + 1) / total = 0 Eric Bodden, Malte Clasen, Joachim Kneis
36
Lösung: Skalierung des Intervalls
Aber: Führende Stellen von mHigh und mLow gleich, also unveränderlich Also: Führende Stellen schon senden/speichern Intervall entsprechend vergrößern Mittel dazu: Skalierungsfunktionen Eric Bodden, Malte Clasen, Joachim Kneis
37
Definition: E1-Skalierung
while( mHigh < g_Half ) { SetBit( 0 ); mLow = mLow * 2; mHigh = mHigh * 2 + 1; } * 2 entspricht Shift nach links Eric Bodden, Malte Clasen, Joachim Kneis
38
Definition: E2-Skalierung
while( mLow >= g_Half ) { SetBit( 1 ); mLow = 2*(mLow-g_Half); mHigh = 2*(mHigh-g_Half)+1; } Eric Bodden, Malte Clasen, Joachim Kneis
39
Problem: Was tun bei Intervallmitte?
Problem bei mittig liegendem Intervall: führende Stellen von mLow und mHigh bleiben längere Zeit invers zueinander Folge: E1/E2-Skalierung nicht anwendbar Also: gleiches Problem wie zuvor Eric Bodden, Malte Clasen, Joachim Kneis
40
Eric Bodden, Malte Clasen, Joachim Kneis
Lösung Bei mittig liegendem Intervall: Intervall mittig aufziehen iterieren bis obere bzw. untere Hälfte festliegt Folge: E3-Skalierung Eric Bodden, Malte Clasen, Joachim Kneis
41
Definition: E3-Skalierung
while( ( g_1Q <= mLow ) && ( mHigh < g_3Q ) ) { mScale++; mLow = 2*(mLow-g_1Q); mHigh= 2*(mHigh-g_1Q) + 1; } Eric Bodden, Malte Clasen, Joachim Kneis
42
Beispiel: E3-Skalierung
E3, E3, E1 Eric Bodden, Malte Clasen, Joachim Kneis
43
Beispiel: Gleichheit von E1 E3^n und E2^n E1
Anwendung von E1, E2, E2 (also 011) Eric Bodden, Malte Clasen, Joachim Kneis
44
Beweis der Gleichheit (1)
Formalisierung dieser Gleichheit durch Hintereinanderausführung der Abbildungen: Eric Bodden, Malte Clasen, Joachim Kneis
45
Beweis der Gleichheit (2)
Text überlegen Eric Bodden, Malte Clasen, Joachim Kneis
46
Beweis der Gleichheit (3)
Text überlegen Eric Bodden, Malte Clasen, Joachim Kneis
47
Auflösung E3-Skalierung (1)
Bisher nur E3-Skalierungen mitgezählt. Nun, wo die Hälfte feststeht, noch entsprechende Bits ausgeben: while( ( mHigh < g_Half ) || ( mLow >= g_Half ) ) { if( mHigh < g_Half ) // E1 { SetBit( 0 ); mLow = mLow * 2; mHigh = mHigh * 2 + 1; for(; mScale > 0; mScale-- ) SetBit( 1 ); // 1 == !0 } ... Eric Bodden, Malte Clasen, Joachim Kneis
48
Auflösung E3-Skalierung (2)
while( ( mHigh < g_Half ) || ( mLow >= g_Half ) ) { ... else if(mLow >= g_Half ) // E2 { SetBit( 1 ); mLow = 2 * ( mLow - g_Half ); mHigh = 2 * ( mHigh - g_Half ) + 1; for(; mScale > 0; mScale-- ) SetBit( 0 ); // 0 == !1 } Eric Bodden, Malte Clasen, Joachim Kneis
49
Dekodierer: Buffer auch skalieren
Im Dekoder muß der Buffer noch nachskaliert werden: // E1 mBuffer = 2 * mBuffer + GetBit(); // E2 mBuffer = 2 * (mBuffer-g_Half) + GetBit(); // E3 mBuffer = 2 * (mBuffer-g_1Q) + GetBit(); Eric Bodden, Malte Clasen, Joachim Kneis
50
Zusammenfassung Kodierer
void Encode( unsigned int low_count, unsigned int high_count, unsigned int total ); void EncodeFinish(); EncodeFinish() schließt die Sequenz korrekt ab. Eric Bodden, Malte Clasen, Joachim Kneis
51
Abschluß der Codesequenz
if( mLow < g_1Q ) // mLow < 1Q < Half <= mHigh { SetBit( 0 ); // 1 + e3-Skalierung abbauen for( int i=0; i<mScale+1; i++ ) SetBit( 1 ); } else // mLow < Half < 3Q <= mHigh // der Decoder fügt die Nullen automatisch an Eric Bodden, Malte Clasen, Joachim Kneis
52
Zusammenfassung Dekodierer
void DecodeStart()= for( int i=0; i<31; i++ ) mBuffer = ( mBuffer << 1 ) | GetBit(); uint DecodeTarget(unsigned int total ); void Decode(unsigned int low_count, unsigned int high_count ); Eric Bodden, Malte Clasen, Joachim Kneis
53
Effizienzbetrachtung (1)
Länge des Codes für jedes Symbol ai A kann wie folgt beschränkt werden: Im folgenden: Wahrscheinlichkeiten über Sequenzen anstatt Symbolen betrachten. l(x) Eric Bodden, Malte Clasen, Joachim Kneis
54
Effizienzbetrachtung (2)
Eric Bodden, Malte Clasen, Joachim Kneis
55
Effizienzbetrachtung (3)
Durchschnittliche Länge >= Entropie Also durchschnittliche Länge pro Symbol: Eric Bodden, Malte Clasen, Joachim Kneis
56
Effizienzbetrachtung (4)
Entropie der Sequenz S(m) mit |S(m)|=m ist m-fache Entropie der Symbole x: Es folgt: Eric Bodden, Malte Clasen, Joachim Kneis
57
Effizienzbetrachtung – Vergleich Huffman
Für Huffman bekannt: Für Extended Huffman: Eric Bodden, Malte Clasen, Joachim Kneis
58
Nachteile gegenüber der Huffman-Kodierung
Nachteil bei sequentieller Kodierung: Wird ein Bit falsch empfangen, so ist der gesamte nachfolgende Code nicht korrekt dekodierbar. Huffman unter Umständen speicher-effizienter bei: großen Alphabeten und kurzen Sequenzen [(0,086+Pmax)* HM(S) ] oder Wahrscheinlichkeiten von P(a)=2n Arithmetische Kodierung i.a. etwas langsamer als Huffman Eric Bodden, Malte Clasen, Joachim Kneis
59
Vorteile gegenüber der Huffman-Kodierung
Meist höhere Speichereffizienz, auch in Bezug auf Arbeitsspeicher Grund: Vergabe unganzzahliger Bitlängen sowie Nutzung konstant großen Arbeitsspeichers Noch effizienter für kleine Alphabete Leichtes Aufsetzen verschiedener Modelle möglich Adaptive Modelle leichter zu implementieren Eric Bodden, Malte Clasen, Joachim Kneis
60
Eric Bodden, Malte Clasen, Joachim Kneis
Alternative Modelle Statische Modelle Feste angenommene Wahrscheinlichkeitsverteilung Adaptive Modelle Wahrscheinlichkeiten werden beim Lesen jedes Symbols neu berechnet Vorteile: Modell muss nicht übertragen werden Modell passt sich den Daten an ab hier Malte Eric Bodden, Malte Clasen, Joachim Kneis
61
Eric Bodden, Malte Clasen, Joachim Kneis
Order-n-Modelle Betrachtung der Wahrscheinlichkeiten im Kontext der letzten n Symbole Beispiel: „u“ an sich: Wahrscheinlichkeit 4,35 % „u“ nach „q“: Wahrscheinlichkeit 99 % genauere Vorhersage durch Kontext Eric Bodden, Malte Clasen, Joachim Kneis
62
Eric Bodden, Malte Clasen, Joachim Kneis
PPM Order „0..n“ Symbol in Order-n-Kontext: Kodiere Symbol Sonst: Wechsel zu n-1-Kontext Order -1: Speichere Symbole in Gleichverteilung Für jeden Kontext eigene Verteilung Eric Bodden, Malte Clasen, Joachim Kneis
63
Eric Bodden, Malte Clasen, Joachim Kneis
PPM (2) Probleme Order-Wechsel für Decoder kennzeichnen hoher Speicherbedarf Vorteile praktisch bestmögliche Kompression (neben BWT) gut auch bei kleinen Dateien ( < 1 Mb ) Eric Bodden, Malte Clasen, Joachim Kneis
64
Eric Bodden, Malte Clasen, Joachim Kneis
Zusammenfassung Arithmetische Kodierung ist zur Kompression geeignet Implementierung mit Integers oder Floats möglich Sequentielles Arbeiten ist möglich und sinnvoll Dazu Methode des Scaling erforderlich Verfahren sehr effizient für realistische Quellen Möglichkeit des modularen Austauschs von Modellen Sehr gut für adaptive Modelle, Erweiterungen wie PPM Eric Bodden, Malte Clasen, Joachim Kneis
65
Eric Bodden, Malte Clasen, Joachim Kneis
Ausblicke Range Coder: Benutzt ganze Bytes statt Bits für Skaling-Methoden Resultat: Bis zu 50% schneller bei nur 0,01% längerem Code In Zukunft: aufgrund schnellerer Float-Operationen (z.B. Itanium) eher Entwicklung in diese Richtung, weg von Integer-Arithmetik Eric Bodden, Malte Clasen, Joachim Kneis
66
Eric Bodden, Malte Clasen, Joachim Kneis
Implementierung Implementierung in C++ Einfacher Kodierer / Dekodierer Auswahl verschiedener Modelle möglich Visualisierung mit Kodierer als DLL Download möglich unter: Eric Bodden, Malte Clasen, Joachim Kneis
Ähnliche Präsentationen
© 2025 SlidePlayer.org Inc.
All rights reserved.