Transformkodning Idé:. Tag datasekvensen och dela in den i block av storlek N (eller N N om signalen är tvνadimensionell). Transformera dessa block med en lämplig, reversibel transform till en ny sekvens. 2. Kvantisera trasformkomponenterna. 3. Använd nνagon form av kodning pνa de kvantiserade transformkomponenterna (fixlängdskodning, huffman, aritmetisk kodning et.c.) Linjära transformer lock av N sampel frνan signalen fxng N n=0 transformeras till ett block f ng N n=0 n = N X a n;i x i Medan alla komponenter i x har samma karakteristik (varians et.c.) har komponenterna i oftast olika karakteristik beroende pνa positionen n. Inverstransformen, som νaterskapar fxng frνan f ng ges av xn = N X b n;i i Matrisbeskrivning Transformen och inverstransformen kan skrivas pνa matrisform som där μx = 0 @ μ = A μx ; μx = μ x 0 x. x N 0 A ; μ = @ 0. N A och matriselementen pνa position (i; j) ges av [A] i;j = a i;j ; [] i;j = b i;j Matriserna A och är varandras inverser, dvs = A. Vi intresserar oss bara för ortonormala transformer, dvs transformer där = A = A T. Ortonormala transformer är energibevarande, dvs summan av kvadraterna pνa den transformerade signalen är lika med summan av kvadraterna pνa originalsignalen N X 2 i = μ T μ = (Aμx) T Aμx = μx T A T Aμx = μx T μx = N X x 2 i Vi är intresserade av transformer som koncentrerar signalenergin i sνa fνa komponenter som möjligt. Ett sätt att mäta hur bra en viss transform är transformkodningsvinsten (transform coding gain). G T = N P N ff2 i ( Q N ff2 i )=N
Transformen som basbyte Transformen kan ses som att vi skriver signalen i en annan bas, dvs som en linjärkombination av nya basvektorer μx = A0 T μ a = 00 a N ;0 @..... = 0 0 @ a 0;N a N ;N a 00. a 0;N 0 A 0 A + :::+ N @ @ 0. N A a N ;0. a N ;N Raderna i transformmatrisen (kolumnerna i inverstransformmatrisen) kan ses som basvektorer i en ny bas. A Nνagra önskvärda egenskaper hos transformen ffl Den ska koncentrera signalenergin till sνa fνa komponenter som möjligt. ffl Den ska helst dekorrelera transformkomponenterna, dvs ta bort beroendet (minnet) mellan transformkomponenterna. ffl Den ska vara robust mot förändringar i källans statistik. ffl Den ska vara enkel att beräkna. Alla dessa egenskaper kan inte fνas i en och samma transform. Karhunen-Lo eve-transformen (KLT) KLT är den transform som helt dekorrelerar transformkomponenterna och ger maximal energikoncentrering. Korrelationsmatrisen R för en signal är en matris där element (i; j) ges av autokorrelationsfunktionen enligt [R] ij = EfXnX n+ji jj g = Rxx(ji jj) asvektorerna (raderna) i KLT-matrisen ges av de normerade egenvektorerna till R. Varianserna för transformkomponenterna kommer att vara lika med motsvarande egenvärden. Nackdelen med KLT är att den är signalberoende, och man mνaste därför skicka över transformmatrisen som sidoinformation. Man mνaste dessutom räkna ut nya basvektorer när källans statistik ändras. Diskret cosinustransform (DT) Transformmatrisen ges av 8 q N >< ; i = 0 [] ij = q >: 2N cos (2j+)iß 2N ; i = ;:::;N DT är nära besläktad med den diskreta fouriertransformen. Det finns snabba sätt att beräkna en DT, pνa samma sätt som det finns snabba fouriertransformer (FFT). DT har nästan samma energikoncentreringsegenskaper som KLT för källor med hög korrelation mellan närliggande sampel. DT är den i särklass mest använda transformen inom bildkodning, t.ex. inom standarderna JPEG och MPEG.
Diskret Walsh-Hadamard-transform (DWHT) En hadamardmatris H N ges av där H =. ψ! HN=2 H H N = N=2 H N=2 H N=2 av storlek N = 2 k Transformmatrisen i DWHT är en hadamardmatris, normerad med en faktor = p N. Eftersom transformmatrisen, bortsett frνan normeringsfaktorn, bara innehνaller ± är transformen väldigt enkel att räkna ut. Dock ger DWHT inte särskilt bra energikoncentrering, och eftersom basfunktionerna är väldigt kantiga" blir eventuella kvantiseringsfel väldigt synliga. Tvνadimensionella signaler I en tvνadimensionell signal (t.ex. en bild) tar man ut block av storlek N N som man transformerar. Generellt kan man se detta block som en vektor med N 2 sampel och använda en transformmatris av storlek N 2 N 2. Oftast använder man en separabel transform. Man betraktar dνa blocket som en matris X istället för en vektor. Man applicerar en endimensionell transform först pνa raderna i X och sedan pνa kolumnerna (eller tvärtom, ordningen spelar ingen roll). Resultatet är en matris av transformkomponenter = AXA T Inverstransformen ges av X = A T A Tvνadimensionella signaler, forts. asmatriser för en 8 8 DT Man kan se det som att vi skriver blocket X som en linjärkombination av nya basmatriser ff ij som ges av ff ij = μa T i μa j där μa i och μa j är den i:te respektive j:te raden i A. X = N X N X [ ] ij ff ij j=0 En separabel transform kan alltid skrivas om som en generell transform som appliceras pνa en vektor med N 2 element, men däremot gäller inte omvändningen.
Distorsion Val av blockstorlek N Stort N ger bättre koncentrering av energin, men transformen blir mer komplicerad att räkna ut. Dessutom blir det svνarare att anpassa kodaren om källan har olika källstatistik i olika delar (t.ex. för- och bakgrund i en bild, eller olika partier i en musiksignal.) För ortonormala transformer kommer distorsionen i transformplanet vara den samma som distorsionen i signalplanet. Antag att vi kvantiserar (och rekonstruerar) transformvektorn till ^ och inverstransformeras till det rekonstruerade blocket ^x. Distorsionen blir D = jjμx ^xjj 2 = (μx ^x) T (μx ^x) = (μ ^ ) T AA T (μ ^ ) = (μ ^ ) T (μ ^ ) = jj μ ^ jj 2 Vill vi minimera distorsionen kan vi alltsνa göra det direkt i transformplanet. Kvantisering och kodning av transformkomponenter, zonkodning. Transformkomponent k kvantiseras och kodas med R k bitar, med en resulterande distorsion D k. Distorsionen ges approximativt av D k = c k ff 2 k 2 2R k där c k är en konstant som beror av fördelningen och typen av kodning och kvantisering. Vi vill hitta den bittilldelning som minimerar den totala distorsionen D = N X k=0 D k = N X c k ffk 2 2 2R k k=0 under bivillkoret att medelantalet bitar per sampel är R = N N X R k Vi antar för enkelhets skull att alla transformkomponenter har samma typ av fördelning och att vi använder samma typ av kvantisering och kodning. Dνa är alla c k lika. Lagrangeoptimering ger att (se Sayood för detaljer) R k = R + 2 log ff k 2 2 ( Q N ff2 k )=N Notera att detta kan ge att vissa komponenter tilldelas ett negativt antal bitar. I sνadana fall sätts antal bitar till 0, och vi minskar bitantalet pνa övriga komponenter sνa att medeldatatakten fortfarande är R. För vissa typer av kvantisering och kodning (Lloyd- Max-kvantisering, kvantisering med efterföljande fixlängdskodning) har vi även bivillkoret att bitantalet mνaste vara ett heltal.
Exempel, koda hey04.wav frνan projektlaborationen. En annan variant är att iterativt dela ut en bit i taget till den komponent som har högst distorsion (och beräkna nya distorsioner) tills vi nνar den önskade medeldatatakten. Dessa typer av bittilldelningar kallas för zonkodning. Antalet bitar som varje transformkomponent är fixt för alla block. Komponenter med hög varians tilldelas ett större antal bitar, komponenter med liten varians kanske inte kodas alls. Zonkodning är enkel, men fungerar mindre bra om statistiken varierar väldigt mycket mellan blocken. Signalen har en varians ff 2 ß 0:04379 Om vi konstruerar en 4-bitars skalär kvantiserare för signalen med hjälp av LG-algoritmen fνar vi en distorsion D ß 0:000356 och ett SNR pνa 20.9 d. Vi kodar nu signalen med en 4-punkters DT. Varianserna för de fyra transformkomponenterna är ff 2 ß 0:705 ff2 2 ß 0:00365 ff3 2 ß 0:00383 ff4 2 ß 0:000226 Kontroll: medelvärdet av varianserna ska vara lika med signalens varians. Exempel, forts. Vi vill fortfarande ha en medeldatatakt pνa R = 4 bitar/sampel. Vi använder formeln R k = R + 2 log ff k 2 2 ( Q N ff2 k )=N för att bestämma hur mνanga bitar varje komponent ska kvantiseras med. R ß 6:89 ß 7 R 2 ß 4:0 ß 4 R 3 ß 3:42 ß 3 R 4 ß :67 ß 2 Vi konstruerar Lloyd-Max-kvantiserare för varje transformkomponent med givet antal bitar och fνar resulterande distorsioner D ß 0:0000640 D 2 ß 0:00007375 D 3 ß 0:000250 D 4 ß 0:00003283 Exempel, forts. Medeldistorsionen blir D = 4X D 4 i ß 0:0000739 i= Vilket ger ett SNR pνa 27.7 d. Genom att använda transformen har vi alltsνa tjänat 6.8 d.
Zigzag-scanning för 8 8 transform. Dnivνan i det övre vänstra hörnet kodas normalt separat. Tröskelkodning För varje transformblock talar man om vilka transformkomponenter vars magnitud ligger över ett visst tröskelvärde. ara dessa komponenter kvantiseras och kodas, övriga komponenter sätts till 0. Vilka komponenter som ligger över tröskeln skickas som sidoinformation för varje block. För tvνadimensionella transformer är zigzagscanning med skurlängdskodning av nollor ett effektivt sätt att koda vilka komponenter som ligger över tröskeln. JPEG ISO-standard (990) för kodning av bilder. Använder DT pνa block av storlek 8 8 bildpunkter. Kombinerad likformig kvantisering och tröskelkodning. Steglängden kan väljas fritt för varje transformkomponent. Typiskt kvantiseras högfrekvenskomponenterna mycket hνardare än lνagfrekvenskomponenterna. Källkodningen är antingen huffmankodning eller aritmetiskt kodning. Eftersom den aritmetiska kodaren som används skyddas av ett flertal patent som företag kräver licenspengar för, sνa används i praktiken bara huffmankodning. JPEG, forts. Kvaliteten styrs av hur man väljer steglängderna i de 64 kvantiserarna. Eftersom de kan väljas fritt och oberoende av varandra kan det vara svνart att hitta det bästa valet av steglängder. För att förenkla lνater de flesta JPEG-kodare därför användaren bara välja en kvalitetsparameter, som sen används för att skala om en standardmatris av kvantiseringssteg.
Kodning av D-nivνan. Man kodar skillnanden d frνan D-nivνan i föregνaende block. Huffmankodning sker inte direkt pνa skillnadsvärdena. Istället bildar man en kategori k = dlog(jdj + )e Man beräknar statistik och bygger ett huffmanträd för signalen k. Kodordet för en skillnad d bestνar av huffmankodordet för k plus k stycken extra bitar för att exakt specificera d. k d extra bitar 0 0 ; 0; 2 3; 2; 2; 3 00; 0; 0; 3 7;:::; 4; 4;:::; 7 000;:::; 0; 00;:::;... Kodning av övriga transformkomponenter Komponenterna ordnas i zigzag-ordning. Alla skurar av nollor ersätts med längden av skuren (min 0, max 5). Ett nytt symbolalfabet bildas som bestνar av en skurlängd och en nollskild komponent. Pνa motsvarande sätt som för D-nivνan bildar man kategorin för varje nollskild komponent l som k = dlog(jlj + )e Man beräknar statistik för paren (skurlängd, kategori) och bygger en huffmankod för detta alfabet. Pνa samma sätt som för D-nivνan följs huffmankodordet av k stycken bitar som talar om exakt vilket värde den nollskilda komponenten har. I huffmankoden ingνar även tvνa speciella symboler, nämligen EO (End Of lock) som används när de resterande komponenter i ett block alla är 0, och ZRL (Zero Run Length) som används om man mνaste koda en skur av nollor som är längre än 5. ZRL betyder 6 nollor, sνa till exempel kodas en skur av 9 nollor följt av komponenten 5 som (ZRL)(3,5). Exempel, ett block frνan Lenna-bilden 86 85 75 37 90 8 89 98 83 76 24 88 92 00 03 2 67 83 83 97 07 5 2 95 80 83 85 99 03 2 74 92 98 94 96 99 03 5 76 85 90 88 89 88 07 02 77 76 77 82 82 83 93 88 72 72 65 57 62 63 68 67 Efter DT (avrundat till heltal) 794 40 63 2 0 2 5 5 99 50 4 2 5 3 6 93 4 3 0 0 2 3 38 20 27 45 4 3 2 5 3 23 28 2 2 6 3 2 6 3 2 5 5 0 4 7 3 3 7 7 3 3 5 5 2 3
Efter kvantisering med steglängd 30 för alla komponenter 26 2 0 0 0 0 0 5 3 2 0 0 0 0 0 0 3 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 Ordna i zizgzagordning (D-komponenten borttagen) 5 0 3 2 0 2 3-0 0 0 0 0 0-0 0 0 0 - - 0 0 0 0 0 0 0-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 Koda som par (skurlängd, nollskild komponent) (0,) (0,5) (,3) (0,2) (,2) (0,3) (0,) (0,- ) (0,) (6,-) (4,-) (0,-) (7,-) (ZRL) (2,) (EO) Koda nollskild komponent som kategori plus extra bitar (0,) (0,3) 0 (,2) (0,2) 0 (,2) 0 (0,2) (0,) (0,) 0 (0,) (6,) 0 (4,) 0 (0,) 0 (7,) 0 (ZRL) (2,) (EO) Gör samma sak för alla block i bilden, samla statistik över fördelningen för paren (skurlängd, kategori) och konstruera en huffmankod för dem. Avkodaren νaterskapar följande transformblock 780 30 60 0 0 0 0 0 50 90 60 0 0 0 0 0 0 90 0 0 0 0 0 0 30 30 30 30 0 0 0 0 30 0 30 30 0 0 0 0 0 0 0 0 0 30 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 vilket inverstransformeras till följande block 83 73 6 32 9 77 86 9 82 65 20 9 98 02 02 8 53 20 88 76 87 0 25 27 95 82 85 87 82 97 9 20 63 86 92 90 96 93 96 7 8 87 89 90 93 95 97 03 86 70 75 82 75 84 92 78 57 64 62 62 7 68 60 64