Łódź, październik 003 Marcin Cegielski Instytut Informatyki Politechniki Łódzkiej APLIKACJA DO TESTOWANIA ALGORYTMÓW PRZETWARZANIA SYGNAŁÓW Streszczenie Celem pracy jest prezentacja aplikacji służącej do testowania algorytmów przetwarzania jedno i dwuwymiarowych sygnałów. Podano możliwości zobrazowania danych na różnych etapach przetwarzania (kodowanie, kwantyzacja i dekodowanie). Przedstawione zostały metody porównawcze stosowane do określenia jakości i szybkości zastosowanych metod. W ostatniej części zaprezentowano przykłady implementacji kilku metod przetwarzania i wykorzystanie programu jako pomocy w dydaktyce laboratorium Telekomunikacji. 1. Wstęp Rozwój technik przetwarzania informacji zależy od tworzenia coraz lepszych metod przetwarzania sygnałów. Wzrost mocy obliczeniowej komputerów powoduje, że można budować jeszcze bardziej skomplikowane i złożone algorytmy do przetwarzania sygnałów. Sygnał wejściowy można traktować jako ciąg danych liczbowych (wektor), który zostaje poddany przekształceniom na kilku etapach. Projektowanie algorytmów kompresji można podzielić na dwie fazy. Pierwsza faza nazywana jest modelowaniem. Próbuje się w niej wydobyć informacje o wszelkiego typu zależnościach występujących w danych i opisać ją za pomocą modelu. Drugą fazę nazywa się kodowaniem. Koduje się zazwyczaj opis modelu przy użyciu alfabetu binarnego. Można założyć, że danymi wejściowymi dla procesu kodowania jest ciąg liczb z zakresu liczb całkowitych lub rzeczywistych. Inaczej mówiąc wektor u o n elementach, które należą do zbioru liczb rzeczywistych. Po przekształceniu otrzymuje się z reguły zestaw danych tego samego rozmiaru. Następnym procesem jest kwantyzacja, czyli zamiana wartości liczbowych na odpowiadające im słowa binarne. W zależności od zastosowanej metody kwantyzacji otrzymuje się odpowiednio przekształcony sygnał. Dla kompresji danych najczęściej dobiera się taki schemat kwantyzacji, aby sygnał zawierał najwięcej współczynników zerowych. Dzięki temu sygnał może być poddany efektywnemu kodowaniu różnymi metodami na przykład: Huffmana. Taka operacja pozwala na znaczne zredukowanie ilości danych wejściowych. W procesie testowania algorytmów wystarczy porównać przetworzoną informację w stosunku do danych wejściowych. Ostatnim etapem przetwarzania jest dekodowanie, czyli proces odwrotny w stosunku do kodowania. Przechowując oryginalne dane wejściowe można po ostatnim etapie przetwarzania oszacować zmiany, jakim uległ sygnał w procesie kodowania i dekodowania. Każdy proces przetwarzania sygnału można podzielić na kilka bloków procedur wykonywanych kolejno po sobie (rys.1). Wydajność każdego systemu kodującego i dekodującego zależy od szybkości poszczególnych jego etapów. Szybkość procesu można określić jako czas wykonania procedury kodowania lub dekodowania lub przez oszacowanie ilości operacji matematycznych (dodawanie, mnożenie...), 1
M. Cegielski Aplikacja do testowania algorytmów przetwarzania sygnałów jakie znajdują się w tych procedurach. Jest to najprostszy uniwersalny schemat umożliwiający ocenę algorytmów pod względem skuteczności i szybkości przetwarzania. Kodowanie Kwantyzacja Dekwantyzacja Dekodowanie Rys 1. Etapy przetwarzania sygnału.. Schemat blokowy aplikacji przetwarzania sygnałów. Aplikacja przetwarzania sygnałów składa się z funkcjonalnych bloków, które odpowiadają za poszczególne elementy procesu przetwarzania. Dane początkowe są wczytywane z plików i umieszczane w pamięci komputera jako tablica jedno lub dwuwymiarowa o elementach należących do zbioru liczb rzeczywistych. Dla opcji jednowymiarowej dane mogą być wczytane z pliku dźwiękowego w formacie waw. Dla sygnałów dwuwymiarowych można je importować bezpośrednio z pliku bitmapy o odcieniach szarości. Każdy blok przetwarzania danych otrzymuje jako parametry wejściowe: tablicę z danymi i informację o wielkości tej tablicy. Zwracaną informacją jest tablica z danymi wyjściowymi o tym samym rozmiarze co dane wejściowe. Na każdym etapie przekształcania informacji można obejrzeć efekt w postaci wykresu dla danych jednowymiarowych lub obrazu w postaci bitmapy dla danych dwuwymiarowych. Po procesie kwantyzacji w czarno-białej bitmapie elementy zerowe są wyświetlane w kolorze niebieskim, co pomaga w szybkiej ocenie skuteczności algorytmu. Aplikacja mierzy czasy wykonania poszczególnych etapów przetwarzania i jest wyposażona w standardowe algorytmy przetwarzania sygnałów, które mogą być użyte jako pomoc przy budowaniu własnych algorytmów. Są to Dyskretna Transformata Kosinusowa (DCT), Dyskretna Transformata Karhunena-Loeva (KLT, PCA) i Dyskretna Transformata Falkowa (DWT)..1 Kodowanie za pomocą dyskretnej transformaty kosinusowej. Ze względu na szeroki zakres stosowania i popularność, transformata kosinusowa może być przydatna do porównania jej wydajności i szybkości z innymi przekształceniami. Dyskretne przekształcenie kosinusowe (DCT) zawdzięcza swoją nazwę temu, że wiersze macierzy przekształcenia C rozmiaru N x N są funkcjami kosinusów.
Łódź, październik 003 Ci, j 1 N N ( cos ( cos j 1) i N j 1) i N dla dla i 0, j 0,1,..., N 1 i 1,,..., N 1, j 0,1,..., N 1 (1) Przy założeniu, że wartość każdego elementu macierzy za pomocą, której jest reprezentowany sygnał wejściowy oznacza jego energię. Efektem poddania danych wejściowych przekształceniu DCT jest skupienie energii sygnału w początkowych współczynnikach macierzy. Dla źródeł Markowa o dużych współczynnika korelacji możliwości zagęszczania współczynników przez DCT są bliskie przekształceniu KLT. Program pozwala na zobrazowanie samych współczynników macierzy przekształcenia DCT i wizualną obserwację poszczególnych etapów przetwarzania.. Zastosowanie przekształcanie Karhunena-Loeve w przetwarzaniu sygnałów. Wiersze dyskretnego przekształcenia Karhunena-Loevego zwanego też jako przekształcenie Hotellinga lub PCA (Principal Component Analisis), zawierają wektory własne macierzy autokowariancji, T cov( X ) E[( X E( X ))( X E( X ) )] () uporządkowane tak, by odpowiadające im wartości własne były ułożone od największej wartości do najmniejszej. Można wykazać, że przekształcenie skonstruowane w ten sposób minimalizuje średnią geometryczną wariancji współczynników przekształcenia i dlatego transformata Karhunena-Loevego daje najlepsze rezultaty kodowania spośród metod kodowania transformującego. Z powodu złożoności obliczeniowej transformaty Karhunena-Loevego (KLT) jej praktyczne wykorzystanie jest niewielkie. Proces obliczeniowy został podzielony na dwa etapy: Obliczenie macierzy autokowariancji z sygnału wejściowego, która jest symetryczna i złożona z współczynników rzeczywistych. Jest to proces obliczeniowo kosztowny, gdyż w klasycznym przypadku wymaga N 4 kroków obliczeniowych. Obliczenie wartości i wektorów własnych macierzy i ich uporządkowanie. Model matematyczny transformaty Karhunena-Loeva można przedstawić w postaci następującego algorytmu. 1. Obliczenie wektora m x, który jest wartością średnią macierzy wejściowej X (M x M) M 1 mx x i M i1 (3). Budowa macierzy kowariancji C x dla wektorów x i T C 1 x ( xi mx )( xi m x ) M (4) 3. Dokonuje się dekompozycji przez wektory własne v k zdefiniowane jako kolumny macierzy A. Dzięki właściwością macierzy autokowariancji można zastosować 3
M. Cegielski Aplikacja do testowania algorytmów przetwarzania sygnałów dekompozycję SVD lub klasycznie przekształcić macierz do postaci trójdiagonalnej metodą Householdera i zastosować algorytm QL z przesunięciami do znalezienia wartości i wektorów własnych. C x A = A D, gdzie D =diag(λ k) i (λ 0 λ 1... λ M-1) (5) 4. Wyznaczenie transformaty y i T A x m ) (6) ( i x 5. Wyznaczenie transformata odwrotnej x A y m (7) i i Istnieją alternatywne sposoby obliczenia macierzy kowariancji za pomocą Dyskretnej Transformaty Fouriera lub przekształcenia falkowego. Można także zastosować neuronowy algorytm Oja-RLS, który został zaproponowany przez Kunga [7] i Cichockiego [8]. Jeśli kompresowane wejście jest zmienne w czasie, to funkcja autokorelacji też się zmienia w czasie. Oznacza to, że macierz autokorelacji ulega zmianie i wymaga ponownego obliczenia przekształcenia KLT, które jest obliczeniowo kosztowne. Innym ograniczeniem zastosowania KLT jest fakt, że macierz przekształcenia KLT zależy od danych wejściowych, co wymusza konieczność przesłania każdej nowo obliczonej macierzy KLT lub autokowariancji. Zwiększenie ilości danych związanych z przesłaniem macierzy KLT może być tak duże, że może anulować sam zysk z użycia optymalnego przekształcenia. Jeżeli zostanie przyjęte założenie, że statystyki sygnału zmieniają się powoli lub oscylują blisko wartości średniej całego sygnału, to zastosowanie KLT może być bardzo atrakcyjne. x.3 Kodowanie za pomocą falek Haara i Daubechies 4 rzędu. Funkcja f(x) może być przeskalowana przez podstawienie za x x/a (parametr a jest wielkością skalowania). Normę f(x) definiuje się jako f ( x) f ( x) dx 6. Podstawiając za argument x wartość x/a do wzoru (8) otrzymuje się zależność (9): f x x ( ) f ( ) dx a f ( x) dx a f ( x a a Oznacza to, że tego typu skalowanie zmienia normę funkcji i aby przeskalowana funkcja musiała mieć tę samą normę to musimy ją pomnożyć przez 1/a 1/. W modelu matematycznym można funkcję f(x) przesunąć w lewo lub w prawo o wartość b przez zamianę x na x-b lub x+b. 4 ) (8) (9)
Łódź, październik 003 Równaniem (10) można zapisać operację przeskalowania i przesunięcia, która została nazwana falką macierzystą. 1 x b a, b ( x) ( ) (10) a a Jeżeli zostanie zdefiniowana funkcja skalująca Φ(x), to dowolną funkcję f(x) można przedstawić jako kombinację liniową funkcji skalującej Φ(x) i jej przesunięć (11). f ( x) ak ( x k) (11) k Z własności funkcji skalujących wynika, że jeżeli można reprezentować funkcję za pomocą funkcji skalujących, to można ją również reprezentować za pomocą rozciągniętych funkcji skalujących. Najczęściej stosowaną wartością skalującą jest potęga liczby co prowadzi do uproszczenia wzoru (10) do postaci (1). j / j ( x) ( x ) j,k=1,,3,... (1) j, k k Funkcja f(x) może być wtedy zapisana w innej rozdzielczości: j / j f ( x) a j, k ( x k) (13) k j / j / Współczynniki a j,k można obliczyć z iloczynu skalarnego ( x); ( x k), gdy znana jest funkcja Φ(x). Z teorii wynika, że można znaleźć nieskończoną liczbę możliwych falek. To, która jest najlepsza zależy od konkretnego zastosowania. Najbardziej popularne to falki Haara, czterorzędowe, 1-rzędowe i 0 rzędowe filtry Daubechies, 6-rzędowe,1-rzędowe i 18 rzędowe filtry Coifleta. Istnieją dwa podejścia do podpasmowego rozkładu dwuwymiarowych sygnałów: pierwsze wykorzystuje filtry dwuwymiarowe oraz drugie używające różnych przekształceń, które mogą być zaimplementowane za pomocą filtrów jednowymiarowych i wykonane najpierw po wierszach a następnie po kolumnach lub odwrotnie. W większości zastosowań jest spotykane drugie podejście, w tym także w standardzie JPEG000. Dla przykładu można pokazać jak rozłożyć obraz N x M. Filtrujemy każdy wiersz, a następnie dziesiątkujemy, aby otrzymać dwa obrazy rozmiaru N x M/. Następnie filtrujemy każdą kolumnę i podpróbkowujemy wyjście filtra, otrzymując cztery obrazy N/ X M/. Podobraz otrzymany w wyniku filtrowania dolnoprzepustowego wierszy nazywamy często obrazem LL. Podobraz otrzymany po dolnoprzepustowym filtrowaniu wierszy i górnoprzepustowym filtrowaniu kolumn nazywamy obrazem LH, i podobnie obraz HL powstaje w wyniku filtrowania dolnoprzepustowego kolumn i górnoprzepustowego wierszy. Podobraz powstały po górnoprzepustowym filtrowaniu wierszy i kolumn to obraz HH. Schemat kodowania falkowego pokazano na rysunku nr. 5
M. Cegielski Aplikacja do testowania algorytmów przetwarzania sygnałów Rys. Schemat kodowania falkowego. 3. Zastosowanie edukacyjne programu w laboratorium przetwarzania sygnałów. Modułowa konstrukcja programu jest idealnym rozwiązaniem do budowania własnych algorytmów lub modyfikowania już istniejących. Każdy uczestnik laboratorium może zbudować swoją wersję przekształcenia kosinusowego i porównać ją z innymi przekształceniami. Dowolny moduł programu może być zastąpiony innym umieszczonym w bibliotece zewnętrznej dołączanej dynamicznie. Pozwala to na wymianę poszczególnych procedur bez wyłączania i ponownego uruchamiania całego programu. Rozwiązanie to pozwala na znaczne przyspieszenie prac przy uruchamianiu poszczególnych algorytmów. Biblioteki mogą być pisane w wielu językach programowania (Delphi, Borland Builder, DevC++, gcc, Visual C++, Visual Basic czy Microsoft.NET. Program został napisany w środowisku Delphi w wersji 6, zajmuje się głównie prezentacją danych i ich przechowywaniu dla funkcji kodowania, kwantyzacji, dekwantyzacji i dekodowania i ich ostatecznego porównywania. Zawiera tylko niewielką część procedur kodowania i kwantyzacji pozostałe są umieszczone w bibliotekach dołączanych dynamicznie. Literatura [1] Władysław Skarbek (red.).: Multimedia - Algorytmy i standardy kompresji. Akademicka Oficyna Wydawnicza PLJ Warszawa 1998. [] Khalid Sayood.: Kompresja danych wprowadzenie. Wydawnictwo RM 00. [3] William H. Press, Saul A. Teukolsky, William T. Vetterling, Brian P. Flannery.: Numerical Recepes in C. Cambridge University Press 6
Łódź, październik 003 [4] Michihiri Uenohara, Takeo Kanade.: Use of Fourier and Karhunen-Loeve Decomposition for Fast Patteren Matching With a Large Set of Templatetes. IEEE Transactions on pattern Analisis and Machine Inteligence, Vol. 19, No 8, August 1997. [5] Franklin G. Horowitz, Don Bone, Paul Veldkamp.: Karhunen-Loeve Based Iteration Function System Encodings. International Picture Coding Symposium. Melbourne, Australia 13-15 March 1996. [6] Lawrencence Sirovivich.: Image Analiysis, A Tutorial. Part 1. Basics. June 1, 001. [7] K.I. Diamantaras, S.Y. Kung.: Principial Component Neural Networks, John Wiley & Sons, New York, 1996. [8] A. Cichocki, W. Kasprzak, W. Skarbek.: Adaptive Learnig Algorithm for Principal Component Analisis with Partial Data, Cybernetics and Systems 96, 13-th European meeting on Cybernetics and Systems Research, Austian Society for Cybernetics Stydies, Vienna, (pp. 1014-1019), 1996. MARCIN CEGIELSKI mceg@ics.p.lodz.pl Instytut Informatyki Politechnika Łódzka 93-005 Łódź, Wólczańska 19/3 7