Arithmetische Kodierung

Allgemein

Die arithmetische Kodierung ist ein Verfahren der Entropiekodierung, das Kompressionsraten erziehlt, die sehr nahe am theoretischen Limit liegt. Die arithmetische Kodierung unterscheidet sich in einem wesentlichen Punkt von herkömmlichen Kodierungen, wie zum Beispiel im ASCII-Code oder der Huffman-Kodierung wo Zeichen mit Bitfolgen gespeichert werden. In der arithmetischen Kodierung hingegen wird die gesamte Quellinformation in Form einer rationalen Zahl dargestellt und nicht in einzelne Komponenten (Zeichen) aufgeteilt. Der Nachteil der arithmetischen Kodierung ist, dass sie generell rechenintensiver ist als die herkömmlichen Verfahren.
Die Quellinformation wird nach der arithmetischen Kodierung als Zahl 0.0 ≤ q < 1.0 abgespeichert, wobei so wenige Nachkommastellen wie möglich verwendet werden.

Konzept Kodierer

Intervalle

Meistens für die arithmetische Kodierung das Intervall {q ∈ ℝ | 0 ≤ x < 1} benutzt. Das Intervall wird in Subintervalle unterteilt, wobei jeweils ein Subintervall einem Zeichen zugeordnet ist und die Grösse des Subintervalles von der Auftrittswahrscheinlichkeit des Zeichens abhängt.
Die Subintervalle können dabei beliebig angeordnet werden, da dies für die Qualität des Algorithmus keine Rolle spielt. Deswegen wird auf dieser Seite eine alphabetische Reihenfolge gewählt.
Dies wird am Beispiel AABBACAA veranschaulicht. Die Auftrittswahrscheinlichkeiten betragen dabei.

pA =
58
= 0.625, pB =
28
= 0.25, pC =
18
= 0.125

