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