Prediktiv kodning 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.
Linjär prediktion 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 = N = a i x n i i=1 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.
Linjär prediktion 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 = N = a i ˆx n i i=1 Prediktionsfelet d n kvantiseras och skickas. Både kodaren och avkodaren återskapar ˆd n och ˆx n = p n + ˆd n.
Prediktiv kodare och avkodare x n + d n ˆd n Q + p + n ˆd n + + p n P ˆx n P ˆx n Prediktiv kodare Prediktiv avkodare
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.
Optimering av prediktorn Prediktionsfelets varians σd 2 = E{(x n p n ) 2 } = N = E{(x n a i ˆx n i ) 2 } E{(x n i=1 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 i=1 N a i x n i ) x n j } = 0 i=1
Matrisbeskrivning Detta kan skrivas om som matrisekvationen där A = RA = P R xx (0) R xx (1) R xx (N 1) R xx (1) R xx (0) R xx (N 2) R =..... R xx (N 1) R xx (N 2) R xx (0) a 1 R xx (1) a 2 R xx (2). a N, P =. R xx (N) där R xx (k) = E{x n x n+k } är autokorrelationsfunktionen för x n.
Matrisbeskrivning Lösningen kan fås som A = R 1 P För den optimala prediktorn A får vi σ 2 d = R xx (0) A t P
Prediktionsvinst 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 Skillnaden brukar kallas prediktionsvinst (prediction gain) SNR p SNR o = 10 log 10 D o D p 10 log 10 σ 2 x σ 2 d
Skattning av autokorrelationer 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 i=1 mean(x(1:end-k).*x(k+1:end))
Signaler med medelvärde 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 = N a i x n i + a 0 i=1 Bortsett från kvantiseringen så ger detta samma resultat som alternativ 2.
Tvådimensionella prediktorer 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{xi,j 1 2 } E{x ] [ ] [ i,j 1 x i 1,j } a1 E{xi,j x E{x i,j 1 x i 1,j } E{x 2 = i,j 1 } E{x ij x i 1,j } i 1,j } a 2 ] eller, uttryckt med autokorrelationsfunktionen [ ] [ ] Rxx (0, 0) R xx (1, 1) a1 = R xx (1, 1) R xx (0, 0) a 2 [ Rxx (0, 1) R xx (1, 0) ]
Exempel, prediktiv kodning av bild 768 512 bildpunkter, 8 bitar/bildpunkt
Lloyd-Max-kvantisering, 8 nivåer Datatakt: R = 3 bitar/bildpunkt Distorsion: D 59.02 PSNR: 30.42 db
Prediktor 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.
Prediktionsfel, 8 nivåer
Kvantiserat prediktionsfel, 8 nivåer
Avkodad bild, 8 nivåer Datatakt: R = 3 bitar/bildpunkt Distorsion: D 5.62 PSNR: 40.63 db (Prediktionsvinst 10.21 db)
Lloyd-Max-kvantisering, 2 nivåer Datatakt: R = 1 bit/bildpunkt Distorsion: D 735.77 PSNR: 19.46 db
Prediktionsfel, 2 nivåer
Kvantiserat prediktionsfel, 2 nivåer
Avkodad bild, 2 nivåer Datatakt: R = 1 bit/bildpunkt Distorsion: D 84.81 PSNR: 28.85 db (Prediktionsvinst 9.39 db)
Exempel: hey04.wav Filen 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 48 47 46 45 44 43 42 0 1 2 3 4 5 6 7 8
Exempel: hey04.wav Filen 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 33 32 31 30 29 28 27 26 25 0 1 2 3 4 5 6 7 8
Exempel: hey04.wav Filen 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 8 0 1 2 3 4 5 6 7 8
Distorsionsfri kodning 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
Distorsionsfri kodning 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.
Ljudsignalerna i lab 1 Prediktorer av ordning 1 och 2. hey04_8bit.wav p n = 0.9820 x n 1 p n = 1.2970 x n 1 0.3207 x n 2 nuit04_8bit.wav 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
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). https://xiph.org/flac/