1 Kodowanie podpasmowe Kompresja Danych Streszczenie Studia Dzienne Wykład 13, 18.05.2006 1.1 Transformaty, próbkowanie i filtry Korzystamy z faktów: Każdą funkcję okresową można reprezentować w postaci nieskończonego szeregu funkcji sinusoidalnych (szeregi Fouriera): f(t) = a 0 + a n cos(nω 0 t) + b n sin(nω 0 t), n=1 n=1 gdzie ω 0 = 2π/T, a T to okres funkcji f. Co więcej, współczynniki a i, b i można wyliczyć z funkcji f. Inaczej mówiąc, funkcja f może być reprezentowana w bazie funkcji cos(nω 0 t), sin(nω 0 t) dla t = 1, 2,... Bardziej zwarta postać tej reprezentacji: f(t) = c n e inω0t, gdzie i = 1 (zamianę tych postaci uzyskujemy w oparciu o tożsamość e iφ = cos φ + i sin φ). A wartości c n wyliczamy ze wzoru c n = 1 T T 0 f(t)e inω 0t dt. Funkcję nieokresową możemy reprezentować jak powyżej w przedziale [a, b], zakładając, że jest ona okresowa, czyli poza przedziałem [a, b] zachodzi własność f(x) = f(x + T ) gdzie T = b a albo... dokładnie w bazie mocy continuum (transformata Fouriera) f(t) = 1 F (ω)e iωt dω, 2π 1
gdzie F (ω) = f(t)e iωt dt jest współczynnikiem przy funkcji e iωt. CZYLI: zbiór funkcji g(ω) = e iωt dla wszystkich ω R stanowi bazę. W praktyce kodowania mamy do czynienia nie z funkcjami ciągłymi, ale spróbkowanymi, czyli ciągami wartości o ustalonej długości N. Dla nich stosujemy rozkład na N składowych charakteryzujących cykliczność o długościach 1, 2, 3,..., N (dyskretna transformata Fouriera; DCT jest zastosowaniem dyskretnej transformaty Fouriera). Dla cyfrowej reprezentacji sygnałów analogowych kluczowe jest: Twierdzenie 1 (twierdzenie o próbkowaniu (Nyquist)). Niech f będzie funkcja, której transormata Fouriera jest równa 0 dla częstości większych niż W. Wówczas, funkcję f można odtworzyć z wartości w punktach f(i/(2w )) dla liczb całkowitych i. Inaczej mówiac, wystarczy próbkować funkcję f z częstotliwościa (2W ). Powyższy wynik ma też przydatne uogólnienie: Twierdzenie 2??? Niech f będzie funkcja, której transormata Fouriera jest równa 0 dla częstości większych niż W 1 i częstotliwości mniejszych niż W 2. Wówczas, wystarczy próbkować funkcję f z częstotliwościa (2(W 1 W 2 )). ALE NIE DLA WSZYSTKICH W 1 i W 2... Po co nam ten rozkład w dziedzinie częstotliwości (pierwsze przybliżenie)? niektóre częstotliwości nie są dostrzegane przez człowieka (np. dźwięk o częstotliwościach poniżej 20Hz i powyżej 20KHz); można je pominąć! w typowych danych dźwiękowych czy obrazach: tylko pewien zakres częstotliwości istotnie wpływa na kształt danych (odpowiadają mu duże współczynniki); jeśli chcemy reprezentować sygnał (funkcję) Porównanie idei kodowania transformującego (np. JPEG) i podpasmowego: Kodowanie transformujące: kodujemy współczynniki reprezentacji w bazie częstotliwości. Kodowanie podpasmowe: dzielimy sygnał na wiele sygnałów (pasm) powstałych przez usunięcie z sygnału składowych reprezentującyh częstotliwości spoza ustalonego zakresu. Następnie kodujemy poszczególne sygnały w oryginalnej reprezentacji (czasowej, przestrzennej) wykorzystując ich specyfikę, oraz specyfikę percepcji (ludzkiej) dla różnych częstotliwości. 2
Do rozkładu sygnału na pasma używa się filtrów. Jak działa filtr idealny : filtr dolnoprzepustowy: usuwa składowe o częstotliwościach powyżej W. filtr górnoprzepustowy: usuwa składowe o częstotliwościach poniżej W. filtr środkowoprzepustowy: usuwa składowe o częstotliwościach spoza przedziału [W 1, W 2 ]. Filtry rzeczywiste charakteryzujemy poprzez funkcję odwzorowującą w jakim stopniu składowe o poszczególnych częstotliwościach są przenoszone. Są to zazwyczaj funkcje ciągłe, które przenoszą również (w mniejszym stopniu) składowe o częstotliwościach które powinny być usunięte; redukują (częściowo) siłę sygnału o częstotliwościach, które powinny być przenoszone. Fakty wykorzystywane przy kodowaniu poszczególnych pasm: twierdzenie o próbkowaniu: pozwala na dziesiątkowanie (rozrzedzanie) ciągu danych; różnice w słyszalności dla różnych częstotliwości; logarytmiczna skala rozróżnialności głośności (siły sygnału); maskowanie w bazie częstotliwości: silny dźwięk o pewnej częstotliwości maskuje dźwięki o innych częstotliwościach występujące w tym samym momencie maskowanie w czasie: silny sygnał o częstotliwości f w momencie t powoduje niesłyszalność innych sygnałów w pewnym przedziale czasowym wokół t i podobnych częstotliwościach. Na czym polega dziesiątkowanie (przykład): dany jest sygnał f spróbkowany z częstotliwością W ; użyliśmy filtru, który usunął z sygnału częstotliwości większe od V dla V takiego, że V < W/2 i dla i > 1; uzyskaliśmy sygnał g; wobec tego do odtworzenia sygnału wystarczy próbkowanie go z częstością 2V < W/2 i 1 dla i > 1; czyli wystarczy pozostawić jedną (np. pierwszą) z każdych kolejnych 2 i 1 wartości sygnału g. 3
Po co jeszcze potrzebujemy filtrów: przy próbkowaniu sygnału z częstotliwością 2W, jego składowe o częstotliwościach większych od W powodują zniekształcenia zwane aliasingiem. aliasing polega na tym, że sygnał o zbyt dużej częstotliwości odtwarzany jest jako sygnał o częstotliwości mniejszej (p. cofające się koła w samochodach). dlatego: zazwyczaj przed kodowaniem usuwa się (za pomocą odpowiedniego filtru) z sygnału składowe o częstotliwościach większych od połowy częstotliwości prókowania. powyższy krok nazywany jest anty-liasingiem. 1.2 Kodowanie podpasmowe Ogólny schemat kodowania podpasmowego: 1. Wybierz zbiór filtrów. 2. Używając filtrów, rozłóż sygnał wejściowy na sygnały podpasm. 3. rozrzedzanie (dziesiątkowanie) sygnałów (jeśli częstotliwość większa od tej która wystarcza do odtworzenia rozważanych częstotliwości, wybieramy tylko co p-tą próbkę) 4. kwantyzacja sygnałów, lub kodowanie różnicowe i kwantyzacja: niektóre sygnały mogą być mniej zauważalne (np. te o większych częstotliwościach): stosujemy dla nich mniej dokładną kwantyzację; wynikowe sygnały mogą mieć różne własności statystyczne: możemy każdy z nich inaczej kodować; efekt maskowania: niektóre składowe możemy pomijać w określonych przedziałach. 5. kodowanie wynikowych sygnałów. Uwaga: w praktyce metodę powyższą stosujemy osobno dla kolejnych bloków danych o ustalonej długości; w metodach adaptacyjnych pewne parametry dla kolejnych bloków są ustalane na podstawie bloków poprzednich. UWAGA: gdyby filtry działały idealnie (usuwały częstotliwości spoza ustalonego przedziału i przenosiły bez zmian pozostałe częstotliwości), dekodowanie mogłoby polegać jedynie na odtworzeniu poszczególnych podpasm i zsumowaniu ich. Ogólny schemat dekodowania: 4
1. dekodowanie poszczególnych ciągów skwantyzowanych (algorytm bezstratny); 2. odtworzenie wartości (przybliżonych) poszczególnych podpasm (dekodowanie DPCM lub dekodowanie odpowiedniego algorytmu kwantyzacji); 3. zagęszczenie (uzupełnienie ciągów zerami) tak, aby uzyskać częstotliwość ciągu wejściowego; 4. zastosowanie filtrów syntezujących (odpowiednio dopasowanych do filtrów stosowanych w trakcie kodowania). 1.3 Jak wygladaj a filtry? (spróbkowany) sygnał x 1, x 2,... (wejścia) jest przekształcany przez filtr na sygnał y 1, y 2,... wg reguły N M y n = a i x n i + b i y n i gdzie wartości {a i } i {b i } nazywane są współczynnikami filtra. Podział filtrów: i=0 FIR (finite impulse filters): współczynniki {b i } są zerowe, czyli wyjście zależy tylko od wejścia; i=1 IIR (infinite impulse filters): {b i } nie są zerowe. Reakcja impulsowa filtra nazywamy ciąg h 1, h 2,... uzyskamy w wyniku zastosowania filtra do sygnału 1, 0, 0,... czyli x 1 = 1 i x i = 0 dla i > 1. Fakt 1 Reakcja impulsowa jednoznacznie definiuje filtr wg wzoru: M y n = h k x n k, k=0 gdzie M jest ustalona stała dla FIR oraz M = dla IIR (można przyjać, że x i = 0 dla i 0). Przykład... czyli jak to się dzieje, że filtr zdefiniowany jako funkcja liniowa wycina wybrane częstotliwości. Dany ciąg x 1,..., x 12 : Użyjemy dwóch filtrów: 10 14 10 12 14 8 14 12 10 8 10 12 5
y n = (x n + x n 1 )/2, czyli filtr o reakcji impulsowej 0.5, 0.5, 0, 0,..., inaczej h 0 = h 1 = 0.5 oraz h i = 0 dla pozostałych wartości i; z n = (x n x n 1 )/2, czyli filtr o reakcji impulsowej 0.5, 0.5, 0, 0,..., inaczej h 0 = 1, h 1 = 1, h i = 0 dla pozostałych wartości i. Obserwacje: do odtworzenia ciągu {x i } nie potrzebujemy nieparzystych wartości z ciągów {y i } i {z i }, ponieważ: y 2n + z 2n = x 2n y 2n z 2n = x 2n 1 (uzyskaliśmy to dzięki odpowiedniemu dopasowaniu do siebie filtrów y i z); ciąg {y i } wygląda następująco: a ciąg {z i } tak: 10 12 12 11 13 11 11 13 11 10 9 11 10 2 0 1 2 2 0 2 2 1 1 2 czyli {y n } to ciąg bardziej gładki od x n (można np. zastosować DPCM), a {z n } to ciąg o małym zakresie wartości (kwantyzacja skalarna dla oryginalnych wartości da niewielki błąd). Obserwacji c.d.: filtr y n jest filtrem dolnoprzepustowym (zachowuje niskie częstości), z n jest filtrem górnoprzepustowym (zachowuje wysokie częstości). eksperyment potwierdzający rolę filtrów y n i z n : efekt ich działania na ciągach 1, 1, 1,... (stałym) i 1, 1, 1, 1,... (ciąg o okresie częstości dwukrotnie mniejszej od częstości próbkowania). Jak wygląda filtr odwrotny (syntezujący)? dane są ciągi {y i } oraz {z i } takie, że y i = (x 2i + x 2i 1 )/2 oraz z i = (x 2i x 2i 1 )/2; jak odtworzyć ciąg {x i }? przypomnijmy wzory: x 2i = y i + z i oraz x 2i 1 = y i z i ; jeśli ciągi y i i z i przepleciemy : y 1, z 1, y 2, z 2,... i oznaczymy wynikowy ciąg przez {v i } to: x 2i = v 2i 1 + v 2i oraz x 2i 1 = v 2i 1 v 2i 6
czyli ciąg..., x 0, x 2, x 4, x 6,... uzyskamy poprzez zastosowanie do ciągu {v i }: filtra f o współczynnikach h 0 = h 1 = 1 (i h i = 0 dla pozostałych i) oraz usunięciu co drugiego elementu; ORAZ filtra g o współczynnikach h 0 = 1 i h 1 = 1; przeplecenie parzystych elementów z ciągów wyjściowych filtrów f i g. 1.4 Filtry bardziej ogólnie... Filtr (zdefiniowany przez współczynniki h i ) jako nieskończona transformata o macierzy H: macierz transformaty: wiersz 0 zawiera współczynniki h i (h i w i-tej kolumnie dla wszystkich całkowitych i); wiersz j to przesunięcie o j w prawo wiersza 0; wtedy iloczyn takiej macierzy przez wektor danych x da wynik zastosowania filtra y. Pytanie: kiedy filtrowanie jest operacją odwracalną?? Tylko gdy Hx = 0 x = 0. Czyli tylko dla nieciekawych filtrów. DF.A. Niech {g i } i {f i } to para filtrów taka, że wystarczy brać parzyste elementy z obu ciągów wynikowych (żeby odtworzyć ciąg wejściowy): niech (nieskończone) macierze G i F reprezentują oba filtry; wtedy przekształcenie przez nie zdefiniowane odpowiada: usunięciu nieparzystych wierszy z obu macierzy; przeplatamy wiersze parzyste. w powyższy sposób uzyskujemy macierz H, która definiuje przekształcenie dające w wyniku ciągi wynikowe obu filtrów f i g. Obserwacja: każdy wiersz macierzy przekształcenia definiującego filtr FIR (ze stałą liczbą niezerowych wartości h i ) ma skończoną liczbę wartości niezerowych. Przypomnienie: macierz (nieskończoną) A nazywamy ortonormalną gdy AA T = I. Twierdzenie 3 Jeśli macierz przekształcenia H odpowiadajacego parze filtrów {f i } i {g i } jest ortonormalna, a także ortonormalna jest macierz H T to przekształcenie to pozwoli odtworzyć sygnał wejściowy. 7
Jak to udowodnić: analogia do transformat. Wniosek: mamy już jakieś kryterium dla oceny, czy podana para filtrów jest dobra (pozwala odtworzyć sygnał). A teraz podamy konkretną metodę tworzenia filtra do pary. Twierdzenie 4 Niech h (zdefiniowany przez współczynniki {h i }) będzie filtrem spełniajacym warunek h i h i+2k = σ k gdzie σ k = 0 dla k 0 i σ 0 = 1 (p. ortonormalność). Niech g będzie filtrem zdefiniowanym przez następujace współczynniki i g k = ( 1) k h 1 k. Wtedy h i g tworza ortonormalny bank filtrów, co w szczególności oznacza, że sa para filtrów pozwalajac a odtworzyć sygnał oryginalny, za pomoca macierzy będac a transpozycja macierzy utworzonej wg DF.A. A jak tworzyć większe (nie dwu-elementowe) banki filtrów?... tym nie zajmiemy się, ale do kompresji falkowej wystarczą nam takie banki dwu-elementowe. 8