Die Präsentation wird geladen. Bitte warten

Die Präsentation wird geladen. Bitte warten

Arithmetische Kodierung

Ähnliche Präsentationen


Präsentation zum Thema: "Arithmetische Kodierung"—  Präsentation transkript:

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


Herunterladen ppt "Arithmetische Kodierung"

Ähnliche Präsentationen


Google-Anzeigen