Golomb-Code

Der Golomb-Code ist eine Entropiekodierung für alle nichtnegativen ganzen Zahlen, die im Gegensatz zu anderen Codes der Quellenkodierung nur einen endlichen Bereich (z. B. den Wertebereich 0–255) darstellen können. Er wurde 1966 von Solomon W. Golomb entwickelt.[1] Der Code verwendet wenige Bits für kleine und viele Bits für größere Zahlen. Dabei kann er über einen positiven, ganzzahligen Parameter gesteuert werden. Je größer der Parameter, desto langsamer wächst die Anzahl der zur Darstellung benötigten Bits, aber desto größer ist die Anzahl der minimal benötigten Bits für die kleinen Zahlen.

Der Rice-Code ist eine Variante des Golomb-Codes, bei dem der Steuerparameter eine Zweierpotenz ist. Diese Einschränkung ist von Vorteil, da insbesondere in der digitalen Verarbeitung die Multiplikation bzw. Division von 2 sehr effizient implementiert werden kann. Der Rice-Code wurde 1971 von Robert F. Rice und J. Plaunt vorgestellt.[2] Einige Varianten des Rice-Codes werden auch als Exponentieller Golomb-Code (englisch: Exponential-Golomb Code) bezeichnet.

Der Code kann im Bereich der verlustlosen Datenkompression verwendet werden, wenn die Wahrscheinlichkeiten der zu kodierenden Quellendaten (näherungsweise) eine geometrische Verteilung bilden. Typische Anwendungsbereiche sind, als ein Teilverfahren neben anderen Algorithmen, die Bildkompression und Audiodatenkompression. Beispielsweise verwenden das Videokompressionsformat H.264 und das Audiokompressionsformat FLAC[3] je eine verschiedene Variante des exponentiellen Golomb-Codes.

Arbeitsweise

Der Code arbeitet mit der Idee, die darzustellende Zahl durch einen Quotienten und den Rest bei einer Division mit einem Parameter zu ersetzen.

Die Zahl mit wird durch

und

beschrieben. Zur besseren Beschreibung wird noch die Zahl

benötigt. Als erstes wird q + 1 unär ausgegeben, d. h., es werden „1“-Bits gefolgt von einer „0“ abgelegt.

Der Rest wird dann in einer „abgeschnittenen binären Darstellung“ (Truncated-Binary-Encoding) genannten Codierung abgelegt. Diese Darstellung legt einen Teil der Werte, falls möglich, mit Bits und den anderen Teil mit Bits ab. Die Anzahl der Werte, die mit Bits abgelegt werden können, ist .

Beispiele

Die Darstellung der Zahl 10 mit einem Parameter 4:

Abhängig von wird die Codierung vervollständigt:

  • falls < ist, wird als Binärcode mit der Länge geschrieben.
  • falls ist, wird als Binärcode mit der Länge geschrieben.

Daraus resultiert die Bitfolge 110 10. Das Leerzeichen zeigt den Übergang vom Quotienten zum Rest.

Ein paar weitere Beispiele:

n012345678910
b=30 00 100 1110 010 1010 11110 0110 10110 111110 01110 10
b=40 000 010 100 1110 0010 0110 1010 11110 00110 01110 10
b=50 000 010 100 1100 11110 0010 0110 1010 11010 111110 00
b=70 000 0100 0110 1000 1010 1100 11110 0010 01010 01110 100

Anwendung

Die beiden Grafiken zeigen die Redundanz des Golomb-Codes pro Symbol.

Der Golomb-Code kann angewendet werden, wenn Zahlen unbekannter Größe abgespeichert werden sollen, doch das eigentliche Anwendungsgebiet liegt in der Datenkompression.

Wenn die Wahrscheinlichkeiten der Zahlen eine bestimmte Verteilung (geometrische Verteilung) aufweisen, dann kann der Golomb-Code ähnlich effizient wie der Huffman-Code sein, ist dabei aber sparsamer mit Speicher, leichter zu implementieren und schneller in der Ausführung.

Rice-Code

Der Rice-Code ist eine Variante des Golomb-Codes, bei dem der Parameter eine Potenz von 2 ist. Diese Codes lassen sich sehr einfach mit Bitshiften und logischen Bitoperationen umsetzen.

Angenommen, es gilt . Dann ist

und

Das Symbol steht dabei für bitweises Verschieben nach rechts und für bitweise Und-Verknüpfung. wird dabei immer mit genau Bits und normal binär dargestellt.

Exponentieller Golomb-Code

Der exponentielle Golomb-Code ist eine weitere Variante des Rice-Codes und gleichzeitig identisch zum Elias-γ-Code, würde dort statt kodiert.

