Loading AI tools
Form der Entropiekodierung Aus Wikipedia, der freien Enzyklopädie
Die arithmetische Kodierung ist eine Form der Entropiekodierung, die bei der verlustfreien Datenkompression verwendet wird. Sie erzielt Kompressionsraten, die sehr nahe am theoretischen Limit der Entropie liegen.
Die Grundidee der arithmetischen Kodierung ist, aus einer Folge von Eingabesymbolen und deren Auftrittswahrscheinlichkeiten eine einzelne, möglichst „kurze“ rationale Zahl zu bilden. Aus dieser Zahl kann die ursprüngliche Folge von Eingabesymbolen wiederhergestellt werden.
Als Begründer der arithmetischen Kodierung gilt Jorma Rissanen, der ab 1976 bis Anfang der 1980er Jahre wesentliche Arbeiten zu diesem Teilgebiet der Informationstheorie leistete.[1]
Die meisten Kodierungen teilen die Folge von Eingabezeichen in kurze Teile auf und kodieren jeden dieser Teile einzeln in Bits. Dabei kommt es vor, dass ein solcher kurzer Teil einen Informationsgehalt hat, der sich nicht in ganzen Bits ausdrücken lässt. Dadurch müssen „unvollständig genutzte“ Bits gespeichert werden, und das sorgt dafür, dass die kodierten Daten länger werden als unbedingt nötig.
Die arithmetische Kodierung unterscheidet sich von diesen Kodierungen dadurch, dass die Eingabezeichen nicht in kurze Teile unterteilt werden, sondern alle zusammen zu einer einzigen rationalen Zahl (Bruchzahl) zusammengerechnet werden. Dadurch werden die unvollständig genutzten Bits in der Ausgabe vermieden.
Vor dem Kodieren oder Dekodieren müssen sich der Kodierer und der Dekodierer auf diese Dinge einigen:
Der Kodierer bekommt als Eingabe:
Er erzeugt daraus:
Ablauf:
Eingabe:
Schritt | Aktion | Anmerkungen |
---|---|---|
1 | Das Zielintervall geht von 0 bis 1. | |
2 | Es wurden noch keine Zeichen gelesen. | |
3 | Das erste Zeichen der Zeichenfolge ist ein A. | |
3.1 | Das erste Zeichen wurde gelesen. | |
3.2 | Die Wahrscheinlichkeit für das A. | |
3.3 | In dem Alphabet gibt es keine Zeichen vor dem A. | |
3.4 | ||
3 bis 3.3 | das zweite Zeichen der Zeichenfolge ist ebenfalls A | |
3.4 | ||
3 bis 3.3 | ||
3.4 | ||
3 bis 3.3 | das vierte Zeichen der Eingabefolge ist ein B | |
3.4 | das Intervall beginnt jetzt nicht mehr bei 0 | |
… | … | 3 weitere A werden eingelesen und verrechnet |
3 bis 3.3 | das letzte Zeichen ist ein C | |
3.4 | Die gesuchte Zahl liegt im Bereich . | |
4 | Dies ist der kürzeste Bruch im gesuchten Intervall, dessen Nenner eine Zweierpotenz ist. Die Zweierpotenz bietet sich an, um die Zahl im Binärsystem zu kodieren. |
Der Dekodierer bekommt als Eingabe:
Ablauf:
Der Dekodierer bekommt die Zahl und die Anzahl der Zeichen zum Dekodieren. Um zu einer Position im Intervall das zugehörige Zeichen zu bestimmen, wird die Tabelle vor dem eigentlichen Dekodieren berechnet:
Zeichen | Untergrenze | Obergrenze | Breite |
---|---|---|---|
A | |||
B | |||
C |
Das Dekodieren passiert in diesen Schritten:
Statt dem Dekodierer die Anzahl der kodierten Symbole mitzuteilen, kann das Alphabet auch ein spezielles Zeichen mit der Bedeutung „Ende“ enthalten.
Es gibt auch Varianten der arithmetischen Kodierung für weniger Rechenaufwand, die statt eines Bruchs nur eine einzelne, beliebig lange natürliche Zahl zur Informationsdarstellung verwenden. Generell ist die arithmetische Kodierung rechenintensiver als Kodierungen, bei denen jedes kodierte Wort eine ganzzahlige Anzahl Bits hat.[3]
Das Verfahren Context-Adaptive Binary Arithmetic Coding wird zum Komprimieren von Videodaten verwendet, das Eingabealphabet besteht aus den beiden Binärziffern 0 und 1, und die Auftrittswahrscheinlichkeit der Bits wird während der Kompression kontextabhängig angepasst.
Arithmetisches Kodieren ist asymptotisch optimal[4]:
Nachdem das letzte Symbol verarbeitet wurde, erhält man ein Intervall mit
Das entspricht der Wahrscheinlichkeit, bei gegebenen Symbolwahrscheinlichkeiten , genau solch eine Sequenz zu erhalten.
Um nun binär einen Wert im Intervall anzugeben, benötigt man
Da
und
lässt sich die Länge der arithmetisch kodierten Sequenz abschätzen:
Das bedeutet, man benötigt mindestens so viele Bits wie die Entropie, höchstens jedoch zwei Bits mehr.
Die mittlere Länge eines kodierten Symbols ist beschränkt auf
Für lange Sequenzen verteilen sich diese (höchstens zwei) zusätzlichen Bits gleichmäßig auf alle Symbole, so dass die mittlere Länge eines kodierten Symbols dann asymptotisch gegen die wahre Entropie geht[5]:
Wenn sich alle Symbolwahrscheinlichkeiten in der Form darstellen lassen,[6] dann erzeugen arithmetische Kodierung und Huffman-Kodierung einen identisch langen Datenstrom und sind gleich (d. h. optimal) effizient. In der Praxis ist dies aber so gut wie nie der Fall.
Bei einer konkreten Umsetzung ergibt sich die Schwierigkeit, dass die Grenzen des Intervalls beliebig genaue Bruchzahlen sind. Da das Rechnen mit großen Zählern und Nennern entsprechend lange dauert, wird der Algorithmus für die praktische Umsetzung etwas abgewandelt.
Um das Problem der großen Zähler und Nenner Genauigkeit abzumildern, werden zwei Schritte unternommen:
Punkt 1 führt eigentlich dazu, dass der Algorithmus kein Arithmetischer Kodierer mehr ist, sondern nur ähnlich. Es gibt aber einige eigenständige Algorithmen, die vom Arithmetischen Kodierer abstammen; diese sind:
Trotz dieser Verfahren bleiben verschiedene Probleme mit der Arithmetischen Kodierung:
Seamless Wikipedia browsing. On steroids.
Every time you click a link to Wikipedia, Wiktionary or Wikiquote in your browser's search results, it will show the modern Wikiwand interface.
Wikiwand extension is a five stars, simple, with minimum permission required to keep your browsing private, safe and transparent.