Piotr Wasilewski Instytut Elektroniki Politechnika Łódzka ul. Wólczańska 223, 90-924 Łódź piotrwas@p.lodz.pl 2005 Poznańskie Warsztaty Telekomunikacyjne Poznań 8-9 grudnia 2005 SPRZĘTOWA REALIZACJA KODERA ARYTMETYCZNEGO DO KODOWANIA WSPÓŁCZYNNIKÓW 3D DWT Streszczenie: W artykule przedstawiono realizację arytmetycznego kodera współczynników 3D DWT uprzednio zakodowanych zmodyfikowaną metodą EZW. Opisany koder jest przeznaczony do kodowania danych pochodzących ze źródła zawierającego do 8 elementów i wylicza w sposób adaptacyjny wartości prawdopodobieństw kodowanych symboli. W pracy przedstawiono opis działania kodera, sposób jego implementacji w układzie FPGA Spartan XC3S1000 oraz uzyskane wyniki. 1. WSTĘP Wiele algorytmów stratnej kompresji obrazów (JPEG, JBIG, EZW, SPIHT) wykorzystuje lub umożliwia włączenie bezstratnego kodera jako ostatniego etapu kodowania danych. Kodowanie bezstratne najczęściej jest realizowane metodami słownikowymi (np. LZW, LZ78), metodą Huffmana lub za pomocą kodera arytmetycznego [1, 2, 9]. Poniższy projekt powstał w celu uzupełnienia o moduł kanałowego kodowania danych pochodzących z własnej metody kompresji barwnych sekwencji wideo, gdzie dane są rezultatem kodowania współczynników dyskretnej transformaty falkowej (DWT). Do implementacji wybrano koder arytmetyczny ze względu na następujące jego właściwości [2, 3, 4, 5, 7, 9]: szereg prac wskazuje, że kodowanie arytmetyczne daje lepsze rezultaty od innych metod bezstratnego kodowania danych przy dużym zróżnicowaniu wartości prawdopodobieństw kodowanych symboli i małych słownikach, implementacja kodera arytmetycznego nie wymaga angażowania dużych zasobów pamięciowych, jak np. przy metodach słownikowych, w kodowaniu arytmetycznym istnieje jednoznaczne oddzielenie procesu modelowania od procesu kodowania, co czyni go bardzo elastycznym i umożliwia łatwe tworzenie systemów adaptacyjnych. W przedstawionym rozwiązaniu nie ma potrzeby wykonywania operacji dzielenia, zaś ze względu na mały rozmiar alfabetu przeglądanie tablicy prawdopodobieństw nie jest operacją ograniczającą w zasadniczym stopniu szybkość pracy układu. 2. ŹRÓDŁO DANYCH Dane wejściowe dla kodera arytmetycznego są generowane przez algorytm kodowania barwnych sekwencji wideo wykorzystującego dyskretną transformatę falkową w dziedzinie 2D+t [6]. Informacja o kolorze kodowana jest w systemie YCrCb z podpróbkowaniem składowych chrominancji w systemie 4:2:0 (rys. 1). Klasyczny algorytm EZW [10] został zaprojektowany do kodowania obrazów monochromatycznych i koduje wartości współczynników DWT za pomocą czterech symboli: P (dodatni współczynnik znaczący), N (ujemny współczynnik znaczący), Z (izolowane zero) oraz T (drzewo zerowe). W opisywanej modyfikacji koder operuje siedmioma symbolami: P, N i Z mającymi takie samo znaczenie, jak w oryginalnym algorytmie oraz czterema nowymi definiującymi drzewa zerowe (rys. 1): T2M drzewo zerowe, gdzie rodzic i współczynniki potomne leżą w jednej płaszczyźnie XY należącej do jednej składowej koloru (Y, Cr lub Cb). Drzewami tego typu są struktury oznaczone numerami 1, 2 oraz 3 na rysunku 1. T2C drzewo zerowe, gdzie rodzic i współczynniki potomne leżą w jednej płaszczyźnie XY wspólnej dla co najmniej dwóch składowych koloru (Y, Cr i Cb lub Cr i Cb). Drzewo tego typu tworzą połączone struktury 1, 2 oraz 3. T3M drzewo zerowe, gdzie rodzic i współczynniki potomne należą do jednej składowej koloru (Y, Cr lub Cb), zaś drzewo ulokowane jest w przestrzeni XYT. Ilustracja tego typu drzewa na rysunku 1 jest struktura 4. T3C drzewo zerowe, gdzie rodzic i współczynniki potomne należą do co najmniej dwóch składowej koloru (Y, Cr i Cb lub Cr i Cb), zaś drzewo ulokowane jest w przestrzeni XYT każdej ze składowych. Połączone struktury 5 oraz 6 tworzą drzewo typu T3C. PWT 2005 - POZNAŃ 8-9 GRUDNIA 2005 1/5
Składowa Y Składowa Cr T Y X 4 5 Składowa Cb 2 1 6 3 3. KODER ARYTMETYCZNY Kodowanie arytmetyczne należy do statystycznych metod kodowania entropijnego, podobnie jak metody Huffmana i Shannona-Fano [9]. W podstawowej postaci kodowanie arytmetyczne polega na systematycznym zawężaniu w miarę postępowania procesu kodowania tzw. przedziału kodu wynoszącego początkowo [0;1). Uzyskana w wyniku procesu kodowania końcowa postać przedziału kodu pozwala w jednoznaczny sposób odtworzyć zakodowaną sekwencję danych [2, 9]. Niestety, tworzone w ten sposób granice przedziału kodu są liczbami zmiennoprzecinkowymi, do których przechowywania niezbędne są rejestry o długościach znacznie przekraczających możliwości współczesnych komputerów i dlatego w praktyce realizuje się kodowanie arytmetyczne z wykorzystaniem liczb całkowitych. Realizacja taka wymaga użycia dwóch rejestrów określających bieżące granice przedziału kodu (B i T), licznika niedomiaru L oraz tablicy przedziałów prawdopodobieństw P. Długość rejestrów B i T określa prawdopodobieństwo wystąpienia najmniej prawdopodobnego symbolu źródła [2, 9]. Tablica przedziałów prawdopodobieństw P musi pokrywać przedział [0;1), zaś długości jej przedziałów [d i ;g i ) muszą być wprost proporcjonalne do wartości prawdopodobieństw symboli s i, którym przedziały te są przypisane [2, 9]. Sposób działania takiego kodera przedstawia poniższy algorytm [9]: 1. Inicjalizacja: ustalenie granic przedziałów prawdopodobieństw d i oraz g i w tablicy P, wyzerowanie rejestru B, ustawienie wszystkich bitów rejestru T, wyzerowanie licznika niedomiaru L. 2. Pobierz daną s i ze źródła, wyznacz podprzedział prawdopodobieństw [d i ;g i ) i zmodyfikuj zawartości rejestrów T oraz B według zależności (1) oraz (2) Rys. 1 Kodowanie współczynników 3D DWT ( T B + ) ( T B + ) B = B + 1 T = B + 1 3. Aktualizuj tablicę prawdopodobieństw P 4. Jeśli MSB(T) = MSB(B) wyślij MSB(T); jeśli nie idź do punktu 7 5. Jeśli L>0 wyślij L razy zanegowany MSB(T) i wyzeruj L 6. Idź do punktu 8 7. Jeśli MSB2(T)=(10) 2 i MSB2(B)=(01) 2 zwiększ L o 1 i ustaw MSB2(T)=(11) 2 oraz MSB2(B)=(00) 2 ; jeśli nie idź do punktu 2 8. Przesuń w lewo o 1 zawartość rejestrów T i B, ustaw LSB(T)=1 i LSB(B)=0 9. Idź do punktu 4 Oznaczenia: MSB najbardziej znaczący bit, MSB2 dwa najbardziej znaczące bity, LSB najmniej znaczący bit Możliwe jest korzystanie ze statycznej tablicy prawdopodobieństw i wówczas punkt 3 powyższego algorytmu nie jest realizowany. Często jest stosowane tzw. modelowanie kontekstu, w którym wybiera się jedną z predefiniowanych tablic prawdopodobieństw na podstawie historii zakodowanych symboli [1, 8]. W opisywanym rozwiązaniu tablica prawdopodobieństw jest systematycznie uaktualniana na podstawie ostatnich 256 zakodowanych symboli. Rozwiązanie to ma dwie zalety w stosunku do metody modelowania kontekstu w przypadku sprzętowej realizacji kodera: 1. nie wymaga stosowania wielu tablic prawdopodobieństw, a więc nie są potrzebne duże zasoby pamięciowe układu, 2. nie wymaga znajomości a priori statystyki źródła. Przedstawiony koder arytmetyczny składa się z dwóch modułów (rys. 2): d i g i PWT 2005 - POZNAŃ 8-9 GRUDNIA 2005 2/5
moduł Fifo realizujący inicjalizację i uaktualnianie tablicy prawdopodobieństw moduł Alu realizujący pozostałe funkcje algorytmu. FCLK Din Finit ACLK Dout DValid Busy Fifo Alu Rys. 2 Schemat blokowy kodera arytmetycznego 3.1. Moduł Alu Moduł Alu realizuje zasadniczą część algorytmu kodowania arytmetycznego polegającą na modyfikowaniu rejestrów B i T zawierających bieżące granice przedziału kodu oraz formowaniu wyjściowego strumienia danych. Czynności te określone są wzorami (1) i (2) oraz punktami 4 8 przedstawionego wcześniej algorytmu. Ponieważ wartości prawdopodobieństw określające granice przedziałów tablicy P mają postać n/256, gdzie n [0; 256], zatem nie ma konieczności wykonywania operacji mnożenia na liczbach zmiennoprzecinkowych w celu wyznaczenia wartości wyrażeń opisanych wzorami (1) oraz (2). Otrzymywane z modułu Fifo parametry i (rysunek 2) zawierają liczniki liczb określających te prawdopodobieństwa, a zatem możliwe jest wykorzystanie mnożarek całkowitoliczbowych i pominięcie ośmiu najmłodszych bitów otrzymanego iloczynu. Kroki algorytmu realizowane są w postaci maszyny stanowej opisanej przez 4 stany: S1 modyfikacja rejestrów B i T według wzorów (1) i (2). Jeśli MSB(T)=MSB(B) oraz L>0 idź do S2, jeśli MSB(T)=MSB(B) oraz L=0 idź do S4, w przeciwnym razie jeśli MSB2(T)=(10) 2 i MSB2(B)=(01) 2 idź do S3, w pozostałych przypadkach pozostań w S1 S2 wyślij na Dout zanegowany MSB(T) i zmniejsz licznik niedomiaru L o 1; jeśli L>0 pozostań w S2, w przeciwnym razie idź do S4 S3 zwiększ licznik niedomiaru L o 1, ustaw MSB2(T)<=(11) 2 oraz MSB2(L)<=(00) 2 i idź do S4 S4 Przesuwaj zawartość liczników B i T w lewo o 1 tak długo jak MSB(T)=MSB(B) i L=0. Jeśli MSB(T)=MSB(B) oraz L>0 idź do S2, w przeciwnym razie jeśli MSB2(T)=(10) 2 i MSB2(B)=(01) 2 idź do S3, jeśli nie idź do S1 Każde wejście maszyny w stan S1 oznacza pobranie nowej danej do zakodowania. Stan aktywny wyjścia Busy oznacza, że moduł Alu nie jest gotowy do pobrania nowej danej. Stan aktywny wyjścia DValid oznacza, że na wyjściu Dout znajduje się ważna dana. W zastosowanym rozwiązaniu szybkość kodowania jest zmienna i liczba cykli zegarowych potrzebnych do zakodowania jednego symbolu waha się od 1 do 17. MSB2(T) == 10 and MSB2(B) == 01 START and L == 0 @ELSE and L == 0 S4 Send MSB(T) B << 1; T << 1 S3 L <= L + 1 MSB2(B) <= 00 MSB2(T) <= 11 L == 0 @ELSE S1 Modify B and T registers MSB2(T) == 10 and MSB2(B) == 01 and L > 0 S2 send!(msb(t)) to Dout L <= L - 1 Rys. 3 Maszyna stanowa modułu Alu 3.2. Moduł Fifo and L > 0 L > 0 Zadaniem modułu Fifo jest udostępnianie modułowi Alu informacji o granicach przedziału prawdopodobieństw przypisanego kodowanemu sumbolowi oraz uaktualnianie tablicy prawdopodobieństw na podstawie już zakodowanych symboli. Schemat blokowy modułu jest przedstawiony na rysunku 4. Jądrem modułu Fifo jest dwuportowa pamięć BRAM [11] o pojemności 256 słów 3-bitowych, która wraz z licznikiem FCnt realizuje funkcję pamięci FIFO. Port A pamięci wykorzystywany jest podczas inicjalizacji, zaś port B używany jest do realizacji funkcji FIFO. W czasie inicjalizacji licznik FCnt jest generatorem adresów, zaś na magistralę danych są podawane najmłodsze cztery bity adresu. Wynikiem tego po zakończeniu procesu inicjalizacji jest równomierne wypełnienie pamięci, która zawiera po 32 wpisy każdej wartości. W czasie pracy pamięci w trybie FIFO licznik FCnt steruje magistralą adresową, zaś na magistralę danych są podawane 3-bitowe kody symboli wejściowych s i. Po każdym zapisie zawartość licznika FCnt jest zwiększana o 1. Licznik FCnt w trybie FIFO zlicza modulo 248, co zapobiega powstaniu sytuacji, w której pamięć FIFO nie będzie zawierała wszystkich symboli wejściowych. Może się tak zdarzyć w przypadku kodowania sekwencji o długości przekraczającej rozmiar pamięci, w której nie występują wszystkie symbole alfabetu. Spowodowałoby to wyznaczenie zerowej wartości prawdopodobieństwa PWT 2005 - POZNAŃ 8-9 GRUDNIA 2005 3/5
DIn FInit [7:0] [2:0] AddrA DIA EnA DOA f i CUp CDn FCnt [7:0] EnB AddrB DIB BRAM DOB 0x00 C0 C1 C2 C3 C4 C5 C6 0x100 MuxB MuxT FClk Rys. 4 Schemat blokowy modułu Fifo wystąpienia tego symbolu, co jest sytuacją niedopuszczalną. Praca licznika FCnt modulo 248 zapewnia zatem, że w pamięci FIFO każdy symbol będzie występował co najmniej jeden raz, a zatem skojarzone wartości prawdopodobieństw i długości podprzedziałów tablicy P zawsze będą większe od zera. Liczniki C i, i=0..6 zawierają skumulowane informacje o liczbie wystąpień symboli s i, tzn. licznik C i zawiera liczbę wystąpień wszystkich symboli s n, gdzie n<=i. Po inicjalizacji liczniki C 0,C 1,,C E zawierają wartości 0x20, 0x40,, 0xE0. Pracą liczników sterują dekodery CUp i CDn. Dekoder CUp sprawdza wartość wprowadzanej do pamięci danej s i i ustawia liczniki C n dla n>=i w tryb zliczania w górę. Z kolei dekoder CDn testuje wartość f i usuwaną z pamięci FIFO i ustawia liczniki C n dla n>=i w tryb zliczania w dół. Zawartość liczników, które mają aktywne sygnały z obu dekoderów CUp i CDn nie ulega zmianie. Odczyt wartości granic przedziału tablicy P przypisanego kodowanemu symbolowi s i następuje poprzez multipleksery MuxB i MuxT. Określenie dolnej granicy odbywa się poprzez multiplekser MuxB, który wybiera licznik C i-1 dla symboli s i, gdzie i>0 lub stałą 0x00 dla symbolu s 0. Określenie górnej granicy odbywa się poprzez multiplekser MuxT, który wybiera licznik C i dla symboli s i, gdzie i<7 lub stałą 0x100 dla symbolu s 7. Dane są zapamiętywane w rejestrach oraz. 4. WYNIKI 4.1. Efektywność algorytmu Aby ocenić efektywność opisanego algorytmu poddano kodowaniu strumień danych generowanych przez opisany w pierwszym rozdziale zmodyfikowany algorytm EZW. Kodowane były fragmenty standardowych sekwencji wideo w rozdzielczości CIF ( Akiyo, Coastguard, Container, Highway, Mobile ) o długościach 4, 8 i 16 ramek. Kodowanie przeprowadzono z wykorzystaniem pamięci FIFO o rozmiarze wahającym się od 32 do 1024 słów. Dla porównania te same dane zostały zakodowane algorytmami LZW oraz Huffmana. Uzyskane najmniejsze, największe oraz uśrednione dla wszystkich sekwencji współczynniki kompresji pokazane są w tabeli 1. Współczynnik kompresji R wyznaczany był według wzoru (3). S R 1 S = c o 100 (3) gdzie S c rozmiar pliku skompresowanego, S o rozmiar pliku oryginalnego Przedstawione w powyższej tabeli wyniki wskazują, że najlepsze wyniki kodowania uzyskuje się przy rozmiarze pamięci FIFO wynoszącym 256 słów. Widać też wyraźną przewagę kodera arytmetycznego nad pozostałymi metodami kodowania, zwłaszcza dla danych generowanych przez algorytm ECTW. 4.2. Wyniki implementacji Opisany projekt został opisany w języku Verilog, a następnie zsyntezowany i skompilowany w środowisku Xilinx ISE Foundation v. 7.1 i zaimplementowany w układzie FPGA XC3S1000-4FT256 firmy Xilinx. Zaprojektowany koder wykorzystuje 374 komórki CLB (ok. 2% zasobów układu), 2 układy mnożące (12% zasobów) oraz 1 blok pamięci RAMB16 (4% zasobów). Maksymalna częstotliwość zegara wynosi PWT 2005 - POZNAŃ 8-9 GRUDNIA 2005 4/5
Tabela 1. Porównanie wyników kodowania Metoda kodowania Współczynnik kompresji Najmniejszy Największy Wartość średnia Koder arytmetyczny, FIFO o długości 16 słów 26,52 27,75 27,17 Koder arytmetyczny, FIFO o długości 32 słów 35,02 36,99 36,31 Koder arytmetyczny, FIFO o długości 64 słów 38,20 41,00 39,80 Koder arytmetyczny, FIFO o długości 128 słów 39,39 42,46 40,93 Koder arytmetyczny, FIFO o długości 256 słów 40,79 43,28 42,53 Koder arytmetyczny, FIFO o długości 512 słów 40,83 43,53 41,96 Koder arytmetyczny, FIFO o długości 1024 słów 40,33 43,41 41,10 Algorytm LZW 35,56 43,25 38,31 Algorytm Huffmana 30,11 40,25 33,60 48MHz, co pozwala uzyskać średnią szybkość kodowania wynoszącą ok. 8 milionów symboli na sekundę. Przedstawiona sprzętowa realizacja kodera arytmetycznego powstała jako ostatni element systemu kompresji sekwencji wideo pracującego w czasie rzeczywistym. Opisane rozwiązanie umożliwia szybkie i efektywne kodowanie danych pochodzących ze źródeł o alfabecie ograniczonym do 16 symboli. Niewielkie wymagania sprzętowe umożliwiają zintegrowanie w jednym układzie scalonym FPGA kodera arytmetycznego z pozostałą częścią systemu. SPIS LITERATURY [1] M. Boo, J.D. Bruguera, T. Lang, A VLSI Architecture for Arithmetic Coding of Multi-Level Images, IEEE Trans. Circuits and Systems-II: Analog and Digital Signal Processing, vol. 45, 1997 [2] P. G. Howard, J. S. Vitter, Practical Implementations of Arithmetic Coding, Image and Text Compression, Kluwer Academic Publishers, Norwell, 1992 [3] H. Lekatsas, J. Henkel, W. Wolf, Arithmetic Coding for Low Power Embedded System Design, Data Compression Conference, Snowbird, 2000 [4] H. Lekatsas, J. Henkel, W. Wolf, Code Compression as a Variable in Hardware/Software Co- Design, International Workshop on Hardware/Software Co-Design, 2000 [5] H. Lekatsas, W. Wolf, SAMC: A Code Compression Algorithm for Embedded Processors, IEEE Transactions on CAD, vol 18, pp.1689-1701, 1999 [6] J.-R. Ohm (red.), Signal Processing: Image Communication 19, Elsevier, 2004 [7] R. R. Osorio, J. D. Bruguera, New Arithmetic Coder/Decoder Architectures Based On Pipelining, IEEE International Conference On Application Especific Systems, Architectures, And Processors, 1997 [8] P. Prandoni, M. Vetterli, A Mixed-Framework Arithmetic Coder, PCS97, Berlin, 1997 [9] K. Sayood, Kompresja danych, Wydawnictwo RM, Warszawa, 2002 [10] J. M. Shapiro, Embedded Image Coding using Zerotrees of Wavelet Coefficients,, IEEE Trans. Sig. Proc., vol. 41, 1993 [11] Spartan-3 FPGA Family, Xilinx, 2004 PWT 2005 - POZNAŃ 8-9 GRUDNIA 2005 5/5