Golomb coding
Golomb-codering is een verliesvrije gegevenscompressie methode die gebruik maakt van een familie van gegevenscompressie codes uitgevonden door Solomon W. Golomb in de jaren 1960. Alfabetten die een geometrische verdeling volgen, zullen een Golomb-code als optimale prefix code hebben,[1] wat Golomb-codering zeer geschikt maakt voor situaties waarin het voorkomen van kleine waarden in de invoerstroom aanzienlijk waarschijnlijker is dan grote waarden.
Rice-codering[bewerken]
Rice-codering (uitgevonden door Robert F. Rice) betekent het gebruik van een subset van de familie van Golomb-codes om een eenvoudigere (maar mogelijk suboptimale) prefix code te produceren. Rice gebruikte deze set codes in een adaptief coderings schema; "Rice-codering" kan verwijzen naar dat adaptieve schema of naar het gebruik van die subset van Golomb-codes. Terwijl een Golomb-code een afstembare parameter heeft die elke positieve gehele waarde kan zijn, zijn Rice-codes die waarbij de afstembare parameter een macht van twee is. Dit maakt Rice-codes handig voor gebruik op een computer, aangezien vermenigvuldiging en deling door 2 efficiënter kunnen worden geïmplementeerd in binaire rekenkunde.
Rice werd gemotiveerd om deze eenvoudigere subset voor te stellen vanwege het feit dat geometrische verdelingen vaak in de tijd variëren, niet precies bekend zijn, of beide, zodat het selecteren van de schijnbaar optimale code misschien niet zeer voordelig is.
Rice-codering wordt gebruikt als de entropie-codering fase in een aantal verliesvrije beeldcompressie en audiogegevenscompressie methoden.
Overzicht[bewerken]
Golomb-codering gebruikt een afstembare parameter M om een invoerwaarde x te verdelen in twee delen: q, het resultaat van een deling door M, en r, de restwaarde. De quotient wordt verzonden in unaire codering, gevolgd door de restwaarde in afgeknotte binaire codering. Wanneer M = 1, is Golomb-codering equivalent aan unaire codering.
Golomb-Rice-codes kunnen worden beschouwd als codes die een getal aangeven door de positie van de bin (q), en de offset binnen de bin (r). Het voorbeeldfiguur toont de positie q en offset r voor de codering van een geheel getal x met de Golomb-Rice-parameter M = 3, met bronkansen die een geometrische verdeling volgen met p(0) = 0.2.
Formeel zijn de twee delen gegeven door de volgende expressie, waar x het te coderen niet-negatieve gehele getal is:
en
- .
Zowel q als r worden gecodeerd met variabele aantallen bits: q door een unaire code, en r door b bits voor Rice-code, of een keuze tussen b en b + 1 bits voor Golomb-code (d.w.z. M is geen macht van 2), met . Als , dan gebruik b bits om r te coderen; anders gebruik b + 1 bits om r te coderen. Duidelijk is als M een macht van 2 is en we alle waarden van r met b bits kunnen coderen.
Het gehele getal x dat door Golomb werd behandeld, was de looplengte van een Bernoulli-proces, dat een geometrische verdeling heeft die begint bij 0. De beste keuze van parameter M is een functie van het corresponderende Bernoulli-proces, dat geparametriseerd is door de kans op succes in een gegeven Bernoulli-proef. M is ofwel de mediaan van de verdeling of de mediaan ±1. Het kan bepaald worden door deze ongelijkheden:
die opgelost worden door
- .
Voor het voorbeeld met p(0) = 0.2:
- .
De Golomb-code voor deze verdeling is equivalent aan de Huffman code voor dezelfde kansen, als het mogelijk zou zijn om de Huffman-code voor de oneindige set van bronwaarden te berekenen.
Gebruik met getekende gehele getallen[bewerken]
Het schema van Golomb was ontworpen om rijtjes niet-negatieve getallen te coderen. Het is echter eenvoudig uit te breiden om rijtjes te accepteren die negatieve getallen bevatten met behulp van een overlap and interleave schema, waarbij alle waarden op unieke en omkeerbare wijze worden toegewezen aan een positief getal. De rij begint: 0, −1, 1, −2, 2, −3, 3, −4, 4, ... Het n-de negatieve getal (d.w.z. −n) wordt toegewezen aan het n-de oneven getal (2n−1), en het m-de positieve getal wordt toegewezen aan het m-de even getal (2m). Dit kan als volgt wiskundig worden uitgedrukt: een positief getal x wordt toegewezen aan (), en een negatief getal y wordt toegewezen aan (). Dergelijke code kan voor eenvoud worden gebruikt, zelfs als suboptimaal. Echt optimale codes voor tweezijdige geometrische verdelingen omvatten meerdere varianten van de Golomb-code, afhankelijk van de verdelingsparameters, inclusief deze.
Eenvoudig algoritme[bewerken]
Hieronder staat de Rice-Golomb-codering, waarbij de restcode gebruik maakt van eenvoudige afgeknotte binaire codering, ook genaamd "Rice-codering" (andere variabel-lengte binaire coderingen, zoals aritmetische of Huffman-coderingen, zijn mogelijk voor de restcodes, als de statistische verdeling van de restcodes niet plat is, en met name wanneer niet alle mogelijke resten na de deling worden gebruikt). In dit algoritme, als de parameter M een macht van 2 is, wordt het equivalent aan de eenvoudigere Rice-codering:
- Stel de parameter M in op een geheel getal.
- Voor N, het te coderen getal, vind
quotient = q = vloer(N/M)[bewerken]
rest = r = N modulo M[bewerken]
- Genereer codewoord
De code-indeling : <Quotientcode><Restcode>, waar[bewerken]
Quotientcode (in unaire codering)[bewerken]
Schrijf een q-lengte reeks van 1 bits (alternatief, van 0 bits)[bewerken]
Schrijf een 0 bit (respectievelijk, een 1 bit)[bewerken]
Restcode (in afgeknotte binaire codering)[bewerken]
Laat [bewerken]
Als codeer r in binaire representatie met b bits.[bewerken]
Als codeer het getal in binaire representatie met b + 1 bits.[bewerken]
Decoderen:
- Decodeer de unaire representatie van q (tel het aantal 1 in het begin van de code)
- Sla de 0-delimiter over
- Laat
Interpreteer volgende b bits als een binaar getal r. Als geldt, dan is de rest r = r.[bewerken]
Anders interpreteer b + 1 bits als een binaar getal r', de rest wordt gegeven door [bewerken]
- Bereken
Voorbeeld[bewerken]
Stel M = 10. Dus . De afbreekwaarde is .
|
|
Bijvoorbeeld, met een Rice-Golomb-codering met parameter M = 10, zou het decimale getal 42 eerst gesplitst worden in q = 4 en r = 2, en zou gecodeerd worden als qcode(Sjabloon:Mvar),rcode(Sjabloon:Mvar) = qcode(4),rcode(2) = 11110,010 (je hoeft de scheidende komma in de uitvoerstroom niet te coderen, omdat de 0 aan het einde van de q-code voldoende is om te zeggen wanneer q eindigt en r begint; zowel de qcode als de rcode zijn zelf-begrensd).
Gebruik voor run-length-codering[bewerken]
- Let op dat p en 1 – p in deze sectie omgekeerd zijn ten opzichte van het gebruik in eerdere secties.
Gegeven een alfabet van twee symbolen, of een set van twee gebeurtenissen, P en Q, met kansen p en (1 − p), respectievelijk, waar p ≥ 1/2, kan Golomb-codering worden gebruikt om lopen van nul of meer Ps gescheiden door enkele Qs te coderen. In deze toepassing is de beste instelling van de parameter M het dichtstbijzijnde gehele getal bij . Wanneer p = 1/2, M = 1, en de Golomb-code komt overeen met unaire (n ≥ 0 Ps gevolgd door een Q wordt gecodeerd als n enen gevolgd door een nul). Als een eenvoudigere code gewenst is, kan men de Golomb-Rice-parameter b (d.w.z. Golomb-parameter M = 2b) toewijzen aan het gehele getal het dichtstbij ; hoewel niet altijd de beste parameter, is het meestal de beste Rice-parameter en de compressieprestaties zijn zeer dicht bij de optimale Golomb-code. (Rice zelf stelde voor om verschillende codes voor dezelfde gegevens te gebruiken om te bepalen welke het beste was. Een latere JPL onderzoeker stelde verschillende methoden voor om de codeparameter te optimaliseren of te schatten.)
Beschouw het gebruik van een Rice-code met een binair deel met b bits om rijtjes te coderen waar P een kans p heeft. Als de kans is dat een bit deel zal uitmaken van een k-bits loop (k−1 Ps en één Q) en de compressieratio van die loop is, dan is de verwachte compressieratio
- <math>\begin{align}
\mathbb{E}[\text{compressieratio}] &= \sum_{k=1}^\infty (\text{compressieratio van }k\text{-loop}) \cdot \mathbb{P}[\text{bit is deel van }k\text{-loop}] \\ &= \sum_{k=1}^\infty \frac{b+1+\lfloor 2^{-b}(k-1) \rfloor}{k} \cdot kp^{k-1} (1-p)^2 \\ &= (1-p)^2 \sum_{j=0}^\infty (b+1+j) \cdot \sum_{i=j2^b+1}^{(j+1)2^b} p^{i-1} \\ &= (1-p)^2 \sum_{j=0}^\infty (b+1+j)
- ↑ (1975). Optimal source codes for geometrically distributed integer alphabets. IEEE Transactions on Information Theory 21 (2): 228–230 . DOI: 10.1109/tit.1975.1055357.