Prediktiv kodning

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/