wird für jede Zahl genau als gewählt, was der „natürlichen“ Bitbreite von entspricht. Dann wird die unäre Codierung von nicht mit „1“-Bits gefolgt von „0“, sondern mit „0“-Bits gefolgt von „1“ umgesetzt. Da die binär gespeicherte Zahl immer an höchster Stelle eine „1“ aufweist, muss diese höchste „1“ nicht doppelt gespeichert werden. Die Enkodierung und Dekodierung vereinfachen sich somit zu folgenden Schritten:

  • Zum Kodieren von : Schreibe viele „0“-Bits, danach schreibe mit der natürlichen Anzahl Bits.
  • Zum Dekodieren von : Lese „0“-Bits bis einschließlich des ersten „1“-Bits, und lese so viele darauffolgende Bits, wie zuvor „0“-Bits gelesen wurden. Das Ergebnis ist dieser hintere Teil der kodierten Zahl minus 1.

Es zeigt sich, dass eine separate Speicherung von nicht notwendig ist, da es selbst Teil der kodierten Zahl ist.

Verallgemeinerung zu beliebiger Ordnung

Die Kodierung kann mithilfe des Konzepts der Ordnung verallgemeinert werden. Das obige Schema entspricht der Ordnung . Bei höheren Ordnungen geschieht eine Aufteilung der Zahl (nicht !) in Quotient und Rest ähnlich zum normalen Rice-Code. Der Dividend ist nun , d. h. und . Bildlich gesprochen werden die Bits der Zahl in den (festen) unteren Teil , der immer Bits hat, und den (variablen) Teil aufgeteilt.

Für die finale Kodierung wird im gewöhnlichen exponentiellen Golomb-Code kodiert, d. h. Ordnung 0 wie oben, und wird mit Bits (die laut Definition immer ausreichen) an das so kodierte angehängt. Eine kodierte Zahl umfasst also drei Teile, hier dargestellt anhand und der kodierten Zahl 489:

Der Vorteil dieser Kodierung besteht darin, dass der benötigte Speicherplatz für große Zahlen weniger als die beim Rice-Code benötigten („doppelt so viele Bits wie die Zahl selbst hat“) beträgt.

Der Parameter muss separat gewählt und gespeichert werden. Bei großen Datensätzen eignet sich häufig nicht ein für alle Daten, daher gibt es verschiedene Verfahren, ein variables zu wählen. Als einfachen Ansatz verwendet FLAC die Möglichkeit, mehrere Blöcke variabler Größe mit einem jeweils eigenen zu kodieren. Der Melcode-Algorithmus und seine Varianten passen automatisch anhand eines einfachen Algorithmus an, welcher symmetrisch auf Enkodier- und Dekodierseite angewandt wird und ohne explizite Speicherung von auskommt.[4][5]

Verallgemeinerung für negative Zahlen

Rice-Code und allgemeiner exponentieller Golomb-Code können zwar 0, aber keine negativen Zahlen kodieren. Dies wird durch eine der Zickzackkodierungen möglich gemacht, welche die negativen auf die positiven Zahlen abbilden, aber die Eigenschaften der Entropiekodierung erhalten; d. h. betragsmäßig kleine Zahlen werden weiterhin auf kleine Zahlen abgebildet. Konkret bildet man eine Hälfte der ganzen Zahlen auf die geraden natürlichen Zahlen ab und die andere Hälfte auf die ungeraden natürlichen Zahlen:

Danach folgt normale Rice-Kodierung oder exponentielle Golomb-Kodierung. In der Praxis lassen sich sowohl De- als auch Enkodierung dieses Formats durch Benutzung von Bitmasken und Shifts beschleunigen.

Einzelnachweise

  1. Solomon W. Golomb: Run-Length Encodings. In: IEEE Transactions on Information Theory IT-12 (3). 1966, S. 399–401, abgerufen am 19. April 2013.
  2. Robert F. Rice, J. Plaunt: Adaptive Variable-Length Coding for Efficient Compression of Spacecraft Television Data. Hrsg.: IEEE Transactions on Communication Technology. Band 19, Nr. 6. California Institute of Technology, Pasadena 1971, S. 889–897, doi:10.1109/TCOM.1971.1090789.
  3. van Beurden & Weaver: Free Lossless Audio Codec: 5.4. Residual Coding. In: Internet-Draft. Internet Engineering Task Force, 11. Oktober 2022, abgerufen am 18. Oktober 2022 (englisch).
  4. Walter D. Leon-Salas, Sina Balkir, Khalid Sayood, Nathan Schemm, Michael W. Hoffman: A CMOS Imager With Focal Plane Compression Using Predictive Coding. In: IEEE Journal of Solid-State Circuits. Band 42, Nr. 11, November 2007, ISSN 0018-9200, S. 2555–2572, doi:10.1109/JSSC.2007.907191 (ieee.org [abgerufen am 16. August 2023]).
  5. M.J. Weinberger, G. Seroussi, G. Sapiro: The LOCO-I lossless image compression algorithm: principles and standardization into JPEG-LS. In: IEEE Transactions on Image Processing. Band 9, Nr. 8, August 2000, S. 1309–1324, doi:10.1109/83.855427 (ieee.org [abgerufen am 16. August 2023]).

Auf dieser Seite verwendete Medien

GolombCodeRedundancy.svg
Autor/Urheber: ThePacker, Lizenz: CC BY-SA 3.0
Zeigt die Redundanz des Golombcode, wenn m optimal gewählt wurde