Datakompression fö 8 p.1 Adaptiv aritmetisk kodning Aritmetisk kodning är väldigt enkel att göra adaptiv, eftersom vi bara behöver göra en adaptiv sannolikhetsmodell, medan själva kodaren är fix. Till skillnad från huffmankodning så behöver vi inte hålla reda på ett kodträd, utan bara skatta sannolikheterna för de olika symbolerna genom att räkna hur ofta de uppträder. Det är även enkelt att koda minneskällor genom att hålla reda på betingade sannolikheter.
Datakompression fö 8 p.2 Exempel Minnesfri källa, A = {a, b}. Låt r a och r b hålla reda på antalet gånger a resp. b uppträtt tidigare. De skattade sannolikheterna blir då p(a) = r a r a + r b, p(b) = r b r a + r b Antag att vi ska koda sekvensen aababaaabba... Startvärden: r a = r b =1. Koda a, med sannolikheterna p(a) =p(b) =1/2. Updatera: r a =2,r b =1. Koda a, med sannolikheterna p(a) =2/3, p(b) =1/3. Updatera: r a =3,r b =1.
Datakompression fö 8 p.3 Exempel, forts. Koda b, med sannolikheterna p(a) =3/4, p(b) =1/4. Updatera: r a =3,r b =2. Koda a, med sannolikheterna p(a) =3/5, p(b) =2/5. Updatera: r a =4,r b =2. Koda b, med sannolikheterna p(a) =2/3, p(b) =1/3. Updatera: r a =4,r b =3. et cetera.
Datakompression fö 8 p.4 Exempel, minneskälla Markov ordning 1, A = {a, b}. Låt r a a,r b a,r a b och r b b hålla reda på antal gånger symboler uppträtt, givet föregående symbol. De skattade sannolikheterna blir då p(a a) = r a a r a a + r b a, p(b a) = r b a r a a + r b a p(a b) = r a b r a b + r b b, p(b b) = r b b r a b + r b b Antag att vi ska koda sekvensen aababaaabba... Antag att föregående symbol var ett a. Startvärden: r a a = r b a = r a b = r b b =1. Koda a, med sannolikheterna p(a a) =p(b a) =1/2. Updatera: r a a =2,r b a =1,r a b =1,r b b =1.
Datakompression fö 8 p.5 Exempel, forts. Koda a, med sannolikheterna p(a a) =2/3, p(b a) =1/3. Updatera: r a a =3,r b a =1,r a b =1,r b b =1. Koda b, med sannolikheterna p(a a) =3/4, p(b a) =1/4. Updatera: r a a =3,r b a =2,r a b =1,r b b =1. Koda a, med sannolikheterna p(a b) =1/2, p(b b) =1/2. Updatera: r a a =3,r b a =2,r a b =2,r b b =1. Koda b, med sannolikheterna p(a a) =3/5, p(b a) =2/5. Updatera: r a a =3,r b a =3,r a b =2,r b b =1. et cetera.
Datakompression fö 8 p.6 Uppdatering Uppdatering av räknarna sker efter att symbolen kodas, så avkodaren kan göra exakt samma uppdateringar, och ingen sidoinformation behövs. Om man vill att kodningen ska bero mer av det som hänt nyligen än det som hände långt tillbaka i tiden, kan man använde en glömskefaktor. T.ex. i vårt första exempel, när r a + r b >Nså delar vi räknarna med en faktor K: r a r a K, r b r b K Beroende på hur man väljer N och K så glömmer vi tidigare värden olika snabbt, d.v.s. vi får olika snabb adaptering till ändrad statistik.
Datakompression fö 8 p.7 Prediction with Partial Match (ppm) Om man vill koda aritmetiskt med betingade sannolikheter, där man tar hänsyn till många tidigare symboler (motsvarande en markovmodell med hög ordning) så måste man lagra väldigt många räknare. Istället för att lagra alla möjliga kombinationer av tidiga symboler (kontexter), så lagrar vi bara de som verkligen har hänt. Vi måste då införa en extra symbol (escape) för att kunna tala om när något nytt inträffar. I ppm använder man även kontexter av olika längd. Man ansätter en maximal längd N. När man ska koda en symbol tittar man först på den längsta kontexten. Om symbolen uppträtt tidigare i den kontexten kodar man symbolen med motsvarande sannolikhet, annars kodar man en escape-symbol och fortsätter med närmast mindre kontext. Har symbolen inte kodats alls tidigare, i någon kontext, kodas symbolen med en likformig fördelning. Efter att symbolen kodats uppdateras räknarna i kontexterna och eventuella nya kontexter skapas.
Datakompression fö 8 p.8 ppm forts. Det finns många varianter av ppm. Framför allt finns det diverse olika sätt att behandla räknaren (sannolikheten) för escape-symbolen. Den enklaste varianten (kallad ppma) är att alltid låta escape-räknaren vara ett. I ppmb minskar man alla räknare med ett (utom de som redan har värdet ett) och låter räknaren för escape ta detta värde. ppmc är snarlik ppmb. Räknaren för escape är lika med antalet olika symboler som uppträtt i den kontexten. I ppmd ökar man räknaren för escape med ett varje gång man kodar escape. En annan sak man kan utnyttja är uteslutningsprincipen. När man kodar en escapesymbol så vet man att nästa symbol inte är någon av de symboler som uppträtt i den kontexten tidigare. Dessa symboler kan därför ignoreras när man kodar med en kortare kontext. ppm-kodare är de bland de bästa generella kodare som finns när det gäller kompressionsgrad. Nackdelen är att de tenderar att vara väldigt långsamma och kräver mycket minne.
Datakompression fö 8 p.9 Komprimering av bibeln.txt pack 4.51 bitar/symbol. compress -b 16 2.96 gzip -9 2.55 bzip2-9 1.84 dmc c 128000000 1.80 ppmd -m128 -o16 1.53 paq6-7 1.41 pack är en minnesfri statisk huffmankodare. compress använder LZW, ordboksstorlek 2 b. gzip använder deflate, parametern bestämmer hur länge man söker. bzip2 använder BWT + mtf + huffmankodning, blockstorlek n 100000. dmc bygger dynamiskt en markovmodell för källan och kodar aritmetiskt. ppmd: -o styr maxstorleken på kontexterna och -m styr hur mycket minne som maximalt används. paq6 är en nära släkting till ppm där man väger samman olika typer av sannolikhetsskattningar.
Datakompression fö 8 p.10 MQ-kodaren MQ-kodaren är en binär aritmetisk kodare som används i stillbildskodningsstandarderna JBIG2 och JPEG2000. Dess föregångare QM-kodaren används i standarderna JBIG och JPEG. Varje fördelning över ett godtyckligt stort alfabet kan beskrivas som en följd av binära val, så det är ingen större begränsning att bara låta den aritmetiska kodaren arbeta med ett binärt alfabet. I MQ-kodaren håller man reda på den lägre gränsen (kallad C) och intervallets storlek (kallad A). För att maximalt utnyttja noggrannheten i beräkningarna skalar man om intervallet med en faktor 2 (vilket motsvarar ett bitskift åt vänster) så fort som intervallstorleken går under 0.75. Intervallstorleken kommer alltså alltid att uppfylla 0.75 A<1.5. Vid kodningen lägger man alltid den mest sannolika symbolen (MPS) längst ner i intervallet och den minst sannolika (LPS) överst.
Datakompression fö 8 p.11 MQ-kodaren, forts. Om den minst sannolika symbolen (LPS) har sannolikheten Q e, så blir uppdateringen av C och A: Om man kodar MPS: och om man kodar LPS: C = C A = A (1 Q e ) C = C + A (1 Q e ) A = A Q e Eftersom A alltid är ungefär 1, så kan man göra approximationen A Q e Q e.
Datakompression fö 8 p.12 MQ-kodaren, forts. Uppdateringen av C och A blir efter approximationen Om man kodar MPS: C = C A = A Q e och om man kodar LPS: C = C + A Q e A = Q e Vi får alltså en aritmetisk kodare som är fri från multiplikationer, vilket gör att den är enkel att implementera både i mjuk- och hårdvara.
Datakompression fö 8 p.13 MQ-kodaren, forts. MQ-kodaren använder typiskt fixpunktsaritmetik med 16 bitars noggrannhet, där C och A lagras i 32-bitars-register enligt C : 0000 cbbb bbbb bsss xxxx xxxx xxxx xxxx A : 0000 0000 0000 0000 aaaa aaaa aaaa aaaa x-bitarna är bitarna efter binärpunkten i C och a-bitarna är bitarna efter binärpunkten i A. Som konvention låter man A =0.75 motsvaras av 1000 0000 0000 0000. Det innebär att man ska skifta A och C när den 16:e biten i A blir 0.
Datakompression fö 8 p.14 MQ-kodaren, forts. C : 0000 cbbb bbbb bsss xxxx xxxx xxxx xxxx A : 0000 0000 0000 0000 aaaa aaaa aaaa aaaa b är de 8 bitar som ska skickas som en byte härnäst. Varje gång man skiftar C och A så räknar man upp en räknare, när man räknat 8 bitar så kan man skicka en byte. s är till för att man inte ska skicka de 8 senaste bitarna, utan så man får en buffert i händelse av att man får bitar i minne från beräkningarna. Av samma orsak finns c. Om en minnessiffra propagerar ända till c så får man addera ett till den senast buffrade byten. För att inte denna bit i sin tur ska ge upphov till minnespropagering så stoppar man in en extra nolla i kodordet varje gång man buffrar en byte med bara ettor i. Denna extra bit kan detekteras (och tas bort) vid avkodningen. Jämför med problemet med 01 vs 10 i den tidigare beskrivningen av aritmetisk kodning.
Datakompression fö 8 p.15 Sannolikhetsskattningar I JPEG, JBIG och JPEG2000 använder man adaptiva skattningar av sannolikheterna. Istället för att ha räknare för hur ofta symbolerna uppträder, så använder man en tillståndsmaskin där varje tillstånd har en förutbestämt fördelning (värde på Q e ) och där man byter tillstånd beroende på vilken symbol som kodades.