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 (xn |xn−1 xn−2 . . . xn−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. pn = = a1 xn−1 + a2 xn−2 + . . . + aN xn−N = N X ai xn−i i=1 Skillnaden mellan det riktiga värdet och det predikterade värdet, prediktionsfelet, dn = xn − pn kvantiseras och skickas till mottagaren. Mottagaren rekonstruerar dn , beräknar pn och kan sen återskapa xn . 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. pn = a1 x̂n−1 + a2 x̂n−2 + . . . + aN x̂n−N = = N X ai x̂n−i i=1 Prediktionsfelet dn kvantiseras och skickas. Både kodaren och avkodaren återskapar d̂n och x̂n = pn + d̂n . Prediktiv kodare och avkodare xn + dn Q − 6 pn d̂n + + ? x̂n d̂n + + 6 pn x̂n P P Prediktiv kodare Prediktiv avkodare Optimering av prediktorn Hur ska man välja prediktorkoefficienterna ai ? Givet en datatakt R så vill vi minimera distorsionen D = E {(xn − x̂n )2 } = E {(dn − d̂n )2 } Kvantiseringen gör att det är svårt att beräkna optimala ai exakt. Om vi antar fin kvantisering, dvs att antalet kvantiseringsnivåer är stort, kan vi göra approximationen x̂n ≈ xn dvs vi räknar som om prediktionen gjordes på originalsignalen. Med fin kvantisering får vi även att D ≈ c · σd2 · 2−2R där σd2 är variansen hos prediktionsfelet och c beror av vilken typ av kvantisering vi gör och vilken fördelning dn har. Vi kan alltså minimera distorsionen genom att minimera prediktionsfelets varians. Optimering av prediktorn Prediktionsfelets varians σd2 = E {(xn − pn )2 } = = E {(xn − N X ai x̂n−i )2 } ≈ i=1 ≈ E {(xn − N X ai xn−i )2 } i=1 Derivera m.a.p. aj och sätt lika med 0, vilket ger oss N ekvationer N X ∂ 2 σd = −2 · E {(xn − ai xn−i ) · xn−j } = 0 ∂aj i=1 Matrisbeskrivning Detta kan skrivas om som matrisekvationen RA = P där R= Rxx (0) Rxx (1) .. . Rxx (1) Rxx (0) .. . Rxx (N − 1) a1 a2 A= . .. Rxx (N − 2) aN , P= Rxx (N − 1) Rxx (N − 2) ··· ··· Rxx (0) Rxx (1) Rxx (2) .. . Rxx (N) ··· ··· .. . där Rxx (k) = E {xn · xn+k } är autokorrelationsfunktionen för xn . Matrisbeskrivning Lösningen kan fås som A = R−1 P För den optimala prediktorn A får vi σd2 = Rxx (0) − At P Prediktionsvinst Vid fin kvantisering ges distorsionen och signal-brusförhållandet approximativt av Dp ≈ c · σd2 · 2−2R , SNRp = 10 · log10 σx2 Dp där σx2 är originalsignalens varians. Om vi istället kvantiserat originalsignalen direkt hade vi fått Do ≈ c · σx2 · 2−2R , SNRo = 10 · log10 σx2 Do Skillnaden brukar kallas prediktionsvinst (prediction gain) SNRp − SNRo = 10 · log10 Do σ2 ≈ 10 · log10 x2 Dp σd Skattning av autokorrelationer Givet en lång sekvens x1 , x2 , . . . , xn av testdata kan man skatta autokorrelationsfunktionen enligt n−k 1 X Rxx (k) = xi · xi+k n−k i=1 I Matlab kan det skrivas mean(x(1:end-k).*x(k+1:end)) Signaler med medelvärde Vad gör man om signalen har ett medelvärde m 6= 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 yn = xn − m, konstruera en linjär prediktor för yn och skicka m som sidoinformation. 3. Alternativt kan man konstruera en affin prediktor pn = N X ai xn−i + a0 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 xij och vi vill göra en prediktion från bildpunkten till vänster om och bildpunkten ovanför den aktuella pij = a1 · xi,j−1 + a2 · xi−1,j Den optimala prediktorn ges då av lösningen till ekvationssystemet 2 E {xi,j−1 } E {xi,j−1 · xi−1,j } a1 E {xi,j · xi,j−1 } = 2 E {xi,j−1 · xi−1,j } E {xi−1,j } a2 E {xij · xi−1,j } eller, uttryckt med autokorrelationsfunktionen Rxx (0, 0) Rxx (1, −1) a1 Rxx (0, 1) = Rxx (1, −1) Rxx (0, 0) a2 Rxx (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 Rxx (0, 0) = σ 2 ≈ 2580.9 Rxx (1, 0) ≈ 0.9770 · σ 2 Rxx (0, 1) ≈ 0.9863 · σ 2 Rxx (1, 1) ≈ 0.9703 · σ 2 Rxx (1, −1) ≈ 0.9665 · σ 2 Prediktor pij = 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. pij = Ii−1,j 2. pij = Ii,j−1 3. pij = Ii−1,j−1 4. pij = Ii,j−1 + Ii−1,j − Ii−1,j−1 5. pij = bIi,j−1 + (Ii−1,j − Ii−1,j−1 )/2c 6. pij = bIi−1,j + (Ii,j−1 − Ii−1,j−1 )/2c 7. pij = b(Ii,j−1 + Ii−1,j )/2c Distorsionsfri kodning Vi kodar vår papegojbild med prediktorn pij = Ii,j−1 + Ii−1,j − Ii−1,j−1 och huffmankodar sen prediktionsfelet. Datatakten blir då 4.18 bitar/bildpunkt. Om vi istället använder prediktorn pij = b0.8008 · Ii,j−1 + 0.6493 · Ii−1,j − 0.4525 · Ii−1,j−1 c följt av huffmankodning blir datatakten 3.93 bitar/bildpunkt. Ljudsignalerna i lab 1 Prediktorer av ordning 1 och 2. hey04_8bit.wav pn = 0.9820 · xn−1 pn = 1.2970 · xn−1 − 0.3207 · xn−2 pn = 0.9981 · xn−1 pn = 1.8434 · xn−1 − 0.8468 · xn−2 pn = 0.9507 · xn−1 pn = 1.7719 · xn−1 − 0.8639 · xn−2 nuit04_8bit.wav speech.wav 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/
© Copyright 2024