Aritmetisk kodning Vi identifierar varje sekvens av källsymboler med ett tal i intervallet [0, 1). Vi gör det med hjälp av fördelningsfunktionen (cumulative distribution function) F. För enkelhets skull antar vi att alfabetet består av positiva heltal. A = {1, 2,...,L} F (i) = i p(k) k=1 F (0) = 0 Exempel: A = {1, 2, 3} p(1) = 0.7, p(2) = 0.1, p(3) = 0.2 F (0) = 0, F(1) = 0.7, F(2) = 0.8, F(3) = 1 Källkodning fö 5 p.1/12
Intervall Symbolen i associeras med delintervallet [F (i 1),F(i)). Varje delintervall delas i sin tur in mindre delintervall i samma proportioner som originalintervallet [0, 1) om källan är minnesfri. Har vi en minneskälla kan vi istället dela upp intervallen enligt den betingade fördelningsfunktionen. Varje symbolsekvens av längd n identifierar unikt ett delintervall. Kodordet för sekvensen är ett tal i intervallet. Antal bitar i kodordet beror av intervallets storlek, så ett stort intervall (dvs en sekvens med hög sannolikhet) får ett kort kodord, medan ett litet intervall ger ett längre kodord. Källkodning fö 5 p.2/12
Iterativ algoritm Antag att vi vill koda en sekvens x = x 1,x 2,...,x n. Vi betecknar den undre gränsen i motsvarande intervall med l (n) och den övre gränsen med u (n).mankandåvisaatt l (n) = l (n 1) +(u (n 1) l (n 1) )F (x n 1) Startvärden är l (0) =0och u (0) =1. u (n) = l (n 1) +(u (n 1) l (n 1) )F (x n ) Intervallstorleken är förstås lika med sannolikheten för sekvensen u (n) l (n) = p(x) Källkodning fö 5 p.3/12
Kodord Kodordet för ett intervall är den kortaste bitsekvens b 1 b 2...b k sådan att det binära talet 0.b 1 b 2...b k ligger i intervallet och att även alla andra tal som börjar med samma k bitar också ligger i intervallet. Givet ett binärt tal a i intervallet [0, 1) med k bitar 0.b 1 b 2...b k. Alla tal vars k första bitar är samma som för a ligger i intervallet [a, a + 1 ). 2 k Ett nödvändigt villlkor för att hela detta intervall ska ligga inom intervallet som hör till symbolsekvensen, är att det är mindre än eller lika stort som symbolsekvensintervallet, dvs p(x) 1 2 k k log p(x) Vi kan inte vara säkra på att det verkligen räcker med log p(x) bitar, eftersom vi inte kan placera ut dessa intervall på godtyckliga platser. Däremot kan man inse att det maximalt krävs en bit extra om man har otur. Kodordslängden l(x) för en sekvens x ges alltså av l(x) = log p(x) eller l(x) = log p(x) +1 Källkodning fö 5 p.4/12
Kodordsmedellängd l = p(x) l(x) x x x p(x) ( log p(x) +1) p(x) ( log p(x)+2)= x p(x) log p(x)+2 p(x) = H(X 1 X 2...X n )+2 Och den resulterande datatakten begränsas alltså uppåt av x R 1 n H(X 1X 2...X n )+ 2 n Detta är visserligen lite sämre än man skulle få med en utvidgad huffmankod, men huffmankoder är inte praktiskt användbara för stora n. Komplexiteten för en aritmetisk kod är å andra sidan oberoende av hur många symboler n som man kodar i taget. Källkodning fö 5 p.5/12
Praktiska problem Vi har begränsad precision och kan inte lagra intervallgränser och sannolikheter med godtycklig noggrannhet. Vi vill kunna börja skicka bitar utan att vänta på att hela sekvensen med n symboler kodats. En lösning är att skicka bitar så snart vi är säkra på dem och att när deta görs skala om intervallet, så att vi maximalt utnyttjar den tillgängliga precisionen. När intervallet blir mindre och mindre kan tre intressanta saker hända: 1. Intervallet ligger helt inom [0, 0.5) 2. Intervallet ligger helt inom [0.5, 1) 3. Intervallet ligger helt inom [0.25, 0.75) och innefattar 0.5 Källkodning fö 5 p.6/12
Intervallskalning 1. Vi vet att kodordet måste börja med en 0:a. Skicka en 0:a och skala om intervallet så att [0, 0.5) [0, 1) 2. Vi vet att kodordet måste börja med en 1:a. Skicka en 1:a och skala om intervallet så att [0.5, 1) [0, 1) 3. Skala om intervallet så att [0.25, 0.75) [0, 1) Skicka inga bitar, men håll reda på hur många gånger vi gör omskalningar av den här typen. Nästa gång vi gör en omskalning av typen 1, skicka först en 0:a och sedan lika många 1:or extra som antalet omskalningar av typ 3. På samma sätt, nästa gång vi gör en omskalning av typ 2 så skickas en 1:a och lika många extra 0:or som antalet omskalningar av typ 3. Källkodning fö 5 p.7/12
Fixpunktsaritmetik Aritmetisk kodning implementeras oftast med fixpunktsaritmetik. Antag att intervallgränserna l (n) och u (n) lagras som heltal med m bitars noggrannhet och att fördelningsfunktionen F (i) lagras som heltal med k bitars noggrannhet. Algoritmen kan då modifieras till l (n) = l (n 1) + (u(n 1) l (n 1) +1)F (x n 1) 2 k u (n) = l (n 1) + (u(n 1) l (n 1) +1)F (x n ) 2 k 1 Startvärden blir l (0) =0och u (0) =2 m 1. Källkodning fö 5 p.8/12
Intervallskalning De tre fallen när vi ska göra intervallskalning blir: 1. Intervallet ligger helt inom [0, 2 k 1 ), dvs den mest signifikanta biten i både l (n) och u (n) är 0. 2. Intervallet ligger helt inom [2 k 1, 2 k ), dvs den mest signifikanta biten i både l (n) och u (n) är 1. 3. Intervallet ligger helt inom [2 k 2, 2 k 1 +2 k 2 ) och innehåller 2 k 1 1, dvs de två mest signifikanta bitarna är 01 i l (n) och 10 i u (n). Källkodning fö 5 p.9/12
Intervallskalning, forts. Intervallskalningarna modifieras till: 1. Skifta ut mest signifikant bit ur l (n) och u (n) och skicka den. Skifta in 0il (n) och 1 i u (n). 2. Samma som typ 1. 3. Skifta ut mest signifikant bit ur l (n) och u (n). Skifta in 0 i l (n) och 1 i u (n). Invertera de nya mest signifikanta bitarna i l (n) och u (n).skicka inga bitar, men håll reda på hur många gånger vi gör omskalningar av den här typen. Nästa gång vi gör en omskalning av typen 1, skicka lika många 1:or extra som antalet omskalningar av typ 3. På samma sätt, nästa gång vi gör en omskalning av typ 2 så skickas lika många extra 0:or som antalet omskalningar av typ 3. Källkodning fö 5 p.10/12
Krav på precisionen Vi måste använda en datatyp med minst m + k bitar för att få plats med delresultaten i beräkningarna. Vi ser också att det minsta intervall vi kan ha utan att någon omskalning görs har storleken 2 k 2 +1, vilket till exempel händer när l (n) =2 k 2 1 och u (n) =2 k 1. För att algoritmen ska fungera måste alltså alla intervall i fördelningsfunktionen uppfylla F (i) F (i 1) 2 k m+2 ; i =1,...,L Till exempel så måste m k +2om vi har något intervall av storlek 1. Källkodning fö 5 p.11/12
Avkodning Starta avkodaren i samma tillstånd (dvs l =0och u =2 m 1) som kodaren. Inför t som de m första bitarna i bitströmmen (kodordet). I varje steg räknar vi ut talet (t l +1) 2k 1 u l +1 Jämför detta tal med F för att se vilket intervall detta motsvarar. Detta ger en avkodad symbol. Uppdatera l och u på samma sätt som i kodaren. Vi gör eventuellt ett antal skift (omskalningar). Varje gång vi skiftar l och u ska vi även uppdatera t genom att skifta ut den mest signifikanta biten och skifta in en ny bit från kodströmmen som minst signifikant bit. Repetera tills hela sekvensen är avkodad. Observera att kodaren kan behöva skicka antalet symboler som sidoinformation, så att avkodaren vet när den ska sluta avkoda. Alternativt kan man införa en extra symbol i sitt alfabet, med lägsta möjliga sannolikhet, som används för att markera när sekvensen tar slut. Källkodning fö 5 p.12/12