Prediktiv kodning Linjär prediktion Närliggande sampel i en signal är oftast starkt korrelerade med varandra, det kan därför vara en bra ide att försöka utnyttja denna korrelation (minnet) innan kvantiseringen för att få en effektivare kodning. En generell prediktiv kodare utnyttjar signalens utseende N steg tillbaka i tiden för kodningen, dvs vi kodar efter den betingade fördelningen f(x n x n 1 x n 2...x n N ) Detta är en markovmodell av ordning N. En kontinuerlig markovmodell är komplicerad och är ofta svår att estimera för en given signal. Istället är det enklare att använda en AR-modell för källan, och då får vi en linjär prediktor. Idé: Vi gissar (predikterar) signalens värde i tidpunkten n som en linjärkombination av de N senaste värdena. p n = a 1 x n 1 + a 2 x n 2 +...+ a N x n N = = a i x n i Skillnaden mellan det riktiga värdet och det predikterade värdet, prediktionsfelet, d n = x n p n kvantiseras och skickas till mottagaren. Mottagaren rekonstruerar d n, beräknar p n och kan sen återskapa x n. Detta fungerar inte i praktiken! Problemet är att mottagaren bara kan återskapa en distorderad version ˆd n av prediktionsfelet och därför bara en distorderad version ˆx n av signalen. TSBK35 linjär prediktion p. 1/27 TSBK35 linjär prediktion p. 2/27 Linjär prediktion Prediktiv kodare och avkodare För att den prediktiva kodaren ska fungera, måste kodardelen göra samma beräkningar som avkodardelen kan göra. Prediktionen måste göras från den rekonstruerade signalen ˆx n istället för från originalsignalen. p n = a 1ˆx n 1 + a 2ˆx n 2 +...+ a N ˆx n N = = a iˆx n i x n + d n ˆdn Q + p + n ˆx n P ˆd n + + p n ˆx n P Prediktionsfelet d n kvantiseras och skickas. Både kodaren och avkodaren återskapar ˆd n och ˆx n = p n + ˆd n. Prediktiv kodare Prediktiv avkodare TSBK35 linjär prediktion p. 3/27 TSBK35 linjär prediktion p. 4/27
Optimering av prediktorn Optimering av prediktorn Hur ska man välja prediktorkoefficienterna a i? Givet en datatakt R såvill vi minimera distorsionen D = E{(x n ˆx n ) 2 } = E{(d n ˆd n ) 2 } Kvantiseringen gör att det är svårt att beräkna optimala a i exakt. Om vi antar fin kvantisering, dvs att antalet kvantiseringsnivåer är stort, kan vi göra approximationen ˆx n x n dvs vi räknar som om prediktionen gjordes påoriginalsignalen. Med fin kvantisering får vi även att D c σ 2 d 2 2R där σd 2 är variansen hos prediktionsfelet och c beror av vilken typ av kvantisering vi gör och vilken fördelning d n har. Vi kan alltsåminimera distorsionen genom att minimera prediktionsfelets varians. Prediktionsfelets varians σd 2 = E{(x n p n ) 2 } = = E{(x n a iˆx n i ) 2 } E{(x n a i x n i ) 2 } Derivera m.a.p. a j och sätt lika med 0, vilket ger oss N ekvationer a j σ 2 d = 2 E{(x n a i x n i ) x n j } =0 Matrisbeskrivning TSBK35 linjär prediktion p. 5/27 Matrisbeskrivning TSBK35 linjär prediktion p. 6/27 Detta kan skrivas om som matrisekvationen RA = P Lösningen kan fås som A = R 1 P där R = R xx (0) R xx (1) R xx (N 1) R xx (1) R xx (0) R xx (N 2)..... R xx (N 1) R xx (N 2) R xx (0) a 1 R xx (1) a 2 A =.., P = R xx (2). R xx (N) a N För den optimala prediktorn A får vi σ 2 d = R xx (0) A t P där R xx (k) =E{x n x n+k } är autokorrelationsfunktionen för x n. TSBK35 linjär prediktion p. 7/27 TSBK35 linjär prediktion p. 8/27
Prediktionsvinst Skattning av autokorrelationer Vid fin kvantisering ges distorsionen och signal-brusförhållandet approximativt av D p c σ 2 d 2 2R, SNR p =10 log 10 σ 2 x D p där σ 2 x är originalsignalens varians. Om vi istället kvantiserat originalsignalen direkt hade vi fått D o c σ 2 x 2 2R, SNR o =10 log 10 σ 2 x D o Givet en lång sekvens x 1,x 2,...,x n av testdata kan man skatta autokorrelationsfunktionen enligt I Matlab kan det skrivas R xx (k) = 1 n k x i x i+k n k mean(x(1:end-k).*x(k+1:end)) Skillnaden brukar kallas prediktionsvinst (prediction gain) SNR p SNR o =10 log 10 D o D p 10 log 10 σ 2 x σ 2 d TSBK35 linjär prediktion p. 9/27 TSBK35 linjär prediktion p. 10/27 Signaler med medelvärde Tvådimensionella prediktorer Vad gör man om signalen har ett medelvärde m 0? 1. Om signalens medelvärde är litet i förhållande till variansen kan man använda linjär prediktion som vanligt. 2. Annars kan man skapa en ny signal y n = x n m, konstruera en linjär prediktor för y n och skicka m som sidoinformation. 3. Alternativt kan man konstruera en affin prediktor p n = a i x n i + a 0 Bortsett från kvantiseringen så ger detta samma resultat som alternativ 2. Man kan naturligtvis generalisera prediktorbegreppet till att även fungera för tvådimensionella signaler, t.ex. bilder. Till exempel, om vi har en bildsignal x ij och vi vill göra en prediktion från bildpunkten till vänster om och bildpunkten ovanför den aktuella p ij = a 1 x i,j 1 + a 2 x i 1,j Den optimala prediktorn ges då av lösningen till ekvationssystemet [ ][ ] [ E{x 2 i,j 1 } E{x i,j 1 x i 1,j } a 1 E{x i,j x i,j 1 } E{x i,j 1 x i 1,j } E{x 2 i 1,j } = E{x ij x i 1,j } eller, uttryckt med autokorrelationsfunktionen [ ][ ] [ R xx (0, 0) R xx (1, 1) a 1 = R xx (1, 1) R xx (0, 0) a 2 a 2 R xx (0, 1) R xx (1, 0) ] ] TSBK35 linjär prediktion p. 11/27 TSBK35 linjär prediktion p. 12/27
Exempel, prediktiv kodning av bild Lloyd-Max-kvantisering, 8 nivåer 768 512 bildpunkter, 8 bitar/bildpunkt Datatakt: R = 3 bitar/bildpunkt Distorsion: D 60.41 PSNR: 30.32 db TSBK35 linjär prediktion p. 13/27 TSBK35 linjär prediktion p. 14/27 Prediktor Prediktionsfel Skattad akf R xx (0, 0) = σ 2 2580.9 R xx (1, 0) 0.9770 σ 2 R xx (0, 1) 0.9863 σ 2 R xx (1, 1) 0.9703 σ 2 R xx (1, 1) 0.9665 σ 2 Prediktor p ij =0.8008 ˆx i,j 1 +0.6493 ˆx i 1,j 0.4525 ˆx i 1,j 1 En åttanivåers Lloyd-Max-kvantiserare optimeras på prediktionsfelet. TSBK35 linjär prediktion p. 15/27 TSBK35 linjär prediktion p. 16/27
Avkodad bild Lloyd-Max-kvantisering, 2 nivåer Datatakt: R = 3 bitar/bildpunkt Distorsion: D 6.92 PSNR: 39.73 db (Prediktionsvinst 9.41 db) Datatakt: R = 1 bit/bildpunkt Distorsion: D 779.83 PSNR: 19.21 db TSBK35 linjär prediktion p. 17/27 TSBK35 linjär prediktion p. 18/27 Prediktionsfel Prediktion, kvantisering till 2 nivåer Datatakt: R = 1 bit/bildpunkt Distorsion: D 85.09 PSNR: 28.83 db (Prediktionsvinst 9.62 db) TSBK35 linjär prediktion p. 19/27 TSBK35 linjär prediktion p. 20/27
Exempel: hey04.wav Exempel: hey04.wav hey04.wav från lab 2 kodas med olika ordning på prediktorn. Likformig kvantisering med 256 nivåer. Diagrammet visar SNR som funktion av antalet prediktorkoefficienter. 49 hey04.wav från lab 2 kodas med olika ordning på prediktorn. Likformig kvantisering med 32 nivåer. Diagrammet visar SNR som funktion av antalet prediktorkoefficienter. 34 48 33 32 47 31 46 30 45 29 44 28 27 43 26 42 0 1 2 3 4 5 6 7 8 25 0 1 2 3 4 5 6 7 8 TSBK35 linjär prediktion p. 21/27 TSBK35 linjär prediktion p. 22/27 Exempel: hey04.wav Distorsionsfri kodning hey04.wav från lab 2 kodas med olika ordning på prediktorn. Likformig kvantisering med 4 nivåer. Diagrammet visar SNR som funktion av antalet prediktorkoefficienter. 22 20 18 16 14 12 10 Linjär prediktiv kodning kan också användas vid distorsionsfri kodning. Om vi antar att insignalen består av heltal, så måste vi se till att vår prediktor också producerar heltal. Som exempel har vi bland annat lossless JPEG, som kan använda prediktorerna 1. p ij = I i 1,j 2. p ij = I i,j 1 3. p ij = I i 1,j 1 4. p ij = I i,j 1 + I i 1,j I i 1,j 1 5. p ij = I i,j 1 +(I i 1,j I i 1,j 1 )/2 6. p ij = I i 1,j +(I i,j 1 I i 1,j 1 )/2 7. p ij = (I i,j 1 + I i 1,j )/2 8 0 1 2 3 4 5 6 7 8 TSBK35 linjär prediktion p. 23/27 TSBK35 linjär prediktion p. 24/27
Distorsionsfri kodning Ljudsignalerna i lab 1 Vi kodar vår papegojbild med prediktorn p ij = I i,j 1 + I i 1,j I i 1,j 1 och huffmankodar sen prediktionsfelet. Datatakten blir då 4.18 bitar/bildpunkt. Om vi istället använder prediktorn p ij = 0.8008 I i,j 1 +0.6493 I i 1,j 0.4525 I i 1,j 1 följt av huffmankodning blir datatakten 3.93 bitar/bildpunkt. Prediktorer av ordning 1 och 2. hey04_8bit.wav nuit04_8bit.wav p n = 0.9820 x n 1 p n = 1.2970 x n 1 0.3207 x n 2 p n = 0.9981 x n 1 p n = 1.8434 x n 1 0.8468 x n 2 speech.wav p n = 0.9507 x n 1 p n = 1.7719 x n 1 0.8639 x n 2 TSBK35 linjär prediktion p. 25/27 TSBK35 linjär prediktion p. 26/27 FLAC (Free Lossless Audio Coding) Distorsionsfri kodning av ljud Ljudsignalen delas in i block (typiskt några tusen sampel). Koda summa/skillnad av de två stereokanalerna om det ger högre kompression. Linjära prediktorer optimeras inom blocket. Det finns även möjlighet att använda fixa prediktorer (jämför med lossless JPEG). Prediktionsfelet kodas med Ricekoder (ungefär samma sak som Golombkoder). http://flac.sourceforge.net/ TSBK35 linjär prediktion p. 27/27