Nun wird das Startintervall [0,1[ in drei Subintervalle unterteilt, deren Grösse jeweils der Auftrittswahrscheinlichkeit des Zeichens entsprechen.

0.000000A0.625000 0.625000B0.875000 0.875000C1.000000

Der erste Buchstabe der Zeichenkette AABBACAA, die hier kodiert wird ist ein A. Deswegen wird das Gesamtinvervall nun in das vorherige Subintervall des Zeichens A gesetzt (das Intervall [0,0.625[). Das Intervall wird wieder in die drei Subintervalle unterteilt, wobei deren Grösse gleich der Auftrittswahrscheinlichkeit multipliziert mit 0.625 (der Länge des Gesamtintervalls) ist.

0.000000A0.390625 0.390625B0.546875 0.546875C0.625000

Das nächste Zeichen ist wieder ein A, womit das ganze wieder in das vorgerige Subintervall von A gesetzt. Das Gesamtintervall, das wieder in drei Subintervalle unterteilt wird ist also nun [0,0.390625[.

0.000000A0.244141 0.244141B0.341797 0.341797C0.390625

Nun folgt ein B, womit das nächste Gesamtintervall dem vorherigen Gesamtintervall vom Zeichen B entspricht. Das neue Gesamtintervall ist also [0.244141,0.341797[.

0.244141A0.305176 0.305176B0.329590 0.329590C0.341797

Es kommt wieder ein B, das aufzuteilende Gesamtintervall ist also [0.305176,0.329590[.

0.305176A0.320435 0.320435B0.326538 0.326538C0.329590

In der Zeichenkette AABBACAA wurde jetzt bereits der Teil AABB umgesetzt. Der nächste Buchstabe ist also wieder ein A, womit das neue Gesamtintervall [0.305176,0.320435[ ist.

0.305176A0.314713 0.314713B0.318527 0.318527C0.320435

Weil als nächstes ein C vorkommt erhalten wir das wesentlich kleinere Gesamtintervall [0.318527,0.320435[.

0.318527A0.319719 0.319719B0.320196 0.320196C0.320435

Das nächste Gesamtintervall ist das letzte Subintervall von A: [0.318527,0.319719[.

0.318527A0.319272 0.319272B0.319570 0.319570C0.319719

Das letzte Zeichen ist wieder ein A, womit das letzte Gesamtintervall [0.318527,0.318993[ wird.

0.318527A0.318993 0.318993B0.319179 0.319179C0.319272

Gespeichert wird nun eine beliebige, möglichst kurze Zahl aus dem letzten Subintervall: [0.318527, 0.318993]. Diese Zahl ist jetzt der Code für die ganze Zeichenkette AABBACAA, es wurden also keine einzelnen Zeichen kodiert, sondern direkt die Gesamtinformation. Hier kann also beispielsweise die Zahl 0.3186 abgespeichert werden.

Aufgaben zur Kodierung

Kodiere die folgenden Strings mit der arithmetischen Kodierung. Gib jeweils den Anfang und das Ende des letzten Intervalls gerundet auf sechs Stellen nach dem Komma an.

String Code




Konzept Dekodierer

Der Dekodierer erhält als Inputs die Auftrittswahrscheinlichkeiten der einzelnen Zeichen, sowie eine Zahl aus dem letzten Subintervall (die, die vom Kodierer abgespeichert wurde). Gleich wie beim Kodierer legt der Dekodierer das Startintervall [0, 1[ fest und teilt es an die Zeichen mit den zugehörigen Zeichen in alphabetischer Ordnung auf. Danach wird getestet, in welchem Subintervall die Inputzahl liegt. Das diesem Subintervall zugeordnete Zeichen ist also das nächste Zeichen der Information. Danach wird das nächste Intervall initialiesiert und es geht so weiter, bis die Information vollständig dekodiert wurde.

Hier werden wir das oben kodierte Beispiel wieder dekodieren, wir erhalten also folgende Inputs.

pA =
58
= 0.625, pB =
28
= 0.25, pC =
18
= 0.125, Schlussintervall = 0.3186

Wenn wir die Zeichen also wieder wie vorhin nach ihrer Auftrittswahrscheinlichkeit in alphapetischer Ordnung im Intervall [0, 1[ darstellen erhalten wir.

0.000000A0.625000 0.625000B0.875000 0.875000C1.000000

Die Zahl, die wir als Input erhalten haben: 0.3186 liegt im Subintervall [0, 0.625[. Demnach ist das erste Zeichen ein A. Nun wird das Intervall im Subintervall von A wieder erstellt.

0.000000A0.390625 0.390625B0.546875 0.546875C0.625000

Der Input liegt wieder im Subintervall des Zeichens A, womit auch das zweite Zeichen ein A ist. Das nächste Intervall ist nun.

0.000000A0.244141 0.244141B0.341797 0.341797C0.390625

Jetzt liegt der Input 0.3186 im Subintervall [0.2441, 0.3417[. Damit ist das dritte Zeichen ein B und das nächste Intervall wird im Subintervall von B initialisiert.

0.244141A0.305176 0.305176B0.329590 0.329590C0.341797

Das vierte Zeichen ist wieder ein B und das Intervall wird wieder neu initialisiert.

0.305176A0.320435 0.320435B0.326538 0.326538C0.329590

Beim fünften Zeichen handelt es sich wieder um ein A. Das nächste Intervall wird also wieder im Subintervall von A initialisiert.

0.305176A0.314713 0.314713B0.318527 0.318527C0.320435

Es folgt ein C und das Intervall wird wieder neu initialisiert.

0.318527A0.319719 0.319719B0.320196 0.320196C0.320435

Als siebtes Zeichen folgt ein A und das Intervall wird wieder neu initialisiert.

0.318527A0.319272 0.319272B0.319570 0.319570C0.319719

Das letzte Zeichen ist auch wieder ein A und damit erhalten wir insgesamt die Information AABBACAA.

Aufgaben zur Dekodierung

In diesen Aufgaben werden dir das erste Intervall, damit du daraus die Wahrscheinlichkeiten berechnen kannst und das letzte Subintervall, woraus du die Inputzahl herauslesen kannst gegeben. Finde damit den String heraus, der Kodiert wurde.

String Code