> rice | adaptief | compressie <
// Rice-codering – Adaptieve gehele-getalcompressie met instelbare parameter
>> functies
Instelbare parameter
Stel k af om verschillende gegevensverdelingen te optimaliseren.
Geometrische data
Optimaal voor data met een geometrische of exponentiële verdeling.
Snelle codering
Eenvoudige deel- en restbewerkingen voor hoge snelheid.
>> technische info
Hoe Rice-codering werkt:
Bij Rice-codering wordt elk geheel getal n gedeeld door 2^k om quotiënt q en rest r te verkrijgen. Het quotiënt wordt in unair gecodeerd (q enen gevolgd door een nul) en de rest in k binaire bits. Dit levert een variabele code op die zich via de parameter k aanpast aan de gegevensverdeling.
Rice-coderingsvoorbeeld (k=2):
k=2, M=2^2=4 0 → q=0, r=0 → 0|00 → 000 1 → q=0, r=1 → 0|01 → 001 2 → q=0, r=2 → 0|10 → 010 3 → q=0, r=3 → 0|11 → 011 4 → q=1, r=0 → 10|00 → 1000 5 → q=1, r=1 → 10|01 → 1001 6 → q=1, r=2 → 10|10 → 1010 7 → q=1, r=3 → 10|11 → 1011 8 → q=2, r=0 → 110|00 → 11000 Grotere k: minder unair-bits, meer binaire bits Kleinere k: meer unair-bits, minder binaire bits
Waarom Rice-codering gebruiken?:
- ▸Past zich aan de gegevensverdeling aan
- ▸Eenvoudig te implementeren
- ▸Snelle codering en decodering
- ▸Geschikt voor sensordata
- ▸Efficiënt voor kleine gehele getallen
>> veelgestelde vragen
Wat is Rice-codering?
Rice-codering is een entropiecodering met variabele lengte die bijzonder efficiënt is voor geometrische verdelingen. Het is een speciaal geval van Golomb-codering waarbij de deler M beperkt is tot machten van 2 (M = 2^k), wat snelle implementaties met bitbewerkingen mogelijk maakt.
Hoe kies ik de k-parameter?
De optimale k-waarde hangt af van de verdeling van je data. Voor gegevens met gemiddelde μ geldt ongeveer k ≈ log₂(μ × ln(2)). Kleine k (0–2) werken goed voor zeer kleine getallen, terwijl grotere k (4–8) beter zijn voor data met grotere waarden. Gebruik de analysefunctie om de optimale k voor je data te vinden.
Rice vs Golomb-codering?
Rice-codering is een subset van Golomb-codering waarbij M = 2^k. Deze beperking maakt Rice sneller (bitshifts in plaats van deling), maar soms iets minder optimaal. Golomb kan elke M-waarde kiezen voor betere compressie, terwijl Rice een beetje efficiëntie inruilt voor snelheid.
Waar wordt Rice-codering gebruikt?
Rice-codering wordt veel gebruikt bij verliesloze audiocompressie (FLAC, ALAC), beeldcompressie (JPEG-LS) en sensordata met geometrische verdelingen. Het is bijzonder effectief voor kleine niet-negatieve gehele getallen met een exponentieel afnemende waarschijnlijkheid.
// Uitgewerkt voorbeeld
| n | q | r | k=2 |
|---|---|---|---|
| 0 | 0 | 00 | 000 |
| 1 | 0 | 01 | 001 |
| 2 | 0 | 10 | 010 |
| 3 | 0 | 11 | 011 |
| 4 | 1 | 00 | 1000 |
| 5 | 1 | 01 | 1001 |
| 6 | 1 | 10 | 1010 |
| 7 | 1 | 11 | 1011 |
| 8 | 2 | 00 | 11000 |
// Codevoorbeelden
Rice code with parameter k (Golomb code with M = 2^k) q = n >> k quotient, written as q ones followed by a zero r = n & (2^k - 1) remainder, written as k plain bits code = unary(q) + r k = 2, n = 9 -> q = 2, r = 01 -> 110 01 Decode: count the leading 1s (q), skip the 0, read k bits (r), n = (q << k) | r Choose k about log2(mean value): small values -> small k
>> Meer vragen
V: Wat is het verschil tussen Rice- en Golomb-code?
A: De Rice-code is het speciale geval van de Golomb-code waarbij parameter M een macht van twee is (M = 2^k). Bitverschuiving en masker vervangen dan de deling, wat zeer snel is.
V: Hoe kies je parameter k?
A: k moet ongeveer log2 van het gemiddelde van de waarden zijn. Te kleine k geeft lange unaire reeksen, te grote k verspilt bits aan de rest. Codecs zoals FLAC kiezen k per blok.
V: Waarvoor is de Rice-code geschikt?
A: Voor niet-negatieve gehele getallen met geometrische verdeling, waarbij kleine waarden veel vaker voorkomen. Typisch voorspellingsresiduen in verliesvrije audio (FLAC) en beeld (JPEG-LS).