Källkodning Källkodning innebär att vi avbildar sekvenser av symboler ur en källas alfabet på binära sekvenser (kallade kodord). Mängden av alla kodord kalls för en kod. (Man kan förstås tänka sig att ha icke-binära koder också, men i praktiken används bara binära koder.) Beroende på om vi avbildar ett fixt eller varierande antal symboler till varje kodord och om varje kodord har ett fixt eller varierande antal bitar, kan vi dela in koderna i fyra grupper: Fixt antal symboler, fixt antal bitar Exempel: ASCII, ISO 8859-1 Fixt antal symboler, varierande antal bitar Exempel: Huffmankodning, aritmetisk kodning Varierande antal symboler, fixt antal bitar Exempel: Tunstallkodning, Lempel-Ziv, Varierande antal symboler, varierande antal bitar Exempel: Lempel-Ziv Källkodning fö 3 p.1/23 Källkodning fö 3 p.2/23 Några exempel Egenskaper hos koder Antag att A = {a, b, c} fix fix fix variabel a 00 0 b 10 10 c 01 110 variabel fix variabel variabel aa 000 0 aba 001 100 abb 010 101 abc 011 1100 ac 100 1101 b 101 1110 c 110 11110 Om man från en sekvens av kodord kan återskapa den ursprungliga källsekvensen kallas koden för unikt avkodbar. Om man kan känna igen kodorden direkt vid avkodning, kallas koden momentant avkodbar (instantaneous). Om inget kodord är prefix till något annat kodord kallas koden för en prefixkod (i viss litteratur kallas de för prefixfria koder). Dessa koder är trädkoder, dvs kodorden är löv i ett binärt träd. Alla prefixkoder är momentant avkodbara och alla momentant avkodbara koder är prefixkoder. Källkodning fö 3 p.3/23 Källkodning fö 3 p.4/23
Exempel Är en given kod unikt avkodbar eller ej? Exempel, A = {a, b, c, d} Symbol Kod 1 Kod 2 Kod 3 Kod 4 a 0 0 0 0 b 0 1 10 01 c 1 00 110 011 d 10 11 111 111 Kod 1 Ej unikt avkodbar Kod 2 Ej unikt avkodbar Kod 3 Unikt avkodbar, momentant avkodbar Kod 4 Unikt avkodbar, ej momentant avkodbar Gör en lista av alla kodord. Undersök alla par av element i listan för att se om något element är prefix till ett annat element. I sådana fall lägg till suffixet till listan, om det inte redan finns där. Repetera tills en av två saker händer: 1. Man hittar ett suffix som är ett kodord. 2. Man hittar inga nya suffix att lägga till listan. I fall 1 är koden inte unikt avkodbar, i fall 2 är koden unikt avkodbar. Källkodning fö 3 p.5/23 Källkodning fö 3 p.6/23 Krafts olikhet Krafts olikhet, forts. En momentant avkodbar kod (prefixkod) med kodordslängderna l 1,...,l N existerar om och endast om Bevis: Antag att vi har en trädkod. Låt l max =max{l 1,...,l N }. Utvidga trädet så att alla grenar har djupet l max. Ett kodord på djupet l i har 2 l max l i löv under sig på djupet l max. Mängderna av löv är disjunkta. Det totala antalet löv under kodord är mindre än eller lika med 2 l max. Vi har alltså 2 l max l i 2 l max Omvänt kan vi, givet kodordslängder l 1,...,l N som uppfyller Krafts olikhet, alltid konstruera en trädkod. Börja med ett fullständigt träd där alla grenar har djup l max. Antag, utan att förlora i generalitet, att kodordslängderna är sorterade i stigande ordning. Välj någon ledig nod på djup l 1 för det första kodordet och ta bort alla dess avkomlingar. Gör likadant för l 2 och kodord 2, o.s.v. tills vi har placerat ut alla kodorden. Källkodning fö 3 p.7/23 Källkodning fö 3 p.8/23
Krafts olikhet, forts. Kraft-McMillans olikhet Uppenbarligen kan vi placera ut ett kodord på djup l 1. För att algoritmen ska vara möjligt måste det i steg i finnas lediga löv på maxdjupet l max. Antalet kvarvarande löv är i 1 i 1 2 l max 2 l max l j =2 l max (1 2 l j ) > 2 l max (1 2 l j ) 0 j=1 j=1 där vi utnyttjat att Krafts olikhet är uppfylld. Det finns alltså lediga löv i varje steg, alltså kan vi konstruera en prefixkod med de givna kodordslängderna. j=1 Krafts olikhet kan visas gälla för alla unikt avkodbara koder, inte bara prefixkoder. Den benämns då Kraft-McMillans olikhet: En unikt avkodbar kod med kodordslängderna l 1,...,l N existerar om och endast om Betrakta ( N 2 l i ) n, där n är ett godtyckligt heltal. ( ) n = i 1 =1 i n =1 2 (l i 1 +...+l i n ) Kraft-McMillans olikhet, forts. Källkodning fö 3 p.9/23 Kraft-McMillans olikhet, forts. Källkodning fö 3 p.10/23 l i1 +...+ l in är längden av n stycken kodord från koden. Det minsta värde denna exponent kan ta är n, som skulle hända om alla kodord hade längden 1. Det största värdet exponenten kan ta är nl där l är den maximala kodordslängden.summationen kan då skrivas om som ( ) n = nl k=n A k 2 k där A k är antalet kombinationer av n kodord som har den kombinerade längden k. Det finns maximalt 2 k binära sekvenser av längden k. Eftersom koden är unikt avkodbar, måste det gälla att för att vi ska kunna avkoda. A k 2 k Vi har alltså Vilket ger oss nl ( ) n 2 k 2 k = nl n +1 k=n (n(l 1) + 1) 1/n Detta gäller för alla n, inklusive när vi låter n gå mot oändligheten, vilket alltså slutligen ger oss Omvändningen till olikheten har vi redan, genom att vi kan konstruera en prefixkod med givna kodordslängder om de uppfyller Krafts olikhet. Källkodning fö 3 p.11/23 Källkodning fö 3 p.12/23
Godhetsmått Entropin som nedre gräns Det godhetsmått vi har för att mäta hur bra en kod är är (data)takten R R = E{# bitar i kodordet} E{# symboler per kodord} [bitar/symbol] Eftersom det är datakomprimering vi sysslar med, så vill vi att våra koder ska ha så låg takt som möjligt. Om vi till att börja med antar att vi har en minnesfri källa X j och kodar en symbol i taget med en prefixkod, så ges R av R = l = p i l i [bitar/symbol] där L är storleken på alfabetet och p i sannolikheten för symbol i. l är kodens kodordsmedellängd [bitar/kodord]. Entropin är en lägre gräns för l l H(Xj ) Betrakta skillnaden mellan entropin och kodordsmedellängden H(X j ) l = = p i log p i p i l i = p i (log 1 log 2 l i )= p i 1 ln 2 p i (log 1 l i ) p i p i log 2 l i p i p i ( 2 l i 1) = 1 L p i ln 2 ( där vi utnyttjat ln x x 1 samt Krafts olikhet p i ) (1 1) = 0 ln 2 Källkodning fö 3 p.13/23 Källkodning fö 3 p.14/23 Optimala koder Övre gräns för optimala koder En prefixkod kallas optimal om det inte existerar någon annan kod (för samma alfabet och sannolikhetsfördelning) som har lägre kodordsmedellängd. Den optimala koden uppfyller l <H(X j )+1 Låt l i = log p i = log p i + s i där 0 s i < 1 Det existerar förstås flera koder som har samma kodordsmedellängd. Enklaste fallet är att bara byta 0:or mot 1:or. = = 2 log p i s i p i 2 s i p i = 1 Krafts olikhet är uppfylld, alltså existerar en unikt avkodbar kod med de givna kodordslängderna Källkodning fö 3 p.15/23 Källkodning fö 3 p.16/23
Övre gräns för optimala koder, forts. Gränser Vad har denna kod för kodordsmedellängd? L l = p i l i = = < p i ( log p i + s i ) p i log p i + p i log p i + p i s i p i = H(X j )+1 Den optimala koden kan ju inte vara sämre än denna kod, då vore det ingen optimal kod. Alltså gäller även för en optimal kod att l <H(X j )+1. OBS: Om p i l = H(Xj ). = 2 k i, i för heltal k i, så kan vi konstruera en kod med Vi har alltså visat att för en minnesfri källa där vi kodar en symbol i taget existerar det prefixkoder som uppfyller H(X j ) R = l <H(X j )+1 Resultatet kan enkelt generaliseras till källor med minne där vi kodar n symboler i taget. Datatakten uppfyller då R = l n 1 n H(X jx j+1...x j+n 1 ) R< 1 n H(X jx j+1...x j+n 1 )+ 1 n Genom att koda många symboler med varje kodord kan vi alltså komma godtyckligt nära entropigränsen, både då källan har minne och då den är minnesfri. Krav på optimala koder Källkodning fö 3 p.17/23 Krav på optimala koder, forts. Källkodning fö 3 p.18/23 Antag att vi kodar en symbol från alfabetet A = {a 1,...,a L } med varje kodord, och att kodordslängderna är l 1,...,l L. Nödvändiga villkor för att koden ska vara optimal är 1. Om p(a i ) p(a j ) så måste l i l j. 2. De två minst sannolika symbolerna har kodord med samma längd. 3. I kodträdet för en optimal kod måste det gå ut två grenar från varje inre nod. 4. Antag att vi ändrar en inre nod i trädet till ett löv genom att slå ihop all löv som utgår ifrån det till en enda symbol i ett reducerat alfabet. Om originalträdet var optimalt för originalalfabetet så är det reducerade trädet optimalt för det reducerade alfabetet. Källkodning fö 3 p.19/23 1. Om inte kunde vi bara byta kodord mellan de två symbolerna och få en kod med lägre kodordsmedellängd. 2. Antag att vi har en prefixkod där de två minst sannolika symbolerna har olika kodordslängd. Vi kan skapa en ny kod genom att ta bort de sista bitarna i det längre kodordet så att de två kodorden är lika långa. Den nya kodorden är fortfarande en prefixkod, eftersom det enligt 1 inte finns några kodord som är längre. Den nya koden har en lägre kodordsmedellängd, alltså är den ursprungliga koden inte optimal. 3. Antag att en prefixkod har en inre nod med bara en gren. Vi kan då ta bort den grenen och flytta upp delträdet därunder ett steg. Denna nya kod är fortfarande en prefixkod, och den har en lägre kodordsmedellängd. Alltså kan den ursprungliga koden inte vara optimal. 4. Om den reducerade koden inte var optimal skulle vi kunna konstruera en ny kod för det reducerade alfabetet och sen expandera den reducerade symbolen igen så att vi får en ny kod med lägre kodordsmedellängd än originalkoden. Källkodning fö 3 p.20/23
Huffmankodning Huffmankoder, forts. Enkel metod för att konstruera optimala trädkoder. Börja med enstaka symboler som löv. Slå i varje steg ihop de två minst sannolika noderna till en inre nod. Sannolikheten för den nya noden är summan av de två ursprungliga noderna. Om det finns fler noder med samma sannolikhet att välja mellan spelar det ingen roll vilken vi väljer. När vi konstruerat hela kodträdet, skapar vi kodorden genom att sätta 0 resp. 1 på de utgående grenarna i varje nod. Vilken gren som sätts till 0 resp. 1 spelar ingen roll. Antag att den mest sannolika symbolen för en källa X k har sannolikheten p max. Man kan visa att kodordsmedellängden för en en huffmankod uppfyller { H(X k )+p max ; p max 0.5 l < H(X k )+p max +0.086 ; p max < 0.5 Jämför med vår tidigare övre gräns l <H(Xk )+1 Källkodning fö 3 p.21/23 Källkodning fö 3 p.22/23 Utvidgade huffmankoder För små alfabet med skeva fördelningar, eller för källor med minne, kan en huffmankod vara ganska långt från entropigränsen. Detta kan ofta förbättras om man utvidgar källan, dvs man kodar fler symboler i taget med varje kodord. Den maximala redundansen (skillnanden mellan datatakten och entropin) minskar då som 1 n när vi kodar n symboler i taget. Notera att utvidgning inte garanterar att datatakten minskar, bara att den övre gränsen kommer närmare den undre gränsen. Källkodning fö 3 p.23/23