Kodowanie i kompresja 1 Kompresja stratna 2 Kwantyzacja skalarna
Kodowanie i kompresja 1 Kompresja stratna 2 Kwantyzacja skalarna
Kodowanie i kompresja 1 Kompresja stratna 2 Kwantyzacja skalarna
You also want an ePaper? Increase the reach of your titles
YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.
1 <strong>Kompresja</strong> <strong>stratna</strong><br />
<strong>Kodowanie</strong> i <strong>kompresja</strong><br />
Streszczenie<br />
Studia dzienne<br />
Wykład 12, 5.05.2005<br />
Algorytmy kompresji bezstratnej oceniane są ze względu na:<br />
• stopień kompresji;<br />
• czas działania procesu kodowania i dekodowania.<br />
W przypadku kompresji stratnej istotnym aspektem jest również stopień zniekształceń.<br />
Proste miary zniekształceń:<br />
• kwadratowa miara błędu: d(x, y) = (x − y) 2<br />
• błąd średniokwadratowy:<br />
σ 2 = σ 2 x,y = 1 N<br />
N∑<br />
(x n − y n ) 2 ,<br />
n=1<br />
gdzie x to dane oryginalne a y to dane zakodowane.<br />
• stosunek sygnału do szumu:<br />
SNR = σ2 x<br />
σ 2 x,y<br />
• stosunek sygnału do szumu w skali logarytmicznej:<br />
SNR(dB) = 10 log 10<br />
Algorytmy kompresji stratnej wykorzystują również specyfikę percepcji wzrokowej (dla<br />
obrazów i danych wideo) i słuchowej (dla danych dźwiękowych).<br />
σ 2 x<br />
σ 2 x,y<br />
2 <strong>Kwantyzacja</strong> <strong>skalarna</strong><br />
<strong>Kwantyzacja</strong> polega na reprezentowaniu dużego zbioru wartości (być może nieskończonego)<br />
za pomocą wartości ze zbioru mniejszego. Chcemy osiągnąć dwa przeciwstawne<br />
cele:<br />
1
• maksymalizacja stopnia kompresji;<br />
• minimalizacja zniekształceń.<br />
<strong>Kwantyzacja</strong> <strong>skalarna</strong>: każda wartość w ciągu kwantyzowana osobno.<br />
Kwantyzator:<br />
• odwzorowanie kodujące:<br />
– podział zbioru wartości danych wejściowych na ustaloną liczbę podprzedziałów,<br />
przyporządkowanie przedziałom słów kodowych<br />
– każda wartość wejściowa reprezentowana jest przez słowo kodowe przedziału,<br />
do którego należy.<br />
• odwzorowanie dekodujące:<br />
Pojęcia:<br />
– każdemu słowu kodowemu przyporządkowujemy wartość rekonstrukcji (z<br />
przedziału, który koduje to słowo)<br />
– każde słowo kodowe w ciągu skompresowanym jest odtwarzane przy pomocy<br />
przypisanej mu wartości rekonstrukcji.<br />
• granice decyzyjne: końce przedziałów (gdy M przedziałów, potrzeba M + 1 granic<br />
decyzyjnych);<br />
• poziomy rekonstrukcji: wartości przyporządkowane przedziałom (M wartości dla<br />
M przedziałów); dla przedziałów nieskończonych dopuszczamy wartości ±∞.<br />
Miary jakości kwantyzatora:<br />
• średniokwadratowy błąd kwantyzacji σ 2 q: jak najmniejszy przy ustalonej (maksymalnej)<br />
średniej długości słowa kodowego.<br />
• (średnia) długość słowa kodowego: jak najmniejsza przy ustalonej maksymalnej<br />
wartości σ 2 q.<br />
Niech {b i } M i=0 to granice decyzyjne, a {y i } M i=1 to poziomy rekonstrukcji a f X to funkcja<br />
rozkładu prawdopodobieństwa danych wejściowych. Operację kwantyzacji definiujemy<br />
jako:<br />
Q(x) = y i ⇐⇒ b i−1 < x ≤ b i .<br />
Średniokwadratowy błąd kwantyzacji jest równy:<br />
σ 2 q =<br />
∫ ∞<br />
−∞<br />
(x − Q(x)) 2 f X (x)dx =<br />
2<br />
M∑<br />
i=1<br />
∫ bi<br />
b i−1<br />
(x − y i ) 2 f X (x)dx.
A średnia długość słowa kodowego to<br />
M∑<br />
∫ bi<br />
R = l i f X (x)dx,<br />
i=1<br />
b i−1<br />
gdzie l i to długość słowa kodowego odpowiadającego i-temu przedziałowi (i-tej wartości<br />
rekonstrukcji).<br />
UWAGA: przy słowach kodowych o zmiennej długości wartość ta zależy nie tylko od<br />
liczby przedziałów.<br />
2.1 Kwantyzator równomierny<br />
Założenia: wszystkie przedziały tej samej długości (za wyjątkiem, ewentualnie, skrajnych),<br />
poziomy rekonstrukcji to środki przedziałów.<br />
Kwantyzator stały w zerze i ze skokiem w zerze.<br />
<strong>Kwantyzacja</strong> dla rozkładu jednostajnego Założenia: rozkład danych jednostajny w<br />
przedziale [−X max , X max ], kwantyzator ma M poziomów.<br />
Wówczas wielkość przedziału to<br />
δ = 2X max<br />
M<br />
a błąd średniokwadratowy (“zniekształcenie”)<br />
σ 2 q = 2<br />
M/2<br />
∑<br />
i=1<br />
∫ iδ<br />
(i−1)δ<br />
(<br />
x − 2i − 1<br />
2<br />
) 2 1<br />
δ dx = δ2<br />
2X max 12 .<br />
UWAGA: dla rozkładu jednostajnego i kwantyzatora równomiernego optymalne są słowa<br />
kodowe o stałej długości (z dokładnością do możliwości zaoszczędzenia jednego bitu<br />
na niektórych słowach – patrz kody stałe dla kodowania arytmetycznego).<br />
<strong>Kwantyzacja</strong> dla rozkładu niejednostajnego Założenie: rozkład danych w przedziale<br />
nieograniczonym (przyjmujemy często, że symetryczny względem zera).<br />
Cel: dla ustalonej liczby przedziałów M wyznaczyć optymalną wielkość przedziałów<br />
(wszystkie przedziały za wyjątkiem skrajnych mają równą długość; skrajne nieograniczone<br />
z lewej/prawej).<br />
Błąd średniokwadratowy dla symetrycznej funkcji rozkładu f X wyliczamy jako<br />
σ 2 q = 2<br />
M/2−1<br />
∑<br />
i=1<br />
∫ iδ (<br />
x − 2i − 1 2<br />
δ)<br />
f X (x)dx<br />
(i−1)δ 2<br />
3
∫ ∞ (<br />
+2 x − M − 1 2<br />
δ)<br />
f X (x)dx.<br />
(M/2−1)δ 2<br />
Wartość optymalną wyznacza się przez znalezienie miejsc zerowych pochodnej powyższego<br />
wyrażenia, w praktyce często przy pomocy metod numerycznych.<br />
2.2 <strong>Kwantyzacja</strong> adaptacyjna<br />
<strong>Kwantyzacja</strong> adaptacyjna w przód (off-line) : dane dzielone na bloki, dla każdego<br />
bloku parametry kwantyzacji dobierane są po wcześniejszej analizie i przesyłane wraz<br />
ze skwantyzowanymi danymi.<br />
<strong>Kwantyzacja</strong> adaptacyjna w tył (on-line) : parametry kwantyzatora modyfikowane<br />
w oparciu o już zakodowane dane.<br />
Krokiem kwantyzacji nazywamy wielkość przedziału przy kwantyzacji jednostajnej.<br />
Idea kwantyzatora Jayanta (liczba przedziałów ustalona, celem optymalny dobór kroku<br />
kwantyzacji; rozkład jest symetryczny i nieskończony):<br />
• jeżeli kolejna wartość wejściowa trafia do przedziałów wewnętrznych, należy<br />
zwiększyć krok kwantyzacji, w przeciwnym razie należy zmniejszyć krok kwantyzacji<br />
• dobór parametrów zwiększania/zmniejszania powinien „stabilizować” krok kwantyzacji<br />
po dopasowaniu do rzeczywistego rozkładu danych.<br />
Generalnie, krok kwantyzacji przy kodowaniu n-tej wartości wejściowej wynosi<br />
δ n = w f(n−1) δ n−1 ,<br />
gdzie δ n−1 to krok dla (n − 1)-szej wartości, f(n − 1) to numer przedziału, do którego<br />
wpada wartość (n − 1)sza, a w 1 , . . . , w M to ustalone współczynniki.<br />
Wartości w 1 , . . . , w M dobieramy tak, że przedziałom bliskim zera odpowiadają wartości<br />
mniejsze od 1 a przedziałom zewnętrznym wartości większe od 1.<br />
Skuteczność kwantyzatora Jayanta: zależna od doboru δ 1 i parametrów w 1 , . . . , w M .<br />
Sposób doboru współczynników w 1 , . . . , w M (przy założeniu, że dane ze stacjonarnego<br />
procesu losowego):<br />
• gdy kwantyzator „pasuje” do danych wejściowych, zwiększanie i zmniejszanie<br />
kroku powinny się znosić:<br />
Π M k=0w n k<br />
k = 1,<br />
gdzie n k to liczba elementów, które trafiają do k-tego przedziału.<br />
4
• po obliczeniu pierwiastka N-tego stopnia, gdzie N to liczba elementów w danych<br />
wejściowych:<br />
Π M k=0w P k<br />
k = 1,<br />
gdzie P k = n k /N.<br />
• ograniczenie zbioru rozwiązań:<br />
w k = γ l k<br />
,<br />
gdzie γ > 1 to ustalony parametr (określający szybkość adaptacji/stabilność), a<br />
l k to liczba całkowita. Uzyskujemy wtedy warunek ∑ M<br />
k=0 l k P k = 0<br />
Zasada: dobre kwantyzatory szybciej się rozszerzają niż kurczą (ze względu na nieograniczony<br />
błąd w przedziałach zewnętrznych).<br />
2.3 <strong>Kwantyzacja</strong> nierównomierna<br />
Zasada: przedziały kwantyzacji nie muszą mieć tej samej długości.<br />
Analogia do kodów o zmiennej długości:<br />
symbole o większym prawdopodobieństwie mają krótsze słowa kodowe ↔ w obszarach<br />
o większym prawdopodobieństwie stosujemy mniejsze przedziały.<br />
<strong>Kwantyzacja</strong> optymalizowana ze względu na rozkład : gdy znany jest rozkład prawodpodobieństwa<br />
danych.<br />
Cel: dla znanej funkcji rozkładu prawdopodobieństwa f X i ustalonej liczby przedziałów<br />
M należy dobrać granice decyzyjne {b i } M i=0 i poziomy rekonstrukcji {y i } M i=1, tak aby<br />
zminimalizować<br />
M∑<br />
∫ bi<br />
(x − y i ) 2 f X (x)dx.<br />
b i−1<br />
i=1<br />
Szukając miejsc zerowych pochodnej względem y j w przedziale [b j−1 , b j ] uzyskujemy<br />
rozwiązanie:<br />
∫ bj<br />
b<br />
y j =<br />
j−1<br />
xf X (x)dx<br />
∫ bj<br />
b j−1<br />
f X (x)dx<br />
Z kolei miejsca zerowe pochodnej względem b j to:<br />
b j = y j+1 + y j<br />
.<br />
2<br />
Iteracyjne poszukiwanie rozwiązań powyższych równań (algorytm Lloyda-Maxa):<br />
5
1. Założenie: funkcja rozkładu prawdopodobieństwa jest symetryczna, projektujemy<br />
kwantyzator ze skokiem w zerze (czyli 0 ma być końcem przedziału), liczba<br />
przedziałów równa jest M.<br />
2. Ze względu na symetrię, indeksujemy: y −M/2 , . . . , y −1 , y 1 , . . . , y M/2 , oraz b −(M/2−1) , . . . , b −1 ,<br />
b 0 = 0, b 1 , . . . , b M/2−1 . Wyznaczać będziemy tylko wartości z dodatnimi indeksami,<br />
ponieważ y −j = y j i b −j = b j .<br />
3. Przyjmujemy b 0 = 0, y 1 -dowolne.<br />
4. Dla j = 2, . . . , M/2:<br />
(a) wyznaczamy b j−1 z równania jednej zmiennej<br />
y j =<br />
∫ bj<br />
b j−1<br />
xf X (x)dx<br />
∫ bj<br />
b j−1<br />
f X (x)dx<br />
(b) wyznaczamy y j := 2b j−1 + y j−1<br />
5. wyznaczamy b M/2 na podstawie danych wejściowych (np. jako maksymalną wartość<br />
wejściową)<br />
6. jeśli różnica między wyliczoną w powyższy sposób wartością y M/2 a wyrażeniem<br />
∫ bM/2<br />
b M/2−1<br />
xf X (x)dx<br />
∫ bM/2<br />
b M/2−1<br />
f X (x)dx<br />
jest mniejsza od przyjętej wartości błędu, kończymy obliczenia. W przeciwnym<br />
razie zwiększamy y 1 (gdy powyższa różnica ujemna) lub zmiejszamy y 1 (gdy<br />
powyższa różnica dodatnia) i przechodzimy do punktu 4.<br />
Niektóre dowodliwe własności kwantyzatora Lloyda-Maxa:<br />
• wartość średnia danych wejściowych jest równa wartości średniej danych wyjściowych;<br />
• wariancja danych wyjściowych jest mniejsza lub równa wariancji danych wejściwowych.<br />
Problem w zastosowaniach praktycznych (np. kwantyzacja mowy): rozkład danych<br />
zmienia się w czasie. Rozwiązanie: adaptacyjna wersja powyższej metody.<br />
6
2.4 <strong>Kwantyzacja</strong> z kompanderem<br />
Idea: zamiast stosować przedziały o różnych długościach (kwantyzacja nierównomierna),<br />
przekształcamy dane wejściowe funkcją (kompresorem) dającą (w miarę) jednostajny<br />
rozkład. Dekodowanie wymaga wówczas zastosowania funkcji odwrotnej (ekspandera).<br />
Metoda ta stosowana jest w telefonii.<br />
Całka Bennnetta: sposób konstrukcji kompresora/ekspandera, nie wymagający znajomości<br />
funkcji rozkładu prawdopodobieństwa (przy pewnych upraszczających założeniach).<br />
2.5 Optymalizacja średniej długości słowa kodowego<br />
Zadanie: dla ustalonej liczby przedziałów M, mamy ustalić granice decyzyjne, poziomy<br />
rekonstrukcji i słowa kodowe dla poziomów rekonstrucji tak, aby uzyskać jak najmniejsze<br />
zniekształcenie (błąd średniokwadratowy) i jak najmniejszą średnią długość słowa<br />
kodowego: Podejścia:<br />
1. jednoczesny dobór wszystkich parametrów – trudne;<br />
2. słowa kodowe o stałej długości, algorytm dobiera granice decyzyjne i poziomy<br />
rekonstrukcji – średnia długość słowa kodowego to ⌈log M⌉, nie jest optymalizowana;<br />
3. najpierw dobór granice decyzyjnych i poziomów rekonstrukcji, potem słów kodowych:<br />
• tworzymy kwantyzator minimalizujący zniekształcenia (np. algorytm Lloyda-<br />
Maxa)<br />
• wartości wyjściowe kwantyzatora traktujemy jak ciąg wartości niezależnych<br />
o prawdopodobieństwach równych prawdopodobieństwom poszczególnych<br />
przedziałów – stosujemy dla nich kodowanie dla ciągów niezależnych (np.<br />
Huffmana, arytmetyczne).<br />
3 <strong>Kwantyzacja</strong> wektorowa<br />
<strong>Kwantyzacja</strong> wektorowa: dane dzielone na bloki (wektory), każdy blok kwantyzowany<br />
jako jeden element danych.<br />
Ogólny schemat kwantyzacji wektorowej dla L-wymiarowych wektorów:<br />
• ustalamy M wektorów L-wymiarowych jako wartości rekonstrukcji, nazywanych<br />
też wektorami kodowymi; każdemu z wektorów kodowych przyporządkowujemy<br />
indeks w tablicy tych wektorów, zwanej słownikiem;<br />
7
• dane dzielimy na bloki o długości L;<br />
• dla każdego bloku danych znajdujemy najbliższy mu wektor kodowy i on staje<br />
się skwantyzowaną wartością tego bloku.<br />
Miary jakości kwantyzatora wektorowego:<br />
• (średniokwadratowy) błąd kwantyzacji σ 2 q, w którym odległość między wektorami<br />
X = (x 1 . . . x L ) i Y = (y 1 . . . y L ) to ‖X − Y ‖; gdzie ‖X‖ 2 = ∑ L<br />
i=1 x 2 i .<br />
• (średnia) liczba bitów na próbkę: równa<br />
L rozmiar kwantyzowanych wektorów.<br />
⌈log K⌉<br />
, gdzie K to rozmiar słownika, a<br />
L<br />
Poglądowe przykłady przewagi kwantyzacji wektorowej nad skalarną:<br />
• dane skorelowane (np. pary (wzrost,waga));<br />
• dane nieskorelowane: wartości odwzorowane na konkretny wektor kodowy nie<br />
musza˛<br />
być zdefiniowane w postaci przedziałów („prostopadłościanów”).<br />
Algorytm Lindego-Buzo-Graya (LBG) Dane: zbiór wektorów uczących {X n } N n=1,<br />
próg błędu ε, M – liczba wektorów kodowych takie, że N ≫ M.<br />
Cel: minimalizacja średniej odległości między wektorem uczącym a reprezentującym<br />
go wektorem kodowym.<br />
1. Wybierz dowolnie zbiór wektorów kodowych {Y (0)<br />
i } M i=1. Niech k = 0, D (0) = 0.<br />
2. Określ obszary kwantyzacji V 1 , . . . , V M w następujący sposób:<br />
V (k)<br />
i<br />
Załóżmy, że V (k)<br />
i<br />
= {X n | d(X n , Y (k)<br />
i ) < d(X n , Y (k)<br />
j ) dla każd. j ≠ i}<br />
≠ ∅ dla każdego i ∈ [1, M].<br />
3. Oblicz średnią odległość między wektorami uczącymi a odpowiadającymi im<br />
wektorami kodowymi<br />
D (k) = 1 N<br />
M∑<br />
i=1<br />
∑<br />
X j ∈V (k)<br />
i<br />
d(X j , Y (k)<br />
i ).<br />
4. Jeśli D(k) −D (k−1)<br />
D (k)<br />
< ε, zakończ obliczenia.<br />
5. niech nowe wektory kodowe to średnie wartości obszarów kwantyzacji:<br />
Y (k+1)<br />
j = 1<br />
|V (k)<br />
j |<br />
∑<br />
X i ∈V (k)<br />
j<br />
X i dla j ∈ [1, M].<br />
8
6. Niech k := k + 1, przejdź do kroku 2<br />
Problemy techniczne w algorytmie LBG:<br />
• Wybór początkowych wektorów kodowych.<br />
Technika podziałów: zaczynamy z jednym początkowym wektorem kodowym,<br />
po zastosowaniu algorytmu LBG dołączamy drugi wektor, uzyskany z pierwszego<br />
przez dodanie ustalonego „wektora zaburzeń” γ. Mając 2 i wektorów kodowych,<br />
stosujemy LBG i uzyskujemy 2 i+1 wektorów przez dodanie zaburzenia do każdego<br />
z wynikowych wektorów kodowych.<br />
Algorytm par najbliższych sąsiadów (PNN): zaczynamy ze zbiorem wektorów<br />
kodowych równym zbiorowi uczącemu. W każdym kroku (aż do uzyskania M<br />
wektorów) wybieramy 2 najbliższe wektory kodowe i zastępujemy je ich średnią<br />
i stosujemy algorytm LBG.<br />
• Problem pustych obszarów kwantyzacji.<br />
Metoda: usuwamy wektor kodowy odpowiadający pustemu obszarowi kwantyzacji,<br />
zastępujemy go losowo wybranym wektorem uczącym z obszaru kwantyzacji,<br />
który zawiera najwięcej wektorów.<br />
Typowe zastosowanie: <strong>kompresja</strong> obrazów (wektory to bloki rozmiaru n×m, co umożliwia<br />
wykorzystanie korelacji poziomych i pionowyc); ograniczeniem jest wzrost rozmiaru<br />
słownika i dobór słownika (statyczny czy projektowany dla każdego obrazka<br />
osobno, co wymaga dołączenia słownika do danych).<br />
3.1 Kwantyzatory o strukturze drzewiastej<br />
Idea: chcemy zmniejszyć liczbę porównań potrzebną do ustalenia obszaru kwantyzacji,<br />
do którego należy dany wektor.<br />
Metoda: tworzymy zbalansowane drzewo binarne, w każdym węźle umieszczamy wektor,<br />
w liściach wektory kodowe; dla ustalenia obszaru kwantyzacji danego wektora Z, w<br />
każdym kroku przechodzimy do tego dziecka aktualnego wierzchołka w drzewie, który<br />
znajduje się bliżej Z (zaczynając od korzenia).<br />
Cechy:<br />
• czas znalezienia obszaru kwantyzacji dla danego wektora redukuje się z M do<br />
⌈2 log M⌉;<br />
• wzrost zniekształceń: podział na obszary kwantyzacji nie zawsze przyparządkowuje<br />
wektor do obszaru o najbliższym mu wektorze kodowym;<br />
• wzrost pamięci: oprócz wektorów kodowych, potrzeba M −1 wektorów w wierzchołkach<br />
wewnętrznych.<br />
9
Ogólna metoda tworzenia kwantyzatora drzewiastego o głębokości k dla zbioru wektorów<br />
X :<br />
• jeśli k = 0: utwórz kwantyzator z jednym wektorem kodowym równym średniej<br />
z wektorów z X ;<br />
• wybieramy dwa początkowe wektory kodowe: średnią S z wektorów ze zbioru X<br />
i wektor otrzymany z S przez dodanie zaburzenia;<br />
• tworzymy kwantyzator z dwoma wektorami kodowymi (stosując np. algorytm<br />
LBG) Y 1 , Y 2 ;<br />
• dzielimy X na X 1 , X 2 takie, że X 1 składa się z wektorów uczących bliższych Y 1<br />
a X 2 składa się z wektorów uczących bliższych Y 2<br />
• tworzymy (osobno!) kwantyzatory o głębokości k − 1 dla zbiorów X 1 i X 2 .<br />
Modyfikacje: „przycinanie” – usuwanie obszarów kwantyzacji, do których należy najmniej<br />
wektorów uczących (zmniejszanie średniej długości słowa kodowego kosztem<br />
wzrostu zniekształceń).<br />
10