Proseminar Datenkompression Thema : Arithmetische Kodierung Arithmetische Kodierung 18.03.2002 Eric Bodden, Malte Clasen, Joachim Kneis.

Download Report

Transcript Proseminar Datenkompression Thema : Arithmetische Kodierung Arithmetische Kodierung 18.03.2002 Eric Bodden, Malte Clasen, Joachim Kneis.

Proseminar Datenkompression
Thema : Arithmetische Kodierung
Arithmetische
Kodierung
18.03.2002
Eric Bodden, Malte Clasen, Joachim Kneis
1
Proseminar Datenkompression
Thema : Arithmetische Kodierung
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)
18.03.2002
Eric Bodden, Malte Clasen, Joachim Kneis
2
Proseminar Datenkompression
Thema : Arithmetische Kodierung
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
18.03.2002
Eric Bodden, Malte Clasen, Joachim Kneis
3
Proseminar Datenkompression
Thema : Arithmetische Kodierung
Definition: Alphabet, Symbol, Sequenz
Alphabet:
• 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*
18.03.2002
Eric Bodden, Malte Clasen, Joachim Kneis
4
Proseminar Datenkompression
Thema : Arithmetische Kodierung
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
18.03.2002
Eric Bodden, Malte Clasen, Joachim Kneis
5
Proseminar Datenkompression
Thema : Arithmetische Kodierung
Beispiel: Modell
a
6,51 %
h
4,76 %
o
2,51 %
v
0,67 %
b
1,89 %
i
7,55 %
p
0,79 %
w
1,89 %
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 %
18.03.2002
Eric Bodden, Malte Clasen, Joachim Kneis
6
Proseminar Datenkompression
Thema : Arithmetische Kodierung
Definition: Entropie
Entropie H ist Maß für Informationsgehalt einer Sequenz S
Definition:
Beachte: [H] = Bits / Symbol
18.03.2002
Eric Bodden, Malte Clasen, Joachim Kneis
7
Proseminar Datenkompression
Thema : Arithmetische Kodierung
Definition: Modellabhängige Entropie
Problem: Korrekte Wahrscheinlichkeiten nicht bekannt
Also Differenzierung nötig
Modellabhängige Entropie
Definition:
18.03.2002
Eric Bodden, Malte Clasen, Joachim Kneis
8
Proseminar Datenkompression
Thema : Arithmetische Kodierung
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)
18.03.2002
Eric Bodden, Malte Clasen, Joachim Kneis
9
Proseminar Datenkompression
Thema : Arithmetische Kodierung
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)
18.03.2002
Eric Bodden, Malte Clasen, Joachim Kneis
10
Proseminar Datenkompression
Thema : Arithmetische Kodierung
Definition: Kodierer/Dekodierer
Kodierer:
• Algorithmus, der eine gegebene Sequenz S kodiert
• Ausgabe: Code(S)
Dekodierer:
• Algorithmus, der S wieder aus Code(S) herstellt
18.03.2002
Eric Bodden, Malte Clasen, Joachim Kneis
11
Proseminar Datenkompression
Thema : Arithmetische Kodierung
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)
18.03.2002
Eric Bodden, Malte Clasen, Joachim Kneis
12
Proseminar Datenkompression
Thema : Arithmetische Kodierung
Kodierung in R: Grundidee Intervallbildung
Idee: Wahrscheinlichkeiten werden kumuliert
Dies liefert Teilintervall von [0,1) für jedes Symbol des Alphabets
0
0,5
a
18.03.2002
0,75 0,875
b
Eric Bodden, Malte Clasen, Joachim Kneis
c
1
d
13
Proseminar Datenkompression
Thema : Arithmetische Kodierung
Kodierung in R: Kumulierte Wahrscheinlichkeiten
Intervall aufteilen durch kumulierte Wahrscheinlichkeiten
dazu Definition von K(ak) für ak  A:
18.03.2002
Eric Bodden, Malte Clasen, Joachim Kneis
14
Proseminar Datenkompression
Thema : Arithmetische Kodierung
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)
18.03.2002
Eric Bodden, Malte Clasen, Joachim Kneis
15
Proseminar Datenkompression
Thema : Arithmetische Kodierung
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:
18.03.2002
Eric Bodden, Malte Clasen, Joachim Kneis
16
Proseminar Datenkompression
Thema : Arithmetische Kodierung
Kodierung in R: Baumartige Partitionierung
daraus resultiert: Baumartige Partitionierung von [0,1)
a
d
b
a
d
b
c
...
a
d
b
c
...
c
s1
a
d
b
c
...
0
18.03.2002
a
d
b
s2
c
...
.
.
.
s3
1
Eric Bodden, Malte Clasen, Joachim Kneis
17
Proseminar Datenkompression
Thema : Arithmetische Kodierung
Kodierung in R: Beispiel (1)
Eingabe a
1
0,5
Eingabe a
0,375
Eingabe a
0,3125
0,28125
d
d
d
d
d
c
c
c
c
c
b
b
b
b
b
0,5
0,25
a
a
0
18.03.2002
Eingabe b
0
0,3125
0,28125
0,265625
a
a
a
0,25
0,25
0,25
Eric Bodden, Malte Clasen, Joachim Kneis
18
Proseminar Datenkompression
Thema : Arithmetische Kodierung
Kodierung in R: Beispiel (2)
0,28125
Eingabe c
0,2734375
Eingabe d
0,2724609375
Eingabe a
0,2724609375
0,2723999024
d
d
d
d
d
c
c
c
c
c
b
b
b
b
b
0,265625
a
0,25
18.03.2002
0,26953125
a
0,265625
0,2719726563
a
0,271484375
0,2723999024
a
0,2723388672
Eric Bodden, Malte Clasen, Joachim Kneis
0,2723693848
Zielintervall
Eingabe b
a
0,2723388672
19
Proseminar Datenkompression
Thema : Arithmetische Kodierung
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) );
18.03.2002
Eric Bodden, Malte Clasen, Joachim Kneis
20
Proseminar Datenkompression
Thema : Arithmetische Kodierung
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
18.03.2002
Eric Bodden, Malte Clasen, Joachim Kneis
21
Proseminar Datenkompression
Thema : Arithmetische Kodierung
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
18.03.2002
Eric Bodden, Malte Clasen, Joachim Kneis
22
Proseminar Datenkompression
Thema : Arithmetische Kodierung
Dekodierung in R: Beispiel (1)
Ausgabe a Ausgabe b
1
0,5
Ausgabe a
0,375
Ausgabe a
0,3125
0,28125
d
d
d
d
d
c
c
c
c
c
b
b
b
b
b
0,5
0,25
a
a
0
18.03.2002
0
0,3125
0,28125
0,265625
a
a
a
0,25
0,25
0,25
Eric Bodden, Malte Clasen, Joachim Kneis
23
Proseminar Datenkompression
Thema : Arithmetische Kodierung
Dekodierung in R: Beispiel (2)
0,28125
Ausgabe c
0,2734375
Ausgabe d
0,2724609375
Ausgabe a
0,2724609375
0,2723999024
d
d
d
d
d
c
c
c
c
c
b
b
b
b
b
0,265625
a
0,25
18.03.2002
0,26953125
a
0,265625
0,2719726563
a
0,271484375
0,2723999024
a
0,2723388672
Eric Bodden, Malte Clasen, Joachim Kneis
0,2723693848
Zielintervall
Ausgabe b
a
0,2723388672
24
Proseminar Datenkompression
Thema : Arithmetische Kodierung
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);
18.03.2002
Eric Bodden, Malte Clasen, Joachim Kneis
25
Proseminar Datenkompression
Thema : Arithmetische Kodierung
Zusammenfassung
Bisher:
• Kodierung über reellen Zahlen
• [0,1) in Teilintervalle aufteilen
• sukzessive Intervalle aufziehen
Problem:
• unendliche Genauigkeit vorausgesetzt
18.03.2002
Eric Bodden, Malte Clasen, Joachim Kneis
26
Proseminar Datenkompression
Thema : Arithmetische Kodierung
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
18.03.2002
Eric Bodden, Malte Clasen, Joachim Kneis
27
Proseminar Datenkompression
Thema : Arithmetische Kodierung
Die Wahrscheinlichkeitsgrenzen low_count und high_count
Wahrscheinlichkeitsgrenzen entsprechend anpassen:
low_count = low * total
1
total
high
high_count
low
low_count
0
0
high_count = high * total
total = Summe der
Häufigkeiten der Symbole
18.03.2002
Eric Bodden, Malte Clasen, Joachim Kneis
28
Proseminar Datenkompression
Thema : Arithmetische Kodierung
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 );
18.03.2002
Eric Bodden, Malte Clasen, Joachim Kneis
29
Proseminar Datenkompression
Thema : Arithmetische Kodierung
Grenze
max_int
mHigh
max_int
total
d
c
b
a
mLow
high_count
low_count
0
0
18.03.2002
mHigh
mLow
0
Eric Bodden, Malte Clasen, Joachim Kneis
30
Proseminar Datenkompression
Thema : Arithmetische Kodierung
Beispiel: Kodierung
„a“:Encode( 0, 4, 8 ); [Pa=4,Pb=2,Pc=1,Pd=1]
mStep = ( mHigh - mLow + 1 ) / total;
= ( 127 - 0 + 1) / 8
= 128 / 8 = 16
mHigh = mLow + mStep * high_count - 1;
= 0 + 16 * 4 - 1
= 64 – 1 = 63
mLow = mLow + mStep * low_count;
= 0 + 16 * 0 = 0
18.03.2002
Eric Bodden, Malte Clasen, Joachim Kneis
31
Proseminar Datenkompression
Thema : Arithmetische Kodierung
Der Dekodierer
Interface:
Wahrscheinlichkeitsintervall bestimmen
uint Decode_Target( unsigned int total );
Encoder nachbilden
void Decode( unsigned int low_count,
unsigned int high_count );
18.03.2002
Eric Bodden, Malte Clasen, Joachim Kneis
32
Proseminar Datenkompression
Thema : Arithmetische Kodierung
Beispiel: Dekodierung (1)
Decode_Target( 8 ); [Pa=4,Pb=2,Pc=1,Pd=1]
mStep = ( mHigh - mLow + 1 ) / total;
= ( 127 - 0 + 1 ) / 8
= 128 / 8 = 16
value = ( mBuffer - mLow ) / mStep;
= ( 40 - 0 ) / 16
= 40 / 16 = 2
return value; // 2  [0,4) = „a“
18.03.2002
Eric Bodden, Malte Clasen, Joachim Kneis
33
Proseminar Datenkompression
Thema : Arithmetische Kodierung
Beispiel: Dekodierung (2)
Decode( 0, 4 ); [Pa=4,Pb=2,Pc=1,Pd=1]
mHigh = mLow + mStep * high_count - 1;
= 0 + 16 * 4 - 1
= 64 – 1 = 63
mLow = mLow + mStep * low_count;
= 0 + 16 * 0 = 0
18.03.2002
Eric Bodden, Malte Clasen, Joachim Kneis
34
Proseminar Datenkompression
Thema : Arithmetische Kodierung
Problem: Begrenzt genaue Arithmetik
Problem:
• Bei bisherigem Verfahren wird betrachtetes Intervall
beliebig klein.
• Folge: total > mHigh – mLow
• also: (mHigh – mLow + 1) / total = 0
18.03.2002
Eric Bodden, Malte Clasen, Joachim Kneis
35
Proseminar Datenkompression
Thema : Arithmetische Kodierung
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
18.03.2002
Eric Bodden, Malte Clasen, Joachim Kneis
36
Proseminar Datenkompression
Thema : Arithmetische Kodierung
Definition: E1-Skalierung
while( mHigh < g_Half )
1
0,5
0,5
0,25
0
0
{
SetBit( 0 );
mLow
= mLow
* 2;
mHigh = mHigh * 2 + 1;
}
* 2 entspricht Shift nach links
18.03.2002
Eric Bodden, Malte Clasen, Joachim Kneis
37
Proseminar Datenkompression
Thema : Arithmetische Kodierung
Definition: E2-Skalierung
while( mLow >= g_Half )
1
1
0,5
0,75
0
0,5
{
SetBit( 1 );
mLow
= 2*(mLow-g_Half);
mHigh = 2*(mHigh-g_Half)+1;
}
18.03.2002
Eric Bodden, Malte Clasen, Joachim Kneis
38
Proseminar Datenkompression
Thema : Arithmetische Kodierung
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
18.03.2002
Eric Bodden, Malte Clasen, Joachim Kneis
39
Proseminar Datenkompression
Thema : Arithmetische Kodierung
Lösung
Bei mittig liegendem Intervall:
• Intervall mittig aufziehen
• iterieren bis obere bzw. untere Hälfte festliegt
Folge:
• E3-Skalierung
18.03.2002
Eric Bodden, Malte Clasen, Joachim Kneis
40
Proseminar Datenkompression
Thema : Arithmetische Kodierung
Definition: E3-Skalierung
while( ( g_1Q <= mLow )
&& ( mHigh < g_3Q ) )
1
0,75
0,5
0,5
0
0,25
{
mScale++;
mLow = 2*(mLow-g_1Q);
mHigh= 2*(mHigh-g_1Q) + 1;
}
18.03.2002
Eric Bodden, Malte Clasen, Joachim Kneis
41
Proseminar Datenkompression
Thema : Arithmetische Kodierung
Beispiel: E3-Skalierung
1
Schritt 1
0,75
Schritt 2
0,625
Schritt 3
0,5
0,5
0,5
0,5
0,4375
0
0,25
0,375
0,375
E3, E3, E1
18.03.2002
Eric Bodden, Malte Clasen, Joachim Kneis
42
Proseminar Datenkompression
Thema : Arithmetische Kodierung
Beispiel: Gleichheit von E1 E3^n und E2^n E1
1
Schritt 1
0,5
Schritt 2
0,5
Schritt 3
0,5
0,5
0,25
0,375
0,4375
0
0
0,25
0,375
Anwendung von E1, E2, E2 (also 011)
18.03.2002
Eric Bodden, Malte Clasen, Joachim Kneis
43
Proseminar Datenkompression
Thema : Arithmetische Kodierung
Beweis der Gleichheit (1)
Formalisierung dieser Gleichheit durch Hintereinanderausführung der
Abbildungen:
18.03.2002
Eric Bodden, Malte Clasen, Joachim Kneis
44
Proseminar Datenkompression
Thema : Arithmetische Kodierung
Beweis der Gleichheit (2)
18.03.2002
Eric Bodden, Malte Clasen, Joachim Kneis
45
Proseminar Datenkompression
Thema : Arithmetische Kodierung
Beweis der Gleichheit (3)
18.03.2002
Eric Bodden, Malte Clasen, Joachim Kneis
46
Proseminar Datenkompression
Thema : Arithmetische Kodierung
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
}
...
}
18.03.2002
Eric Bodden, Malte Clasen, Joachim Kneis
47
Proseminar Datenkompression
Thema : Arithmetische Kodierung
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
}
}
18.03.2002
Eric Bodden, Malte Clasen, Joachim Kneis
48
Proseminar Datenkompression
Thema : Arithmetische Kodierung
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();
18.03.2002
Eric Bodden, Malte Clasen, Joachim Kneis
49
Proseminar Datenkompression
Thema : Arithmetische Kodierung
Zusammenfassung Kodierer
Kodierer:
void Encode( unsigned int low_count,
unsigned int high_count,
unsigned int total );
void EncodeFinish();
EncodeFinish() schließt die Sequenz korrekt ab.
18.03.2002
Eric Bodden, Malte Clasen, Joachim Kneis
50
Proseminar Datenkompression
Thema : Arithmetische Kodierung
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
{
SetBit( 1 );
// der Decoder fügt die Nullen automatisch an
}
18.03.2002
Eric Bodden, Malte Clasen, Joachim Kneis
51
Proseminar Datenkompression
Thema : Arithmetische Kodierung
Zusammenfassung Dekodierer
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 );
18.03.2002
Eric Bodden, Malte Clasen, Joachim Kneis
52
Proseminar Datenkompression
Thema : Arithmetische Kodierung
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)
18.03.2002
Eric Bodden, Malte Clasen, Joachim Kneis
53
Proseminar Datenkompression
Thema : Arithmetische Kodierung
Effizienzbetrachtung (2)
18.03.2002
Eric Bodden, Malte Clasen, Joachim Kneis
54
Proseminar Datenkompression
Thema : Arithmetische Kodierung
Effizienzbetrachtung (3)
Durchschnittliche Länge >= Entropie 
Also durchschnittliche Länge pro Symbol:
18.03.2002
Eric Bodden, Malte Clasen, Joachim Kneis
55
Proseminar Datenkompression
Thema : Arithmetische Kodierung
Effizienzbetrachtung (4)
Entropie der Sequenz S(m) mit |S(m)|=m ist m-fache Entropie der
Symbole x:
Es folgt:
18.03.2002
Eric Bodden, Malte Clasen, Joachim Kneis
56
Proseminar Datenkompression
Thema : Arithmetische Kodierung
Effizienzbetrachtung – Vergleich Huffman
Für Huffman bekannt:
Für Extended Huffman:
18.03.2002
Eric Bodden, Malte Clasen, Joachim Kneis
57
Proseminar Datenkompression
Thema : Arithmetische Kodierung
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
18.03.2002
Eric Bodden, Malte Clasen, Joachim Kneis
58
Proseminar Datenkompression
Thema : Arithmetische Kodierung
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
18.03.2002
Eric Bodden, Malte Clasen, Joachim Kneis
59
Proseminar Datenkompression
Thema : Arithmetische Kodierung
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
18.03.2002
Eric Bodden, Malte Clasen, Joachim Kneis
60
Proseminar Datenkompression
Thema : Arithmetische Kodierung
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
18.03.2002
Eric Bodden, Malte Clasen, Joachim Kneis
61
Proseminar Datenkompression
Thema : Arithmetische Kodierung
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
18.03.2002
Eric Bodden, Malte Clasen, Joachim Kneis
62
Proseminar Datenkompression
Thema : Arithmetische Kodierung
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 )
18.03.2002
Eric Bodden, Malte Clasen, Joachim Kneis
63
Proseminar Datenkompression
Thema : Arithmetische Kodierung
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
18.03.2002
Eric Bodden, Malte Clasen, Joachim Kneis
64
Proseminar Datenkompression
Thema : Arithmetische Kodierung
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 IntegerArithmetik
18.03.2002
Eric Bodden, Malte Clasen, Joachim Kneis
65
Proseminar Datenkompression
Thema : Arithmetische Kodierung
Implementierung
Implementierung in C++
• Einfacher Kodierer / Dekodierer
• Auswahl verschiedener Modelle möglich
• Visualisierung mit Kodierer als DLL
• Download möglich unter:
http://ac.bodden.de
18.03.2002
Eric Bodden, Malte Clasen, Joachim Kneis
66