Plik PDF - Zespół Rekonfigurowalnych Systemów Obliczeniowych
Transkrypt
Plik PDF - Zespół Rekonfigurowalnych Systemów Obliczeniowych
Akademia Górniczo – Hutnicza im. Stanisława Staszica w Krakowie Wydział Elektrotechniki, Informatyki, Automatyki i Elektroniki Katedra Elektroniki Paweł Russek Implementacja w układach logiki reprogramowalnej algorytmu kwantyzacji dla potrzeb kompresji sygnału wizyjnego Rozprawa doktorska Promotor: dr hab. inż. Kazimierz Wiatr, prof. n. AGH Kraków, 2002 Składam serdeczne podziękowania Panu Profesorowi Kazimierzowi Wiatrowi za wszelką pomoc, która przyczyniła się do powstania tej pracy. W szczególności jestem wdzięczny za słowa mobilizacji oraz stworzenie warunków umożliwiajcych przeprowadzenie koniecznych prac badawczych. 2 Spis treści Spis treści ................................................................................................................................... 3 Wykaz skrótów i oznaczeń ........................................................................................................ 6 1. 2. Wprowadzenie ................................................................................................................... 8 1.1. Motywacja.................................................................................................................. 8 1.2. Cel i teza pracy......................................................................................................... 11 1.3. Organizacja pracy .................................................................................................... 12 Kodowanie obrazów ........................................................................................................ 15 2.1. Wstęp ....................................................................................................................... 15 2.2. Kodowanie oparte na dekompozycji........................................................................ 16 2.2.1. Transformaty.................................................................................................... 17 2.2.2. Kodowanie podpasmowe. ................................................................................ 19 2.3. 3. 4. Kwantyzacja............................................................................................................. 24 2.3.1. Kwantyzacja skalarna ...................................................................................... 26 2.3.2. Kwantyzacja wektorowa .................................................................................. 26 2.3.3. Kwantyzatory kratkowe ................................................................................... 30 2.4. Alokacja bitów ......................................................................................................... 31 2.5. Kodowanie entropowe ............................................................................................. 35 Kodowanie sekwencji ...................................................................................................... 37 3.1. Wprowadzenie ......................................................................................................... 37 3.2. Estymacja ruchu....................................................................................................... 38 3.3. Koder wideo............................................................................................................. 40 3.4. Niestacjonarność strumienia wideo ......................................................................... 41 3.5. Sterowanie przepływem bitów................................................................................. 43 Algorytm kwantyzacji PVQ............................................................................................. 46 4.1. Wprowadzenie ......................................................................................................... 46 4.2. Konstrukcja siatki kwantyzatora.............................................................................. 47 4.3. Wymagana przepływność bitowa ............................................................................ 50 4.4. Rzutowanie na powierzchnię ostrosłupa.................................................................. 51 4.5. Kwantowanie w punktach siatki PVQ ..................................................................... 52 4.6. Kodowanie punktów siatki ...................................................................................... 53 4.7. Dekodowanie punktu siatki...................................................................................... 55 4.8. Algorytm PCPVQ .................................................................................................... 56 3 4.9. Zastosowanie algorytmu PVQ ................................................................................. 57 5. Kwantyzacja PVQ w systemach kompresji obrazu ......................................................... 59 6. Algorytm przeznaczony do realizacji sprzętowej ............................................................ 63 6.1. Rzutowanie wektora na powierzchnię ostrosłupa.................................................... 63 6.2. Zmiany w algorytmie kwantyzacji na powierzchni ostrosłupa................................ 64 6.3. Modyfikacja kodowania........................................................................................... 65 6.4. Wpływ zmian w algorytmie kodowania na dekodowanie ....................................... 66 7. Architektura sprzętowa dla algorytmu PVQ.................................................................... 68 7.1. Geneza wybranej architektury ................................................................................. 68 7.2. Architektura potokowa PVQ.................................................................................... 70 7.3. Narzędzia i założenia projektowe ............................................................................ 71 7.4. Moduł kwantyzatora ................................................................................................ 74 7.5. Moduł kodera ........................................................................................................... 81 7.6. Moduł dekodera ....................................................................................................... 86 7.7. Moduł dekwantyzatora............................................................................................. 92 8. Rekonfigurowalny system kodowania obrazu ................................................................. 95 8.1. Wprowadzenie ......................................................................................................... 95 8.2. Systemy rekonfigurowalne w kodowaniu obrazu.................................................... 97 8.3. Buforowanie danych ................................................................................................ 98 8.3.1. 8.4. 9. Przykład. Kodowanie współczynników transformaty falkowej. ..................... 99 Propozycja reprogramowalnej architektury kodera/dekodera wideo .................... 100 Praktyczna implementacja algorytmu PVQ w układach reprogramowalnych VIRTEX105 9.1. Układy FPGA serii Virtex ..................................................................................... 105 9.2. Implementacja układów funkcjonalnych kwantyzatora w matrycy CLB.............. 106 9.3. Implementacja bloków pamięci ............................................................................. 109 9.4. Praktyczna realizacja algorytmu PVQ w układach VIRTEX-E ............................ 111 10. Kodowanie obrazów determinowane sprzętem ......................................................... 114 10.1. Parametry kodowania PCPVQ........................................................................... 114 10.2. Kodowanie obrazów statycznych przy wykorzystaniu dekompozycji falkowej 116 10.3. Kodowanie sekwencji wideo ............................................................................. 119 10.4. Zastosowanie kwantyzatora rekonfigurowalnego.............................................. 124 11. Zakończenie ............................................................................................................... 126 11.1. Podsumowanie ................................................................................................... 126 11.2. Dalsze kierunki badań........................................................................................ 128 4 12. Bibliografia ................................................................................................................ 132 Dodatek 1 Zasoby sprzętowe CLB konieczne do realizacji dekodera PVQ dla róznych parametrów L, K ................................................................................................................ 144 Dodatek 2 Wybrane wartości bitrate dla parametrów L i K .............................................. 145 Dodatek 3 Pliki źródłowe realizacji modułu kwantyzatora ............................................... 147 Dodatek 3.1 Blok PRZESUNIECIE .............................................................................. 147 Dodatek 3.2 Blok MODUL............................................................................................ 148 Dodatek 3.3 Blok NORMA1 ......................................................................................... 150 Dodatek 3.4 Blok MNOZENIE ..................................................................................... 151 Dodatek 3.5 Blok DZIELENIE...................................................................................... 153 Dodatek 3.6 Blok NORMA2 ......................................................................................... 155 Dodatek 3.7 Blok SORT ................................................................................................ 157 Dodatek 3.8 Blok POZIOM ........................................................................................... 160 Dodatek 3.9 Blok KORYGUJ........................................................................................ 162 Dodatek 3.10 Blok OPOZ.............................................................................................. 164 Dodatek 4 Pliki źródłowe realizacji modułu kodera.......................................................... 164 Dodatek 4.1 Blok SUMATOR....................................................................................... 164 Dodatek 5 Pliki źródłowe realizacji modułu dekodera ...................................................... 166 Dodatek 5.1 Blok KOMP_P .......................................................................................... 166 Dodatek 5.2 Blok KOMP............................................................................................... 167 Dodatek 6 Pliki źródłowe realizacji modułu dekwantyzatora ........................................... 169 Dodatek 6.1 Blok ROWDOSZER ................................................................................. 169 Dodatek 6.2 Blok ODTWORZ ...................................................................................... 170 Dodatek 6.3 Blok MNOZ .............................................................................................. 171 Dodatek 6.4 Blok DZIEL............................................................................................... 173 Dodatek 7. Zawartość płyty CD............................................................................................. 176 5 Wykaz skrótów i oznaczeń ABR – ang. Adaptive Bit Rate ATM – ang. Asynchronous Transfer Mode BSR – ang. Block Select RAM CBR – ang. Constant Bit Rate CCM – ang. Custom Computer Machines CLB – ang. Configurable Logic Block D – błąd kodowania (ang. Distortion) DATA_WIDTH – szerokość bitowa danych wejściowych do kodowania DCT – ang. Discrete Cosine Tramsform DLL – ang. Delay-Locked Loop DPCM – ang. Different Pulse Code Modulation ERROR_WIDTH – szerokość bitowa reszty z dzielenia wszpółczynników EZW – ang. Embedded Zero Wavelet f – częstotliwość zegara systemu akwizycji obrazu fR – częstotliwość pracy systemu rekonfigurowalnego FIFO – ang. First In First Out FPGA – ang. Field Programable Gate Array H – pozioma rozdzielczość obrazu HDL – ang. Hardware Description Language IOB – ang. Input Output Block JPEG – ang. Joint Photographic Experts Group K – promień piramidy K_NBR_OF_ONES – ilośc bitów równych jeden w bitowej reprezentacji wartosci K K_VAL_LOG2 – ilość bitów bitowej reprezentacji K K_VALUE – parametr generic: wartość K L – wymiar kodowanego wektora X lν – norma odległości L_VAL_LOG2 – ilość bitów bitowej reprezentacji L LC – ang. Logic Cell MAE – ang. Mean Absolute Error 6 MISD – ang. Multiple Instruction-stream, Single Data-stream MIMD – ang. Multiple Instruction-stream, Single Data-stream MODSUM_WIDTH – długość bitowa długości wektora w sęsie normy l1 MPEG – ang. Motion Pictictures Expert Group MSE – ang. Mean Square Error N(L,K) – ilośc punktów na piramidzie P(L,K) P(L,K) – piramida L wymiarowa o promieniu K PCM – ang. Pulse Code Modulation PCPVQ – ang. Product Code Pyramid Vector Quantizer PSNR – ang. Peak Signal to Noise Ratio PVQ – ang. Pyramid Vector Quantizer QOS – ang. Quality Of Service R – gestość bitowa kodowania (ang. bitrate) r – ilość ramek sekwencji przypadających na sekundę RAM – ang. Random Access Memory RLC – ang. Run Length Coding ROM – ang. Read Only Memory RTR – ang. Run Time Reconfiguration SIMD – ang. Single Instruction-stream, Multiple Data-stream SRL – ang. Shift Register LUT SYMBOL_WIDTH – maksymalna szerokość bitowa indeksu punktu piramidy T – okres zegara systemu wizyjnego V – pozioma rozdzielczość obrazu VBR – ang. Variable Bit Rate VHDL – ang. VHSIC Hardware Description Language VLC – ang. Variable Length Coding VLSI – ang. Very Large Scale Integration X – kodowany wektor Y – obraz kodowanego wektora po kwantyzacji 7 1. Wprowadzenie 1.1. Motywacja Do całkowitego lub przynajmniej przybliżonego rozwiązania wielu problemów nauki i techniki konieczne jest przeprowadzenie ogromnej ilości obliczeń. Pojawienie się w połowie XX wieku elektronicznych maszyn liczących pozwoliło na duży postęp wynikający z możliwości szybszego niż kiedykolwiek ich wykonania. Okazało się jednak, że zapotrzebowanie na moc obliczeniową jest tak duże, że nie jest w stanie za nim nadążyć historycznie bezprecedensowo szybki rozwój komuterów. Wyścig pomiędzy coraz większymi mocami komputerów, oferowanymi po coraz niższej cenie, a wymaganiami im stawianymi przez coraz to nowe obszary zastosowań nie ma końca. Wzrastające wymagania rynku komputerowego, co do mocy obliczeniowych, skłaniają producentów sprzętu komputerowego do ciągłego ulepszania oferowanego sprzętu. Pierwsza możliwość prowadząca do tego ulepszenia, to ścieżka rozwoju technologicznego półprzewodników. Polega ona na ciągłym ulepszaniu technologii, w jakiej wykonywane są procesory i podzespoły współczesnych komputerów w taki sposób, aby mogły one pracować z coraz to większymi częstotliwościami zegara. Ponieważ w cyfrowych układach synchronicznych, do jakich należą współczesne procesory, częstotliwość zegara decyduje o ilości operacji wykonywanych w jednostce czasu, droga ta faktycznie prowadzi do postawionego celu. Równolegle rozwijane są badania nad rodzajem architektury wewnętrznej budowanych komputerów i architektury stosowanych jednostek obliczeniowych (procesorów) w taki sposób, aby mogły one w jednostce czasu przypadającej na jeden takt zegara wykonać więcej obliczeń. Prace te związane są z faktem, że architektura ogólnego stosowania, przeznaczona do dowolnej klasy problemów musi być mniej wydajna od architektury przeznaczonej do rozwiązania ściśle określonego problemu. W odniesieniu, więc do jednostek obliczeniowych ogólnego stosowania przeprowadza się modyfikacje ich struktur według wyników badań nad najczęściej wykonywanymi operacjami w stosowanych algorytmach obliczeniowych. Jednym z wątków związanych z ulepszaniem architektury jest powstawanie specjalnych podklas procesorów, budowanych do rozwiązywania specyficznych zadań. Grupą problemów współczesnej techniki, która obecnie jest głównym motorem ciągłej pogoni za szybszymi systemami komputerami są problemy z klasy przetwarzania sygnałów. 8 Dość wspomnieć, że stanowi ona bazę rozwoju wszelkiego rodzaju multimediów. Specjalnie dla tej grupy algorytmów opracowano architekturę procesorów DSP. Dedykowana do operacji „pomnóż i dodaj” architektura tych procesorów predyscynuje je do szybkiego wykonywania algorytmów przetwarzania sygnałów. W tym miejscu należy podkreślić, że opracowywanie architektur dedykowanych to nie tylko szybszy czas obliczeń. Zastąpienie procesora ogólnego stosowania procesorem dedykowanym skutkuje obniżeniem częstotliwości zegara przy tym samym czasie wykonywania obliczeń, a co za tym idzie otrzymaniem rozwiązania o mniejszym zapotrzebowaniu na moc. Nie jest to bez znaczenia przy opracowywaniu na przykład urządzeń przenośnych zasilanych z baterii. Pierwsza metoda podnoszenia mocy obliczeniowej (i przy okazji mocy rozpraszanej) poprzez zwiększanie częstotliwości zegara wydaje się dobiegać kresu swych możliwości. Co prawda w doniesieniach stale podnosi się granica „fizycznych” możliwości krzemu, niemniej jednak ta granica niewątpliwie istnieje i jeżeli nie nastąpi jakiś przewrót w rodzaju stosowanego elementu przełączającego, możliwości tej metody wydają się dobiegać kresu. Inaczej jest natomiast z drugą metodą. Tutaj ciągle jeszcze jesteśmy na początku drogi rozwoju i jest w tej dziedzinie dużo do zrobienia. Kontynuując sposób rozumowania, jaki doprowadził do powstania procesorów DSP należy pójść dalej i zapostulować powstanie architektur dedykowanych nie tylko do wydzielonej klasy algorytmów, ale do dowolnego algorytmu indywidualnie. Takie rozwiązania oczywiście istnieją i znalazły zastosowanie tam gdzie innymi metodami nie dało się spełnić wymagań, co do czasu wykonywania obliczeń, czy pobieranej mocy. Są jednak dwie przeszkody stojące na drodze do ich upowszechnienia. Po pierwsze jest to koszt opracowania. Bazując na procesorze ogólnego stosowania projektant przy opracowywaniu programu do rozwiązania zadania wspomagany jest przez niezliczone narzędzia programistyczne i uruchomieniowe. Znakomicie ułatwia i przyśpiesza to proces tworzenia projektu softwarowego. Dzięki temu koszt softwaru nie jest duży. Proces projektowania architektury sprzętowej jest znacznie trudniejszy, a wspomagające w tym oprogramowanie nie bardzo rozwinięte. Ponadto opracowany software można od razu uruchomić i używać. Zaprojektowany hardware wymaga natomiast odpowiedniej fabrykacji. Drugą z dwóch wspomnianych przeszkód jest koszt użytkownika końcowego korzystającego z danego rozwiązania. Jeżeli użytkownik ten rozwiązuje swoje problemy na procesorze ogólnego stosowania to koszt polega na zakupieniu lub opracowaniu odpowiedniego oprogramowania. W przypadku rozwiązania sprzętowego należy zakupić np.: 9 odpowiednią kartę rozszerzeń do swojego komputera zaopatrzoną w odpowiedni procesor dedykowany do odpowiedniego zadania. Ponieważ, jak wspomniano łatwiej i szybciej wykonać projekt programowy niż sprzętowy pierwszy koszt musi być i jest niższy. Nad usunięciem problemu uciążliwości projektowania sprzętu trwają ciągłe prace. Wysiłek firm produkujących oprogramowanie wspomagające projektowanie sprzętu zmierza do tego, aby możliwe było dokonanie automatycznej konwersji algorytmu zapisanego w języku programowania wysokiego poziomu na odpowiednią sieć bramek logicznych. Współczesne algorytmy syntezy, a więc zamiany opisu na sieć bramek systemu cyfrowego wymagają ogromnych mocy obliczeniowych. Paradoksalnie więc rozwój gigahercowych procesorów jest konieczny dla rozwoju i upowszechnienia architektur prostszych. Problem kosztu i fabrykacji rozwiązań sprzętowych praktycznie już został usunięty. Wraz z pojawieniem się układów logiki reprogramowalnej stało się możliwe kształtowanie architektury systemu obliczeniowego zgodnie z aktualnie wykonywanym algorytmem zadania. Systemy rekonfigurowalne, to nie tylko możliwość zmiany konfiguracji w ramach odrębnych algorytmów. Zastosowanie do procesu obliczeń układu procesora rekonfigurowalnego pozwala również na oszczędność powierzchni zastosowanego układu półprzewodnikowego. Niejednokrotnie w stosowanych układach znajdują się bloki „uśpione”, lub bloki aktywowane na przemian, nigdy nie aktywne równocześnie. Dla układu rekonfigurowalnego bloki takie mogą być ładowane do uniwersalnej struktury układu rekonfigurowalnego na przemian wykorzystując te same zasoby bramek cyfrowych, czy przerzutników. Powyższe spostrzeżenia stanowiły wystarczający bodziec dla podjęcia tematu rekonfigurowalnych, dedykowanych systemów obliczeniowych. Obserwując rozwój współczesnej techniki, można zauważyć, że do dynamicznie rozwijających się rozwiązań komputerowych, w przeciągu ostatnich 10 lat dołączyły rozwiązania telekomunikacyjne. Rozwój telekomunikacji wiąże się niewątpliwie z upowszechnieniem sieci Internet i telefonii komórkowej. Do tradycyjnego już przesyłu dźwięku dołączyła potrzeba przesyłania po łączach telekomunikacyjnych również obrazu. W tym kontekście nowego znaczenia nabrał problem kompresji informacji wizyjnej, a więc takiego zmniejszenia objętości informacji wizyjnej, aby zmieściła się ona w dostępnym kanale przesyłowym. 10 Problem kompresji obrazu wiąże się nie tylko z przesyłaniem, ale oczywiście również z archiwizacją danych. Systemy kompresji obrazu wykorzystywano od dawna w profesjonalnym, studyjnym sprzęcie telewizyjnym, gdzie technika cyfrowa pojawiła się wcześniej niż w sprzęcie domowym. Jednak wraz z postępująca cyfryzacją przekazu telewizyjnego wcześniej opracowane systemy kompresji takie jak MPEG-2 [71] pojawiły się w urządzeniach powszechnego użytku. Oczywiście upowszechnienie rozwiązań w przypadku elektroniki jest najlepszym sposobem na obniżenie ceny bardzo drogich i wyrafinowanych koderów i dekoderów wideo. Jednocześnie dzięki wzrastającej mocy obliczeniowej procesorów możliwe stało się opracowanie softwarowych rozwiązań, które umożliwiają dekodowanie skompresowanego strumienia wideo z szybkością umożliwiającą równoczesne jego oglądanie. Zgodnie z powyższym mogłoby się wydawać, że problem kompresji sygnału wizyjnego jest już rozwiązany. Należy jednak pamiętać, że nawet przy obecnej mocy obliczeniowej, procesory ogólnego stosowania nie są w stanie przeprowadzić o wiele bardziej złożonego w przeciwieństwie do dekodowania procesu kodowania. Kodowanie ciągle zajmuje o wiele więcej czasu niż czas trwania kompresowanej sceny. W związku z tym przy użyciu procesora ogólnego przeznaczenia nie możliwe jest stworzenie systemu czasu rzeczywistego, w którym ustanowionoby dwukierunkowy przekaz wideo. Tego typu systemy wideokonferencyjne muszą bazować na sprzętowych systemach specjalizowanych. Upowszechnienie tego typu rozwiązań specjalizowanych wiąże się oczywiście z problemami, o których już była mowa. Należy więc zastanowić się nad możliwością zastosowania w systemach kompresji obrazu układów rekonfigurowalnych. 1.2. Cel i teza pracy Znane są adaptacyjne warunki pracy algorytmów kompresji obrazu. Na przykład proces kodowania entropowego daje lepsze rezultaty, jeżeli zastosuje się kodowanie z adaptacyjną zmianą książki kodowej. Jednak najważniejszym elementem kompresji obrazów jest proces kwantyzacji współczynników obrazowych. Sterowanie procesem kwantyzacji odbywa się pod wpływem wielu czynników zależnych od warunków i stopnia kompresji. Mogą to być: • żądany stopień kompresji, • żądana jakość obrazu, 11 • rodzaj kodowanej sceny, • kodowania wewnątrz/między obrazowe. Wiadomo także, że nie wymagająca obliczeniowo kwantyzacja skalarna nie jest najlepszym z możliwych rodzajów kwantyzacji, które można stosować. O wiele bardziej obiecujące rezultaty kodowania obrazów (i nie tylko) można osiągnąć stosując kwantyzację wektorową. W przeciwieństwie jednak do kwantyzacji skalarnej, kwantyzacja wektorowa jest znacznie bardziej wymagająca, jeśli chodzi o ilość koniecznych w celu jej przeprowadzenia obliczeń. Stąd ewentualna potrzeba akceleracji sprzętowej. Powiązanie adaptacyjności algorytmów i ich wymagań obliczeniowych nasuwa pomysł przydatności w tej dziedzinie układów logiki reprogramowalnej. Celem pracy jest sprawdzenie możliwości realizacji algorytmu kwantyzacji w układach logiki reprogramowalnej. Należy zatem dokonać przeglądu stosowanych algorytmów kwantyzacji wektorowej pod kątem ich przydatności do realizacji sprzętowej, a następnie dokonać powyższej realizacji, aby otrzymać konieczne do realizacji zasoby sprzętowe, które będzie można odnieść do zasobów oferowanych przez współczesne układy FPGA (ang. Field Programmable Gate Arrays). W wyniku powyższych spostrzeżeń sformułowano następującą tezę: „Zastosowanie układów programowalnych umożliwia implementację specjalizowanej architektury kwantyzatora dla potrzeb kompresji sygnału wizyjnego pracującej w czasie rzeczywistym o dużych możliwościach adaptacji w zakresie zmiany parametru gęstości bitowej kwantyzatora w celu dostosowania kroku kwantyzacji do wymogów alokacji bitów kwantowanego sygnału oraz osiągniecia skalowalności kodowania i sterowania strumieniem danych.” 1.3. Organizacja pracy Niniejszą pracę podzielono na 11 rozdziałów poświęconych zagadnienom kompresji obrazu, kwantyzacji wektorowej PVQ, problematyce układów reprogramowalnych i architektur dedykowanych. Rozdział 1: ”Wprowadzenie”, to ogólne wprowadzenie do poruszanej w pracy problematyki. Rozdział zawiera tezę pracy i jej główny cel. W rozdziale zawarto również informację na temat genezy podjetego tematu. 12 Rozdział 2: ”Kodowanie obrazów” przedstawia podstawowe zagadnienia z tematu kompresji obrazów statycznych bazującej na dekompozycji. Przedstawiono podstawowe elementy składowe tej kompresji i wzajemne ich powiązanie. Omówiono dekompozycję oraz skrótowo kodowanie entropijne. Ważnym podrozdziałem jest rozdział o kwantyzacji ze szczególnym uwzglednieniem kwantyzacji wektorowej. Następnie omówiono bardzo istotną dla celowości całej pracy tematykę alokacji bitów. W rozdziale: „Kodowanie sekwencji” przedstawiono dodatkowe techniki służące efektywnemu przeniesieniu metod kompresji obrazów statycznych na problem kodowania sekwencji. Przedstawiono estymację ruchu. Ważną częścią rozdziału jest zagadnienie sterowania strumieniem bitów zakodowanej sekwencji wideo. Rozdział 4: „Algorytm kwantyzacji PVQ” wyjaśnia algorytm kwantyzacji wektorowej „Pyramid Vector Quantization”(PVQ), który został wybrany do sprzętowej realizacji przez autora. Algorytm PVQ podzielono na dwie części kwantyzację i kodowanie. Jako podklasę algorytmu PVQ przedstawiony został również algorytm PCPVQ, który może być mniej wymagajacy w sprzętowej realizacji. W rozdziale 5: „Kwantyzacja PVQ w systemach kompresji obrazu” dokonano przeglądu prac związanych z zastosowaniem algorytmu PVQ i jego mutacji w systemach kompresji obrazu. Zacytowano w nim wyniki kodowania PVQ przestawione w przach różnych autorów, którzy stosowali ten rodzaj kwantyzacji w systemach kompreji obrazów statycznych i obrazów wideo. W rozdziale 6: „Algorytm przeznaczony do realizacji sprzętowej” wskazano na wszelkie zmiany i modyfikacje wprowadzone przez autora w algorytmie PVQ w stosunku do oryginału, mające na celu ułatwienie, czy też wręcz umożliwienie jego sprzętowej realizacji. Rozdział 7: „Architektura sprzętowa” poświęcony został omówieniu szczegółów realizacyjnych algorytmu PVQ. Struktura proponowanej realizacji sprzętowej opisana została w języku VHDL. Istotnym elementem rozdziału jest oszacowanie kosztu koniecznych zasobów sprzetowych wymaganych do realizacji poszczególnych bloków architektury W rozdziale 8: „Rekonfigurowalny system kodowania obrazu” autor zawarł i opisał propozycję budowy i schematu działania układu kompresji sygnału wideo z wykorzystaniem rekonfigurowalnego systemu kwantyzatora PVQ. W rozdziale wskazano na istotne zalety stosowania układów rekonfigurowamnych do procesu kwantyzacji. Rozdział 9: „Praktyczna implementacja algorytmu PVQ w układach reprogramowalnych VIRTEX” zawiera wyniki fizycznej realizacji zaprojektowanych struktur kwantyzatora 13 w układach reprogramowalnych firmy Xilinx. W rozdziale tym można znaleźć informację na temat sposobu fizycznej implementacji oraz rodzaju stosowanych przez autora narzędzi. W sposób przewrotny do powszechnego założenia, że rodzaj i parametry kompresji obrazu klasycznie wynikają z docelowej gęstości strumienia bitów Rozdział 10 zatytuowano ”Kodowanie obrazów determinowane sprzętem”. Zdając sobie sprawę z uproszczeń i ograniczeń narzuconych na parametry realizowanego algorytmu poprzez fakt implementacji sprzętowej autor przedstawił wyniki kompresji obrazów z wykorzystaniem parametrów fizycznie zaimplementowanego algorytmu. Istota rozdziału polega na stwierdzeniu faktu, że rozmiar stosowanego układu FPGA decyduje o jakości kodowania. Rozdział 11: „Zakończenie” to rozdział podsumowujący rezultaty badań i uzyskane wyniki. 14 2. Kodowanie obrazów 2.1. Wstęp Informacja wizualna jest dla człowieka podstawowym źródłem poznawania i rozumienia świata, który go otacza. Obok informacji fonicznej jest również najważniejszym sposobem komunikowania się ludzi między sobą. Trwające wysiłki, aby przekazywanie obrazu stało się równie powszechne jak przekazywanie dźwięku (telefonia) wydają się być w pełni uzasadnione. Jednak szczególna wartość obrazu wynikająca z ogromnej ilości informacji zawartej w jego treści, powoduje równocześnie trudności w znalezieniu kanałów przesyłowych o odpowiedniej przepustowości. Prowadzone w tej pracy rozważania dotyczyć będą, cyfrowej reprezentacji obrazu. Cyfrowy sygnał wideo w formie otrzymywanej z przetwornika wizyjnego A/C próbkowanego sygnału analogowego cechuje się taką szerokością pasma, że dyskwalifikuje ona go z przesyłania powszechnie dostępnymi kanałami transmisyjnymi. Dla przykładu używany powszechnie format CCIR601 PAL/SECAM wymaga 25ramek ∗ 720 pikseli ∗ 576linii ∗ 2skladowe _ koloru ∗ 8bitów = 1sekunda = 20736000bajtów / sek ≈ 165Mbitów / sek Niejednokrotnie część informacji zawarta w obrazie jest nieistotna nie tylko z punktu widzenia odbiorcy jako jednostki zainteresowanej określonym aspektem ogólnym, ale także odbiorcy jako człowieka o ograniczonych możliwościach rozróżniania różnego rodzaju szczegółów. Dlatego kodowanie obrazów ma na celu po pierwsze odrzucenie części informacji nadmiarowej w celu przesłania niezbędnego minimum, koniecznego do odtworzenia oryginału (redundancja informacji wizyjnej), a po drugie odrzucenie informacji nieistotnej z punktu widzenia subiektywnego odbiorcy (fizjologia wzroku ludzkiego). Te zabiegi umożliwiają efektywne wykorzystanie kanałów przesyłowych. Kodowanie nabiera szczególnego znaczenia przy przesyłaniu obrazów ruchomych, kiedy to wymagane jest przesyłanie wielu obrazów w krótkim czasie. Kodowanie obrazu jest procesem niezmiernie złożonym obliczeniowo, co powoduje, że systemy kodujące obrazy w czasie rzeczywistym są bardzo złożone, a przez to bardzo drogie. Nie sprzyja to oczywiście upowszechnieniu systemów przekazywania obrazów. 15 Konieczne wydaje się więc poszukiwanie sposobów na uczynienie rozwiązań kodowania obrazów bardziej ekonomicznymi. Możliwe jest opracowywanie specjalnych algorytmów o mniejszej złożoności obliczeniowej, a przez to dających się realizować na prostszym sprzęcie. Ta możliwość nie wydaje się być poważnie rozwijana, prawdopodobnie ze względu na niewiarygodnie szybki rozwój nowych procesorów i ich mocy obliczeniowych. Poza tym na obecnym poziomie rozwoju i przepustowości dostępnych sieci teletransmisyjnych możliwość obniżania złożoności obliczeniowej przy jednoczesnym pogorszeniu efektywności kodowania nie jest atrakcyjna. Druga możliwość to opracowywanie specjalnych dedykowanych architektur sprzętowych, które dysponując dużą mocą obliczeniową w odniesieniu do szczególnego algorytmu dają się implementować na małych powierzchniach krzemu. Ta droga znajduje swoje odbicie w różnego rodzaju koprocesorach, czy akceleratorach sprzętowych do przeprowadzania złożonych, często powtarzanych, operacjach multimedialnych. (np.: technologia MMX w procesorze Pentium) Nowe możliwości w dziedzinie kodowania obrazu są związane z układami o reprogramowalnej logice typu FPGA. Wielkie pojemności współczesnych układów FPGA (ok. 10 miliona bramek) dają możliwość implementowania w nich architektur sprzętowych o złożoności koniecznej przy kompresji obrazu. Wprowadzają one możliwość osiągnięcia większej funkcjonalności sprzętu przy mniejszej jego złożoności. Dlatego właśnie praca ta podejmuje temat i przedstawia możliwość kodowania obrazu w czasie rzeczywistym przy użyciu dedykowanej architektury sprzętowej, która została przygotowana do zaimplementowania w strukturach reprogramowalnych. 2.2. Kodowanie oparte na dekompozycji Dane obrazowe charakteryzują się przestrzenną nadmiarowością informacji. Oznacza to, że jasność punktów obrazowych znajdujących się w niewielkiej odległości od siebie jest wzajemnie skorelowana. Ponadto jeżeli rozważany obraz jest prezentowany do odbioru człowiekowi, to sposób w jaki wzrok ludzki go odbiera dodatkowo filtruje dostarczane bodźce w taki sposób, że wrażenie korelacji jest większe niż w rzeczywistości. Metody kodowania (kompresji) obrazu opierają się właśnie na wykorzystaniu tej istniejącej faktycznie i tej złudnej redundancji przestrzennej informacji i przekształcania obrazu w taki sposób, aby doprowadzić do nowej (równoważnej) jego reprezentacji pozbawionej wzajemnej korelacji punktów. 16 Klasą najpowszechniej stosowanych algorytmów, ze względu na możliwą do zaakceptowania złożoność obliczeniową, są metody oparte na dekompozycji obrazu. Dekompozycję obrazu przeprowadza się w celu usunięcia wzajemnej korelacji pikseli obrazu. Praktyka pokazuje, że kodowanie danych nie skorelowanych daje o wiele lepsze rezultaty, a informacja zawarta w pojedynczym zakodowanym współczynniku nie jest powielana podczas kodowania innego. Schemat blokowy opartego na dekompozycji systemu kompresji obrazu przedstawia rysunek (Rys. 1.) OBRAZ ORYGINALNY Dekompozycja obrazu Kwantyzacja Kodowanie entropowe (opcjonalnie) OBRAZ SKOMPRESOWANY Rys. 1. Oparta na dekompozycji kompresja obrazu. Ogólnie sposoby dekompozycji ze względu na sposób ich przeprowadzania można podzielić na oparte na transformatach i oparte na filtracji. 2.2.1. Transformaty Ponieważ wzajemna korelacja punktów w obrazie szybko zmniejsza się ze wzrostem odległości, z praktycznego punktu widzenia można powiedzieć, że dla pikseli odległych od siebie o kilka punktów obrazowych korelacja jest na tyle mała, że można ją zaniedbać. Stąd też zadaniem transformat jest takie przekształcenie wektora wejściowego X(x1,x2,...,xn) złożonego z punktów bezpośrednio sąsiadujących ze sobą, aby w wyniku przekształcenia ( 1) otrzymać wektor Y(y1,y2,...,yn) danych zdekorelowanych. Y = TX ( 1) Dla źródła sygnału stacjonarnego dobranie macierzy T w taki sposób, aby wszystkie współczynniki macierzy kowariancji wektora Y nie leżące na przekątnej były zerowe (brak korelacji yn i ym dla n≠m) prowadzi do transformacji Karhunena-Loevego (KLT) [127]. Transformata ta wymaga obliczenia macierzy kowariancji dla każdego strumienia próbek jest więc transformatą dynamiczną. W praktyce stosuje się inne transformaty, które są przybliżeniem transformaty KLT. Takie postępowanie jest usprawiedliwione tym bardziej, że co należy podkreślić praktyczny sygnał wizyjny i tak nie spełnia warunków stacjonarności. 17 Transformatą, która zyskała największą popularność jest dyskretna transformata kosinusoidalna (DCT). Znalazła ona zastosowanie w takich standardach kompresji obrazu jak JPEG i MPEG. Transformata DCT została wprowadzona jako aproksymacja transformaty KLT dla procesu Gaussa z dużymi współczynnikami korelacji współrzędnych X (E(xnxm)→1, n≠m; E(xnxn)=1). Należy podkreśli, ze transformata DCT bardzo dobrze sprawdza się również w praktyce. Sposób obliczenia współczynników transformaty DCT wyraża się zależnościami ( 2). y0 = yk = 1 N 2 N N −1 ∑x n , n/o 2π (2 n + 1)k x n cos ∑ 4N n/0 N −1 , k = 1,..., N − 1 . ( 2) Po zastosowaniu transformaty DCT dla typowych praktycznie występujących obrazów okazuje się, że energia (wartość) współczynników po transformacji jest zlokalizowana wokół pewnej grupy współczynników podczas gdy inne mają niewielkie amplitudy. Można to wytłumaczyć stosując inne podejście do transformaty DCT, które ujawnia jej podobne do transformaty Fouriera filtrujące właściwości. W podejściu tym transformatę DCT traktuje się jak dekompozycję częstotliwościową sygnału. Współczynniki o dużej energii okazują się być niskoczęstotliwościowymi składowymi dekompozycji częstotliwościowej, podczas gdy te o niewielkich wartościach są składowymi wysokoczęstotliwościowymi. Obrazowo przedstawia to rysunek (Rys. 2). Na rysunku tym ciemniejsze pola odpowiadają większym wartościom. DCT Rys. 2. Graficzne zobrazowanie przekształcenia DCT Transformacie DCT typowo poddawane są wyodrębnione z obrazu bloki danych o rozmiarze 8×8 pikseli. Jest to wada tej metody dekompozycji obrazu, ponieważ powoduje utrzymanie korelacji danych zawartych w sąsiadujących blokach. Ten efekt brzegowy transformaty DCT jest często widoczny w zakodowanym i w zdekodowanym obrazie. Aby uniknąć występowania efektu nieciągłości na krawędziach, zwrócono uwagę na możliwość 18 zastosowania transformat zachodzących [tłum. autora] (ang. lapped transforms) [145], które w konsekwencji prowadzą do banków filtrów (ang. filter banks) i stosowania dekompozycji opartej na filtracji podpasmowej. 2.2.2. Kodowanie podpasmowe. Fundamentem kodowania opartego na dekompozycji sygnału wizyjnego na podpasma (ang. subband coding) jest podział tego sygnału na składowe w dziedzinie częstotliwości. W odróżnieniu od DCT podział ten jest bardziej jawny, odbywa się bowiem przy użyciu filtru cyfrowego i wykonywany jest w sposób ciągły bez segmentacji danych wejściowych na bloki. Bank filtrów składa się z zespołu filtrów analizujących: dolnopasmowego H0 i górnopasmowego H1, oraz filtrów syntezujących: również górnopasmowego G0 i dolnopasmowego G1 (Rys. 3). Zdekomponowane składowe mają różne właściwości statystyczne oraz różną ilością niesionej przez siebie informacji i dlatego są kodowane niezależnie z różną dokładnością. FDP 0 FGP F/4 F/2 Rys. 3. Bank filtrów. (a) analizujący, (b) syntezujący Filtry są dobrane w ten sposób, że dzielą pasmo sygnału dokładnie na połowę. Dobór filtrów nie jest zagadnieniem oczywistym. Należy zwrócić uwagę, że aby nie doprowadzić do utraty części informacji filtry powinny pokrywać cały zakres pasma częstotliwościowego. Rysunek (Rys. 4) pokazuje jak praktycznie budowane filtry mogą zapewnić spełnienie tego warunku. Widać, że częstotliwości w pobliżu F/4 (obszar zaznaczony na czarno) zawierają się po filtracji w częstotliwościowej składowej górnej i dolnej sygnału. Jest to niedogodność, którą należy uwzględnić podczas odtwarzania sygnału. Poprawne odtworzenie obrazu pierwotnego wymaga stosowania filtrów syntezujących odpowiednio górnoprzepustowego i dolnoprzepustowego. Zastosowanie dodatkowego kryterium umożliwia taki ich dobór, który kompensuje aliasing filtrów analizujących sygnał na wejściu. 19 2↓ H o (z) 2↑ G o (z) X (z) Σ 2↓ H 1 (z) 2↑ (a) Y (z) G 1 (z) (b ) Rys. 4. Podział pasma przez bank filtrów Zastosowanie filtrów w przetwarzaniu obrazów narzuca dodatkowe warunki, które muszą one spełniać. Przede wszystkim zastosowane filtry powinny zapewniać liniową fazę. Jeżeli taki warunek nie jest zapewniony należy liczyć się z dużymi zniekształceniami na krawędziach. Szczególnej mocy warunek nabiera jednak wtedy, kiedy zastosowana kwantyzacja, co ma zazwyczaj miejsce w odniesieniu do wyższych częstotliwości, nie jest dokładna. Kolejnym warunkiem jest zapewnienie ortogonalności użytych filtrów. Znaczenie tego ma związek z alokacją bitów. Dla filtrów ortogonalnych bowiem zachodzą zależności: σ 2 = ∑σ 2 i . ( 3) i D= ∑D i . i ( 4) gdzie: σ - wariancja dekomponowanego sygnału, σi - wariancja i-tej składowej dekompozycji. D - całkowitym błędem kodowania, Di - błąd kodowania i-tego pasma. Tak więc wariancja sygnału jest sumą wariancji sygnałów składowych, a całkowity błąd jest sumą błędów składowych. Nie spełnienie tego warunku utrudnia rozwiązanie problemu alokacji bitów dla podpasm (patrz podrozdział 2.4). W praktyce okazuje się, że zapewnienie warunku ortogonalności i liniowości fazy dla filtrów jest możliwe tylko w jednym, jedynym trywialnym przypadku dwupunktowych filtrów Haar’a. Dlatego do dekompozycji stosuje się filtry biortogonalne o liniowej fazie, które w przybliżeniu można traktować jako ortogonalne i dlatego zachowujące własność ( 4). Filtry stosowane w kompresji powinny być raczej krótkie. Zbyt długi filtr w połączeniu z niedokładnym kodowaniem wyższych składowych częstotliwościowych powoduje artefakty nazywane dzwonieniem[127]. 20 W skład każdego z torów filtrujących wchodzi dodatkowo układ decymatora (2↓) (ang. downsampling) i interpolatora (ang. upsampling). W decymatorze ilość próbek wychodzących z filtru jest zmniejszana o połowę (odrzucana jest co druga). W celu uzupełnienia tych odrzuconych próbek interpolator zwiększa liczba próbek w sygnale wprowadzając jako co drugą próbkę wartość zerową. Zabieg zmniejszenia liczba próbek nie zmienia ilości informacji zawartej w sygnale. Ponieważ filtr zawęża pasmo sygnału o połowę dlatego dwukrotnie może być zmniejszona częstotliwość próbkowania. Wynika to z twierdzenia o próbkowaniu i kryterium Nyquista. Przedstawiony powyżej bank filtrów jest bankiem dwukanałowym z równomiernym podziałem pasma, tzn. dzieli pasmo częstotliwości na dwa podpasma równej szerokości. Niejednokrotnie zachodzi potrzeba podzielenia w dziedzinie częstotliwości sygnału na kilka składowych. W takim przypadku powstaje konieczność zaprojektowania wielokanałowego banku filtrów. Najprostszą metodą na skonstruowanie takiego filtru jest kaskadowanie istniejącego banku dwukanałowego. Oczywiście zarówno dwukanałowy jak i wielokanałowy system nie musi dzielić pasma na podpasma równej szerokości. Kiedy taki jest spełniony zachodzi mamy do czynienia z jednorodnym bankiem filtrów (ang. uniform filter bank). W przypadku kodowania obrazu często interesuje nas system, w którym pasma mają równe szerokości w skali logarytmicznej (log2) (ang. octave fiter bank). Oznacza to, że kolejne podpasmo są dwukrotnie szersze od pasma go poprzedzającego (Rys. 5). Choć istnieją aplikacje używające do kodowania obrazów banków jednorodnych, podział logarytmiczny w sposób lepiej zapewnia grupowanie współczynników zgodnie z ich właściwościami statystycznymi. 0 F/16 F/8 F/4 F/2 Rys. 5. Logarytmiczny podział pasma Sposób kaskadowej realizacji wielokanałowego banku filtrów do logarytmicznego podziału pasma przedstawia rysunek (Rys. 6). W takim rozwiązaniu kolejnemu filtrowaniu podlega tylko pasmo o najmniejszej częstotliwości. 21 H1 2↓ H1 S H0 2↓ 2↓ H0 H1 2↓ H0 2↓ 2↓ (a) 2↑ G1 2↑ G0 2↑ G1 2↑ G0 2↑ G1 2↑ G0 ~S (b) Rys. 6. Kaskadowa realizacja oktawowego banku filtrów H0 LL2 S LL1 H0 H1 H1 H0 LH2 H0 LH1 S H0 LH1 H1 H1 H1 HL2 H0 H1 Poziomo Pionowo HL1 HH1 HH2 LH2 HH2 LL2 HL2 HL1 HH1 Poziomo Pionowo H0-filtr dolnoprzepustowy H1-filtr górnoprzepustowy Rys. 7. Dwuwymiarowa dekompozycja falkowa obrazu 22 Dekompozycja z użyciem logarytmicznego banku filtrów nosi nazwę transformaty falkowej (ang. wavelet transform). Pierwotnie dekompozycja podpasmowa została wprowadzona dla kodowania sygnału audio (Criosier 1976r.). Rozszerzenie tej dekompozycji na sygnały 2-D zostało zaproponowane w [128]. Do problemu można podejść dwojako. Prostsze rozwiązanie polega na zastosowaniu technik filtrowania znanych dla problemów 1-D do sygnałów wielowymiarowych filtrując niezależnie każdy wymiar sygnału. Praktycznie, dla obrazu odbywa się to w ten sposób, że dane wizyjne są filtrowane na przemian w dwóch kierunkach: pionowo i poziomo (Rys. 7). Inną metodą rozwijaną obecnie jest łączne traktowanie obydwu wymiarów. Takie podejście daje szersze możliwości doboru filtrów oraz większą swobodę w wyborze punktów, w których próbkowany jest obraz (Rys. 8). Filtrowanie niezależne daje możliwość wyboru tylko takiej siatki próbkowania, którą można przedstawić w formie macierzy [127]. Z drugiej jednak strony uniezależnienie filrtowania w kierunku pionowym i poziomym prowadzi do prostszych rozwiązań praktycznych. (b) (a) Rys. 8. Próbkowanie obrazu w różnych systemach dekompozycji. (a) filtrowanie niezależna, (b) filtrowanie zależne Przykład przy poziomowej dekompozycji falkowej obrazu „Lena” przy użyciu biotrogonalnego, dwukanałowego banku filtrów przedstawia rysunek (Rys. 9). Po pierwszym przejściu przez system filtrujący składowa LL1 zostało powtórnie poddana filtracji, a następnie podobnie składowa LL2. Dla potrzeb kompresji obrazu stosuje się dekompozycję falkową trzy-, cztero- lub pięciopoziomową. 23 LH1 HH1 LH2 HH2 HL1 LH3 HH3 HL2 LL3 HL3 Rys. 9. Dekompozycja falkowa obrazu „Lena” 2.3. Kwantyzacja Klasycznie procesem kwantyzacji nazywane jest przypisanie nieskończonego, ciągłego zbioru elementów skończonemu zbiorowi elementów. Taka definicja odpowiada procesowi digitalizacji sygnału analogowego. W odniesieniu do problemu kodowania, w którym przed i po kwantyzacji mamy do czynienia z sygnałem cyfrowym mówimy o procesie kwantyzacji dyskretnej tj. o przypisaniu skończonego zbioru wartości o liczności N wartościom ze zbioru o liczności M. Oczywiście proces ten ma sens praktyczny jeżeli M<N. Proces kwantyzacji dyskretnej związany jest z błędem kwantyzacji DX, który wyraża związek ( 5). DX = N ∑ i/0 Q X n − Ym ν PX ( X n ); Ym = Q ( X n ); { X n } → {Ym } ( 5) gdzie: •ν-przyjęta metryka odległości (norma) (dla ν=1 błąd wyrażony jest przy pomocy MAE (ang. Mean Absolute Error), dla ν=2 błąd wyrażony jest przy pomocy, MSE 24 (ang. Mean Square Errorr)). Zgodnie z ( 31), {Xn}-zbiór kwantowanych elementów, {Yn}-zbiór elementów skwantowanych, PX funkcja gęstości prawdopodobieństwa w zbiorze {Xn}, Q() jest dyskretną funkcją kwantyzacji. Celem kwantyzacji jest zaprojektowanie optymalnego kwantyzatora dla danego {Xn}, PX i M, czyli dobranie najkorzystniejszego w danym przypadku {Ym} i Q(). W 1957 roku Lloyd podał iteracyjny algorytm, który prowadzi do uzyskania optymalnego kwantyzatora dla ciągłego sygnału X o określonej funkcji gęstości prawdopodobieństwa PX przy określonej liczności M zbioru {Ym}. Algorytm ten opiera się na postulatach optymalności kwantyzatora i dekwantyzatora. Dla kryterium MSE postulaty te można przedstawić następująco[41]: a) Postulat optymalności kwantyzatora. Postulat sąsiedztwa (ang. Nearst Neighbour Condition). Q ( X ) = Yi ⇔ ∀ i≠ j X − Yi 2 ≤ X − Yj . 2 ( 6) b) Postulat optymalności dekwantyzatora. Postulat środków ciężkości (ang. Centroid Condition). Y i = E [X Q ( X ) = Y i ] . ( 7) Pierwszy postulat zapewnia, że dla danego zbioru {Yi}, jeżeli narzucony jest sposób dekwantyzacji, punktom zbioru X będzie przypisywany najbliżej leżący punkt Yi. Drugi postulat wymaga, aby odtworzona przez dekwantyzator wartość, przy narzuconym sposobie kwantyzacji, była wartością oczekiwaną punktów zbioru X leżących w jednym obszarze kwantyzacji. Algorytm Lloyda zakłada iteracyjne dochodzenie do optymalnego systemu kwantyzatora / dekwantyzatora stosując na przemian obydwa warunki [75]. W rezultacie otrzymujemy tzw. kwantyzator Lloyda-Max’a. Zazwyczaj, zagadnienie kwantyzacji nie jest związane z kompresją. Dobranie optymalnego kwantyzatora nie gwarantuje minimalnego strumienia danych. Z zagadnieniem kompresji wiąże się z problem kodowania, czyli przypisania elementom zbioru {Ym} odpowiednich symboli alfabetu wyjściowego, zgodnie z postulatami kodowania entropowego (patrz Rozdział 2.5). 25 Teoria kwantyzacji daje odpowiedź na pytanie co powinno być przesłane, aby przy danej liczności zbioru Y otrzymać najmniejsze DX. Problem kodowania to problem jak wybrane symbole zbioru Y mają być przesyłane. Te dwa problemy w procesie kompresji są rozdzielone. 2.3.1. Kwantyzacja skalarna Szczególny przypadek, w którym elementy Xn i Ym są wartościami liczbowymi nazywamy kwantyzacją skalarną. 2.3.2. Kwantyzacja wektorowa Jeżeli pojęcie kwantyzacji skalarnej jest ściśle związane z problemem cyfrowej reprezentacji sygnałów analogowych, to kwantyzacja wektorowa jest zadaniem reprezentacji dyskretnego zbioru elementów przez inny dyskretny zbiór. W kwantyzacji wektorowej zbiory nie składają się z pojedynczych wartości, ale z wielowymiarowych wektorów utworzonych z wartości próbek sygnału. Zacznie rozszerza to możliwości kształtowania kwantyzatora i czyni z kwantyzacji wektorowej potężne narzędzie dla kompresji danych. Poszukiwanie najlepszej reprezentacji dla wartości zorganizowanych w grupy (wektory) daje o wiele większe możliwości elastycznego doboru kwantyzatora. Niezależne kodowanie pojedynczych wartości prowadzi do regularnej przestrzeni kwantyzacji. Przykładowo dla dwóch zmiennych przedstawia to rysunek (Rys. 10). Widać, że kwantyzacja skalarna narzuca znaczne ograniczenia w doborze punktów kwantyzacji. X2 X1 Rys. 10. Budowanie siatki dwuwymiarowego odpowiednika kwantyzatora skalarnego Ograniczenia te szczególnie są widoczne kiedy należy zaprojektować optymalny kwantyzator dla przypadku kiedy dane wejściowe są ze sobą skorelowane. Jeżeli rozważymy przypadek funkcji gęstości prawdopodobieństwa dwóch zmiennych przedstawionych na rysunku (Rys. 11a), to widać że kwantyzacja skalarna tych zmiennych da ograniczone rezultaty (Rys. 11b). 26 Ponieważ wartość gęstości prawdopodobieństwa jest stała w zakreskowanych obszarach. przedstawiona funkcja jednoznacznie wskazuje na wzajemną korelację dwóch zmiennych. Dopiero łączne potraktowanie zmiennych i zaprojektowanie dwuwymiarowego kwantyzatora wektorowego jest naturalne dla tego przypadku. Równomierne rozłożenie w przypadku kwantyzacji skalarnej prowadzi do powstawania punktów kwantyzacji w miejscach przestrzeni gdzie zbiór danych wejściowych nie występuje. Można albo zbudować kwantyzator o lepszych właściwościach w oparciu o tyle samo punktów kwantyzacji co dla kwantyzatora skalarnego (Rys. 11c), albo kwantyzator o właściwościach takich samych dla mniejszej ilości punktów kwantyzacji (Rys. 11d). (a) (b) (c) (d) Rys. 11. Porównanie kwantyzacji wektorowej i skalarnej. (a) dwuwymiarowy rozkład gęstości prawdopodobieństwa zmiennych wejściowych, (b) rezultat kwantyzacji kwantyzatorem skalarnym, (c) kwantyzator wektorowy o identycznej co skalarny ilości punktów kwantyzacji, (d) kwantyzator wektorowy o jakości kodowania identycznej ze skalarnym Przedstawiony przykład przekonuje, że kiedy mamy do czynienia ze zmiennymi o rozkładach prawdopodobieństwa wzajemnie skorelowanych, kwantyzacja wektorowa staje się bardzo użytecznym narzędziem. Chociaż przedstawione wcześniej transformaty stosowane w kompresji obrazu mogą bardziej lub mniej skutecznie doprowadzić do dekorelacji danych, które dopiero później są kwantowane, nie zmienia to przewagi kwantyzacji wektorowej nad 27 skalarną. Kwantyzacja wektorowa daje również nowe możliwości w zakresie budowy kwantyzatora nawet w przypadku braku korelacji danych (Rys. 12). Przedstawiona siatka kwantyzatora w żaden sposób nie jest możliwa do realizacji przy pomocy technik jednowymiarowych, a przy tym jest najbardziej optymalna w przestrzeni 2D, a jej odpowiednik w przestrzeni 3D dla równomiernego rozkładu gęstości prawdopodobieństwa [23]. Rys. 12. Siatka kwantyzatora 2D typu ”plaster miodu” Powyższe stwierdzenie może prowadzić do wniosku, że w związku z posiadaniem tak uniwersalnego narzędzia jak kwantyzacja wektorowa, zbędne jest stosowanie transformat jako czynnika podnoszącego jakość kodowania. Tak jest w teorii. W praktyce rozmiar koniecznego do kwantowania wektora okazałby się tak duży, że niemożliwe byłoby praktyczne wykorzystanie, a nawet zaprojektowanie takiego kwantyzatora. Dlatego stosuje się techniki hybrydowe tzn. łączenie różnych technik kodowania, które okazują się bardzo użyteczne. Podczas projektowania siatki kwantyzatora jesteśmy zainteresowani uzyskaniem najmniejszego możliwego błędu kwantyzacji. Dla znanego zbioru punktów {Ym} (zwanego książką kodową) prowadzi to do uzyskania kwantyzatora Voronoi’a (ang. Nearest Neighbour Voronoi Quantizer). Kwantyzator postuluje, że obrazem wektora Xi jest taki punkt Yj, który jest mu najbliższy w sensie wybranej normy. Prowadzi to do powstania regionów Voronoi’a (Ri), w których znajdują się punkty X o wspólnej reprezentacji Yj { Ri = X : X − Yi 2 } < X − Y j ; j ∈ {1,.., M } 2 ( 8) Algorytm kodowania wektora X dla takiego kwantyzatora polega na przeszukiwaniu zbioru {Ym} i wybraniu na jego reprezentację punku Yi najbliżej leżącego w sensie wybranej normy. Do dekodera przesyłany jest indeks jednoznacznie odpowiadający punktowi Yi: i∈{1,..,M}. Istnieje wiele algorytmów obliczeniowych 28 umożliwiających realizację kwantyzatora Voronoi’a. Dla wymiarów wektora X oraz liczności zbioru {Ym} znajdujących zastosowanie w praktyce wymagają one sporych mocy obliczeniowych, co ogranicza zastosowanie praktyczne takiego kwantyzatora. Zastosowanie algorytmu wyczerpującego poszukiwania polegającego na obliczeniu odległości punktu X od każdego punktu Yj, a następnie wybranie odległości najmniejszej wymaga M*L mnożeń, L operacji odejmowania i L-1 operacji dodawania, gdzie L jest wymiarem kodowanego wektora. Zamiast obliczania odległości punktów w przestrzeni k wymiarowej możemy obliczać iloczyn skalarny wektorów. Ponieważ zachodzi związek min j gdzie α j = Yj 2 −1 X −Yj 2 −1 = max [ X T Y j + α j ] . ( 9) j 2 jest wartością stałą dla każdego Yj i może być zapamiętana, można algorytm wyczerpującego poszukiwania ograniczyć do M∗L mnożeń i L-1 dodawań. Powyższa propozycja ogranicza liczbę operacji potrzebnych do oszacowania odległości od pojedynczego wektora. Możliwe jest dalsze ograniczanie całkowitej ilości potrzebnych działań w drodze uporządkowania punktów kwantyzacji w drzewo decyzyjne. Przykładem jest algorytm TSVQ (ang. Tree Search Vector Quantization). Algorytm rozpoczyna działanie z najwyższego wierzchołka drzewa i w każdym węźle wykonywane jest porównywanie tylko dwóch wektorów. Z zależności od wyniku porównania wybierana jest gałąź drzewa, po której algorytm będzie poruszał się dalej. Procedura jest powtarzana, aż do osiągnięcia dna drzewa. W ten sposób potrzebne jest 2∗log2M kalkulacji dystansu kwantowanego wektora od węzłów kwantyzacji (Rys. 13). X 1 0 Y1 Y2 0 1 0 1 Y3 Y4 Y5 Y6 Rys. 13. TSVQ Mimo zaproponowanych i stosowanych w praktyce uproszczeń kwantyzacja wektorowa jest zazwyczaj zadaniem złożonym obliczeniowo. Stąd ciekawą propozycję stanowi podklasa kwantyzatorów wektorowych nazywana kwantyzatorami kratkowymi. 29 2.3.3. Kwantyzatory kratkowe Kwantyzatory kratkowe (ang. Lattice Quantizer) są podklasą kwantyzatorów wektorowych. Cechą je wyróżniającą jest regularność z jaką w przestrzeni kodowania rozłożone są punkty kwantyzatora. W ujęciu ogólnym punkty kwantyzacji mogły być rozłożone w przestrzeni zupełnie dowolnie, a ściślej w sposób jaki podyktowany był właściwościami kodowanego źródła danych. W rezultacie, tak otrzymane kwantyzatory sprawiają trudności w ich fizycznej realizacji. W praktyce współrzędne punktów kwantyzacji muszą być zapisane w pamięci ROM (lub RAM) kodera, który kolejno porównuje kodowany wektor z zapamiętanymi współrzędnymi. Stosując wybrane kryterium MSE lub MAE (ang. Mean Absolute Error) podejmuje on decyzję o wyborze odpowiedniego (najbliższego) reprezentanta kodowanego wektora w siatce kwantyzatora. Oczywiście zastosowanie odpowiednich technik umożliwia uproszczenie takiej procedury kodowania (patrz Rozdział 2.3.2), co nie zmienia jednak faktu większej złożoności obliczeniowej kodowania wektorowego niż skalarnego. Rozważana podklasa kwantyzatorów kratkowych dzięki wspomnianej regularności umożliwia znaczne uproszczenie poszukiwania punktu kwantyzacji wektora, sprowadzając ją do przekształceń geometrycznych. Kwantyzator kratkowy L wymiarowy zdefiniujemy jako strukturę wyznaczoną z punktów Y przestrzeni spełniającą równanie Y = L ∑m i ∗Ui ( 10) i/0 gdzie U1, U2, ..., UL - na stałe przyjęte dla danego kwantyzatora liniowo niezależne wektory, m1, m2, ..., mL - dowolne wartości całkowite. Macierz U=[ U1, U2, ..., UL] jest macierzą kwantyzatora. Macierz M=[ m1, m2, ..., mL] możemy interpretować jako współrzędne punktu siatki kwantyzatora w układzie którego bazę stanowi macierz U. Wektor Y jest wektorem utworzonym ze współrzędnych punktu w układzie kartezjańskim. Zachodzi zatem Y=M∗UT. W tak utworzonym kwantyzatorze również komórki Voronoi’a tworzą regularną strukturę jednakowych klastrów (Rys. 14). 30 0 U = 2 3 1 u1(0,2) u2(√3,1) Rys. 14. Dwuwymiarowa kratka z heksagonalnymi regionami Voronoi Książka kodowa kwantyzatora kratkowego nie musi i z praktycznego punktu widzenia nie może być zbudowana w oparciu o całą strukturę określoną przez macierz U. Należy zdawać sobie sprawę, że przesłanie poprzez kanał transmisyjny określonego punktu siatki wiąże się z nadaniem mu unikalnego kodu binarnego (indeksu). Rozważanie kratki o nieskończonych rozmiarach uniemożliwia to. Koniecznie należy zdecydować się na jakiś podzbiór całej kratki. Konieczne zatem jest odpowiednie dobranie obszaru, w którego obrębie rozważamy odpowiednią kratkę. Pierwszym krokiem jest ograniczenie kratki do obszaru zakresu danych występujących w kodowanym źródle. Dalsze ograniczenie jest ściśle związany z funkcją gęstości prawdopodobieństwa kodowanego źródła danych. Obszar kwantyzacji wskazane jest skoncentrować wokół obszaru najbardziej prawdopodobnego występowania kodowanych danych. W przypadku rozważanego w pracy kwantyzatora PVQ jest to powierzchnia hiperostrosłupa (sfery w przestrzeni l1). Mówiąc ściśle, w skład książki kodowej wchodzą tylko te punkty rozważanej kratki, które leżą na jego powierzchni. 2.4. Alokacja bitów Alokacja środków jakimi dysponujemy jest problemem bardzo ogólnym i nie ogranicza się tylko do kodowania obrazu, gdzie środkiem tym jest pasmo kanału przesyłowego. Celem alokacji jest taki podział środków pomiędzy zarządzane jednostki, aby cel, do którego dążymy zrealizować jak najlepiej. Często system kompresji wymaga zestawu kwantyzatorów, które służą do kodowania różnych parametrów transmitowanego obrazu (Rys. 15). Ponieważ 31 nie wszystkie parametry maja jednakowe znaczenie dla rekonstrukcji dokładność odpowiedniego kwantyzatora należy dobierać adekwatnie do znaczenia kodowanych danych i ich wpływu na rezultat końcowy. Podstawowym ogólnym parametrem takiego kwantyzatora jest oczywiście generowany strumień bitów. W globalnym ujęciu kodowania strumienie poszczególnych kwantyzatorów są sumowane. Całkowity strumień jednak nie może przekroczyć założonej wielkości. Zadanie polega na znalezieniu optymalnego podziału strumienia danych pomiędzy kwantyzatory tak aby jakość rekonstruowanego obrazu była maksymalna. Kodowane parametry oznaczymy przez X1, X2,..., XN, a odpowiednie strumienie przez B1, B2,...., BN. Całkowity strumień oznaczymy jako B. W praktyce zamiast pojęcia strumienia wygodniej posługiwać się pojęciem jego gęstości (ang. bitrate), którą oznaczymy jako R. Gęstość strumienia będzie liczba bitów danych przypadających na jednostkę kodowanej informacji. W przypadku kodowania obrazu jednostką informacji jest oczywiście piksel. Stąd jednostką gęstości kodowania obrazów jest liczba bitów na piksel (ang. bit per pixel, w skrócie bpp). Zachodzi R= N Ri ∑w i /1 ( 11) i gdzie R i i gęstości bitowe kwantyzatorów składowych, wi - odpowiednie wagi, które określają na ile pikseli przypada jeden parametr Xi kwantowany w kwantyzatorze Qi. Przypadek wielu kwantyzatorów jest oczywisty w odniesieniu do kodowania opartego na transformatach. W szczególności dla kodowania podpasmowego mamy informację, na którą składają się składowe częstotliwościowe, z których każdą kwantujemy indywidualnie. Q2 Kodowanie Dekompozycja Q1 QN Rys. 15. Kwantyzacja sygnału po dekompozycji 32 Aby możliwe było analityczne podejście do problemu alokacji należy dobrać miarę jakości kodowania obrazu. Tradycyjnie jest to MSE (ang. Mean Square Error). Poprzez odpowiedni dobór wartości poszczególnych Ri będziemy chcieli dążyć do minimalizacji MSE. Potraktujemy MSE jako funkcję parametrów R i - MSE=MSE(R 1, R 2,..., R N). W większości wypadków spełnione jest równanie D(R) = N ∑ MSE i ( Ri ) ( 12) i /1 gdzie: D(R) - globalna miara błędu kwantyzacji, MSEi() - miara błędu kwantyzacji parametru Xi w funkcji przydzielonej parametrowi gęstości bitowej R i. Chodzi tu o przypadki, w których elementy X1, X2,..., XN mają taki sam znormalizowany rozkład funkcji gęstości prawdopodobieństwa: Xi/σi2. Poniżej omówione zostanie kilka metod alokacji bitów prowadzących do minimalizacji zniekształcenia. Jeżeli znany jest przebieg poszczególnych funkcji MSEi(R), można zastosować metodę alokacji zwaną metodą Pareto. Metoda ta bazuje na założeniu, że punktem optymalnej alokacji bitów jest taki punkt, w którym nachylenia funkcji MSEi(R) będzie takie samo dla wszystkich rozważanych i. Wynika to z faktu, że jeżeli ten warunek nie jest spełniony to zawsze możliwe jest „odebranie” bitów z kwantyzatora dla którego spowoduje to małą zmianę MSE na niekorzyść i dodanie ich tam gdzie strome nachylenie funkcji spowoduje większą zmianę MSE na korzyść. Inna metoda zakłada alokację bitów proporcjonalnie do wariancji kodowanego źródła danych. Wynika ona z tego [41], że przy założeniu dużej wartości poziomów kwantyzacji (duża wartość R) D ( R ) = MSE ( R ) ≈ h ∗ σ 2 ∗ 2 −2 R ( 13) gdzie: h - współczynnik stały dla danej znormalizowanej funkcji gęstości prawdopodobieństwa. Dalej korzystając ze związku ( 12) otrzymujemy D(R) = N ∑ h ∗σ 2 i ∗ 2 −2R ( 14) i /1 Można pokazać [41], że D(R) przyjmuje minimalną wartość dla σ 1 (log 2 i2 ) 2 ρ 2 Ri = R + 33 ( 15) 1 N N 2 ρ = ∏ σ i i /1 2 ( 16) W praktyce oznacza to, że uzasadnione jest postępowanie wielu badaczy, którzy przeprowadzają alokację bitów proporcjonalnie do logarytmu wariancji źródła. Metoda ta pozwala umożliwia przeprowadzenie szybkiej alokacji bitów. Sytuacja komplikuje się kiedy niektóre obliczone w ten sposób bi są ujemne. W praktyce ujemne wartości zastępowane są zerami, a dodatkowe modyfikacje pozostałych współczynników gwarantują żądaną wartość średniej wartości R. Najbardziej bezpośrednią metodą jest oczywiście metoda wyczerpującego przeszukiwania. W metodzie tej pod Ri podstawiane są kolejne możliwe kombinacje wartości gęstości bitowej dla których każdorazowo wyliczana jest wartość D(R). Na końcu wybierany jest zestaw o minimalnej wartości D. Wadą jest oczywiście ogromna czasochłonność tej metody. W zamian gwarantuje ona uzyskanie najlepszego rozwiązania. Oczywiście w praktyce podstawiane wartości stanowią pewien ograniczony zbiór wartości dyskretnych. Otrzymane więc rozwiązanie jest najlepsze dla wybranych wartości Ri. Alternatywą do metody wyczerpującego poszukiwania jest zastosowanie algorytmu zachłannego. Algorytm zachłanny wybiera zawsze możliwość najlepszą w danym momencie w nadziei, że w rezultacie doprowadzi ona do rozwiązania globalnie najkorzystniejszego. W odniesieniu do problemu alokacji bitów algorytm zachłannego poszukiwania rozwiązania przybiera postać algorytmu poniżej (Algorytm 1). Zakładamy, że Ri może przybierać kolejne wartości R(0), R(1), R(2) ... gdzie R(m)<R(m+1). Algorytm 1 1. Ustalamy wartości Ri na wartość Ri(0) dla i={0...N}. 2. Obliczamy wartość R (gęstości bitowej dla systemu). Jeżeli dozwolona wartość R została przekroczona, to koniec. 3. Dla każdego i obliczamy MSEi(Ri). 4. Znajdujemy MSEj o największej wartości. 5. Dla Rj=R(m) ustalamy wartość Rj=R(m+1). Pozostałe wartości bi pozostawiamy bez zmian. Wracamy do punktu 2. Algorytm zachłanny jest bardzo wydajny, nie gwarantuje jednak niestety uzyskania najlepszego możliwego rozwiązania. 34 2.5. Kodowanie entropowe Elementem bardzo ważnym w kodowaniu obrazów jest kodowanie entropowe nazywane zamiennie kodowaniem bezstratnym. O ile podczas procesu kwantyzacji zdekomponowanego obrazu uzyskujemy efekt zmniejszenia objętości informacji potrzebnej do zakodowania obrazu poprzez odrzucanie jej części nie istotnych z punktu widzenia prawidłowej percepcji obrazu przez człowieka, o tyle cechą kodowania entropowego jest zamiana reprezentacji strumienia bitów uzyskanego w procesie kwantyzacji na taką, która zajmie mniej miejsca w kanale przesyłowym bez utraty pojedynczego bitu informacji. Dlatego kodowanie entropowe nazywane jest kodowaniem bezstratnym. Przesyłana wartość jest podczas transmisji reprezentowana przez określony symbol, który jest sekwencją binarną. Nie jest żadnym wymogiem, że poszczególne wartości muszą być przesyłane jako sekwencje o takiej samej długości. Zakładając, że należy zakodować sygnał składający się z wartości x ze zbioru X (x∈{X}) symbolami o różnej długości, można obliczyć średnią liczba bitów potrzebną do zakodowania tego sygnału B= ∑ B ( x ) ∗P ( x ) ( 17) X gdzie: B(x) - ilość bitów użyta do kodowania symbolu x, P(x) - prawdopodobieństwo wystąpienia w sygnale wartości x. Dla określonej funkcji rozkładu prawdopodobieństwa P(x) można określić tak funkcję B(x), że średnia wartość ilości bitów będzie minimalna. Kodowanie ze zmienną długością symbolu wiąże się oczywiście również z technicznymi problemami należy bowiem zapewnić rozróżnialność kolejnych symboli i jednoznaczność dekodowania ciągu bitów. Dla określonego P(x) określono teoretyczną minimalną wartość gęstości bitowej nazywaną entropią zmiennej losowej X H ( X ) = − ∑ P ( x ) ∗ log 2 P ( x ) X ( 18) Entropia H(X) ≤ B. Entropia jest miarą ilości informacji niesionej przez zmienną X. Entropia przyjmuje wartość maksymalną jeżeli każda zmienna x występuje z jednakowo dużym prawdopodobieństwem. Z drugiej strony jeżeli wartości występujące w zbiorze X są łatwo przewidywalne entropia jest mała (w skrajnym przypadku jeżeli dla jednej z wartości x P(x)=1 entropia jest równa 0). 35 Zaproponowano różne sposoby przypisywania wartościom odpowiedniego symbolu tak, aby minimalizować równanie ( 17). Najbardziej popularne sposoby to kodowanie Huffmana i kodowanie arytmetyczne. Kodowanie Huffmana, czy kodowanie arytmetyczne to wchodzące w skład kodowania entropijnego kodowanie ze zmienną długością słowa VLC (ang. Variable Length Coding). Oprócz tego w kodowaniu bezstratnym obrazów stosuje się również kodowanie ciągów RLC (ang. Run Length Coding). Polega ono na zastępowaniu ciągów składających się z symboli tego samego rodzaju informacją o rodzaju symbolu i ilości jego powtórzeń. Kodowanie to ma szczególne znaczenie w przypadku kodowania wartości zero w kompresji obrazu ponieważ podczas kodowania składowych częstotliwościowych po dekompozycji automatycznie zeruje się wartości leżące poniżej ustalonego dla danej składowej poziomu. Powoduje to powstawanie skupionych obszarów o wartości zero. 36 3. Kodowanie sekwencji 3.1. Wprowadzenie W poprzednim rozdziale rozważane były techniki stosowane przy kodowaniu obrazów stałych. Dobrą jakość obrazu przy małej przepływności bitowej osiągano dzięki przestrzennej redundancji niesionej przez obraz informacji. Nadmiarowość ta prowadziła do korelacji sąsiednich punktów obrazu i dlatego w celu ich dekorelacji, a następnie odrzucenia części niepotrzebnej stosowano transformaty. Proste przeniesienie tej metody do kodowania obrazów ruchomych, które na skutek dyskretyzacji w czasie można traktować jako serię kolejnych obrazów statycznych jest możliwe, ale nie gwarantuje przepływności bitowej odpowiedniej dla powszechnych współcześnie dostępnych kanałów przesyłowych (Tab. 1). Obliczona na wstępie przepływność bitowa cyfrowego standardu CCIR601 (165Mb/s) daleko przekracza przepływności oferowane przez te kanały. Tab. 1. Szerokość pasma przesyłowego dla wybranych sieci transmisji danych KANAŁ PRZEPŁYWNOŚĆ Telefonia tradycyjna 56 kb/s ISDN 144 kb/s 6,5 6,5 Mb/s Ethernet 10 Mb/s Bazując na kompresji statycznych obrazów można otrzymać zadowalającej jakości obraz redukując 8-12 krotnie pierwotną ilość danych. Dalszą redukcję ich liczby można osiągnąć korzystając z korelacji danych znajdujących się w następujących po sobie obrazach w sekwencji. Rozważymy przypadek, w których filmowany jest trójwymiarowy obiekt. W takiej sytuacji obrazem 2D trójwymiarowego przedmiotu jest w przybliżeniu jego rzut na powierzchnię. Ponieważ rzut składa się z punktów tego samego przedmiotu należy spodziewać się redundancji wewnątrzobrazowej. Poruszając się obiekt zmienia położenie zmieniając równocześnie miejsce położenia swojego rzutu w zamkniętym krawędziami obrysie filmowanej sceny (Rys. 16). 37 N B A Y X t Rys. 16. Międzyobrazowa korelacja danych wizyjnych Kolejne obrazy sekwencji przedstawiają ciągle ten sam obiekt, zatem występuje korelacja punktów kolejnych ramek sekwencji. Jednym ze sposobów poradzenia sobie z tą korelacją może być wprowadzenie zmiennej czasu jako trzeciej zmiennej do przeprowadzenia dekompozycji. W takim przypadku przeprowadzamy dekompozycję 3 wymiarową. Przy takim podejściu możemy mówić na przykład o trójwymiarowej DCT, czy też trójwymiarowej dekompozycji falkowej. Takie próby kompresji obrazu są oczywiście podejmowane, jednak nie mają jak na razie praktycznego znaczenia. W stosowanych standardach kompresji wideo wykorzystuje się dwuetapowe podejście do dekorelacji. Pierwszy etap nazywany estymacją lub kompensacją ruchu eliminuje korelację międzyobrazową, a dopiero w następnym etapie tożsamym z kodowaniem obrazów stałych koduje się rezultat otrzymany po estymacji. 3.2. Estymacja ruchu Estymacja ruchu polega na poszukiwaniu w następujących po sobie obrazach punktów sobie odpowiadających, tak aby uzyskać lepsze rezultaty kodowania opierając się na kodowaniu przyrostowym tych punktów. W skrajnym przypadku można potraktować każdy punkt indywidualnie, ale z praktycznego punktu widzenia takie podejście nie zdaje egzaminu. Znaleziony wektor przesunięcia punktu względem jego odpowiednika w poprzedniej ramce należy przesłać do odbiornika jako informację dodatkową użytą do kodowania w celu poprawnego odtworzenia. Indywidualne rozpatrywanie kolejnych pikseli powoduje konieczność przesłania tak dużej ilości informacji dodatkowej, że nie rekompensuje ona ewentualnych zysków czerpanych z dekorelacji. 38 Z praktycznego punktu widzenia popartego spostrzeżeniem, że poruszające się obiekty tworzą całe grupy poruszających się punktów, lepiej jest podzielić cały obraz na fragmenty (bloki) traktowane przy poszukiwaniu przesunięcia jako całość (Rys. 17). S PX X(x,y) Py X’(x,y) m V W n Ramka aktualna Ramka odniesienia Rys. 17. Dopasowywanie bloków w procesie kompensacji ruchu Ponieważ przesunięcie obiektu pomiędzy dwoma sąsiednimi ramkami ma przeważnie ograniczoną wartość (obiekty nie poruszają się zbyt szybko) ogranicza się również zakres poszukiwań, a co za tym idzie długość przesyłanego wektora, do pewnej wartości. Tak więc, blok o określonej lokalizacji (x, y) w kodowanym obrazie jest porównywany z blokami o identycznych rozmiarach w obrazie poprzednim leżącymi w obszarze o rozmiarach (Px, Py) otaczającym rozważany blok. W praktyce mówi się o rozmiarach bloku (m, n) i zakresie wektora przesunięcia V(vx, vy) początkowej pozycji (x, y) bloku. Rozmiar bloku powinien być wielokrotnością wielkości ramki (zazwyczaj 16×16). Zakres zmienności wektora to v(−7..8,−7..8). Aby odszukać bloki wzajemnie sobie odpowiadające należy wprowadzić kryterium porównawcze. Najczęściej stosowanymi sposobami porównywania bloków są miary MSE lub MAE. D= n m ∑∑ X ( x + i + v x , y + j + v y ) − X ' ( x, y ) . i/0 j/0 ( 19) k Dla k=1 otrzymujemy kryterium MAE, dla k=2 otrzymujemy MSE. Jako wektor poszukiwanego przesunięcia przyjmowany jest ten dla którego wartość D jest najmniejsza w poszukiwanym zakresie. 39 Ze względu na czasochłonność obliczeniową całego procesu estymacji ruchu w praktycznych rozwiązaniach stosuje się raczej miarę MAE. Istnieje również wiele innych metod, które wydatnie skracają proces obliczeniowy estymacji ruchu [118][7][12][62][21], nie gwarantując jednak optymalnego rozwiązania. Kodowanie z uwzględnieniem kompensacji ruchu polega na odjęciu od siebie następujących po sobie ramek z uwzględnieniem obliczonych wektorów przesunięcia. Od kolejnych bloków kodowanej ramki odejmowane są odpowiadające bloki ramki poprzedniej. Oczywiście nie każdy blok musi mieć swój odpowiednik (patrz Rys. 18). Istnieją w sąsiadujących ramkach obszary nie posiadające swoich odpowiedników. Chodzi tu o obszary przykrywane i odkrywane przez poruszające się obiekty. W takim wypadku kryterium MSE zapewnia znalezienie obszaru zbliżonego, tak aby kodowana różnica wartości pikseli niosła najmniejszą możliwą energię. Obszar odkryty przez obiekt Obszar przykryty przez obiekt Rys. 18. Powstawanie obszarów nie związanych w kolejnych ramkach 3.3. Koder wideo Schemat blokowy kodera wideo przedstawiono na rysunku (Rys. 19). 40 Kontrola przepływu Q D f(t) Kodowanie entropowe Bufor Wyjsciowy Danych wektory F(t-1) Q Q-1 D D-1 Pamięć poprzedniej ramki kwantyzator dekwantyzator dekompozycja dekompozycja F(t-2) Estymacja ruchu D-1 Q-1 DEKODER Rys. 19. Schemat ideowy kodera wideo Elementami wspólnymi dla kodera wideo i kodera obrazów statycznych są bloki dekompozycji (D) i kwantyzacji (Q). Opcjonalnie w zależności od rodzaju kwantyzacji koder wyposażony może być w blok kodowania entropijnego. Ze względu na zastosowanie kompensacji ruchu częścią składową kodera jest dekoder. Aby nie prowadzić do kumulacji błędów kwantyzacji kolejnych ramek w procesie estymacji ruchu, kodowanie przyrostowe ramki odbywa się względem nie oryginału ramki poprzedniej, ale jej zakodowanego i zdekodowanego obrazu. Dzięki temu estymacja i proces odwrotny przeprowadzany w odbiorniku przeprowadzane są na takiej samej ramce odniesienia. Dekoder składa się z dekwantyzatora (blok Q-1), bloku operacji odwrotnej do dekompozycji (blok D-1) i bloku operacji odwrotnej do estymacji ruchu. Obraz odtworzony w dekoderze jest wykorzystywany do obliczenia wektorów przesunięć w bloku „Estymacji Ruchu” i zapamiętywany w pamięci (blok „Pamięć poprzedniej ramki”) w celu zdekodowania aktualnie kodowanej ramki. Z uwzględnieniem wektorów przesunięć ramka kodowana f(t) i obraz ramki poprzedniej F(t+1) są odejmowane w bloku odejmowania. Bardzo ważnym elementem kodera jest również bufor wyjściowy, którego rola omówiona zostanie w następnym rozdziale. 3.4. Niestacjonarność strumienia wideo Rezygnując z formalnej definicji stacjonarnego procesu stochastycznego można powiedzieć, że za stacjonarny będziemy uważali taki proces, którego właściwości 41 statystyczne nie ulegają zmianie w funkcji czasu. Oznacza to, że na przykład wartość oczekiwana procesu, czy też jej wariancja, mierzone w dowolnym okresie czasu wynoszą tyle samo. Jeżeli zawęzimy podany wyżej wymóg do trzech parametrów i spełnimy warunki: − E(Xt) jest wartością stałą dla dowolnego t, − σ(Xt) jest wartością stałą dla dowolnego t, − Cov(Xt, Xt-h) = Cov(h), gdzie Xt reprezentuje zmienną losową X w chwili t, to otrzymamy proces stacjonarny drugiego rzędu. Można zatem postawić pytanie, czy strumień sygnału wideo, traktowany jako wartości punktów obrazu w kolejnych ramkach, może być traktowany jak proces stochastyczny. Jeżeli rozważymy sekwencję wideo, na której spiker prezentuje wiadomości, to można taki proces można uważać za stochastyczny. Tło w takiej sekwencji jest stałe, a ruchy prezentera są bardzo ograniczone. Gdy następnie rozważymy scenę z zawodów sportowych, podczas której kamera wykonuje szybkie ruchy, a i filmowane obiekty szybko się poruszają, to trudno zakładać statystyczne podobieństwo choćby dwóch kolejnych obrazów. W rozważaniu sekwencji należy także liczyć się z sytuacją, w której następuje zmiana sceny. Na przykład przełączenie prezentera na relację z zawodów sportowych. Poza dwoma przytoczonymi przykładami istnieją oczywiście jeszcze inne rodzaje scen wideo, które można sklasyfikować w sposób następujący [103]: • Sceny prawie statyczne - bez gwałtownych ruchów i ruchu kamery (wideo telefonia). • Sceny ogólne - pojedyncze, poruszające się obiekty. • Gwałtowny ruch - stałe tło i szybko poruszające się obiekty. • Ruch kamery - powolny ciągły ruch kamery w kierunku pionowym lub poziomym. • Zoom - szybka zmiana tła polegającą na przybliżaniu lub oddalaniu kamery. • Zmiana sceny - zupełna zmiana rodzaju prezentowanej sekwencji. • Ciągła zmiana sceny. Każda z podanych rodzajów scen posiada swoje własne charakterystyczne właściwości statystyczne. Istnieją poza tym różne sceny, które łączą cechy dwu lub więcej powyższych rodzajów. Kodowanie entropowe pokazuje, że gęstość bitowa zależy od rozkładu prawdopodobieństwa ( 18) należy się więc spodziewać, że dla różnych typów sekwencji otrzymamy różną liczbę bitów konieczną do ich zakodowania. Ponadto wprowadzenie estymacji ruchu powoduje, że dla sekwencji o „małej ilości ruchu” gęstość bitowa jest 42 mniejsza niż dla sekwencji z „dużą ilością ruchu” lub sekwencji gdzie występują zmiany sceny. Brak stacjonarności kodowanych obrazów powoduje fluktuacje gęstości bitowej danych wychodzących z kodera wideo i przeznaczonych do transmisji. Ponieważ w praktyce rzadko kanał transmisyjny cechuje zmienne pasmo w celu wygładzenia transmitowanego strumienia stosuje się „Bufor Wyjściowy Danych” (Rys. 19). Inne metody sterowania przepływem omówiono w [56][151][10][1]. 3.5. Sterowanie przepływem bitów W zależności od realizowanej aplikacji możemy mieć do czynienia z różnym sposobem sterowania wielkością wyjściowego strumienia bitów z kodera wideo. Jak widać z poprzedniego podrozdziału, w trakcie kompresji rzeczywistych sekwencji należy spodziewać się zmiennego strumienia bitów dla różnych ramek. Fakt ten nie stanowi problemu kiedy dane wizyjne kodowane są w celu archiwizacji, czyli zapisywane są na odpowiedni nośnik pamięci masowej. Częściej jednak mamy do czynienia z sytuacją, w której dane te transmitowane są do odległego odbiornika. W takim przypadku rozważany koder musi mieć dostęp do odpowiedniego kanału transmisyjnego. Klasycznie najczęściej spotykana jest sytuacja, w której dostępny kanał transmisyjny ma stałe pasmo transmisyjne czyli ilość bitów jaką można transmitować za jego pośrednictwem jest ściśle określona i niezmienna. Taką konfigurację kodera i kanału przesyłowego określa się jako CBR (ang. Constant Bit Rate). Jak już wspomniano rozwiązaniem problemu, w którym strumień jest niestacjonarny, a pasmo stałe jest zastosowanie bufora wyjściowego danych typu FIFO (ang. First In First Out). Takie rozwiązanie nasuwa podstawowe pytanie: jak duży powinien być taki bufor? Praktycznie rzecz biorąc, aby nie doszło do chwilowego przepełnienia bufora (nadajnik nie nadąża z wysyłanie generowanych przez koder danych), powinien być on jak największy. Należy jednak zdawać sobie sprawę, że duży bufor wprowadza opóźnienie sygnału nadawanego i odbieranego. Takie opóźnienie może być uciążliwe, lub nawet niedopuszczalne, w aplikacjach czasu rzeczywistego (np.: wideokonferencje). Godząc się zatem na mniejszy bufor należy wprowadzić mechanizm kontroli zajętości bufora wyjściowego i w przypadku jego przepełniania (ang. overflow) bądź opustoszenia (ang. underflow), w określony sposób wpływać na działanie kodera, a właściwie modułu kwantyzatora znajdującego się w koderze (Rys. 19, „Kontrola przepływu”). Jeżeli mechanizm ten wykryje, że bufor się przepełnia należy zwiększyć krok kwantyzacji. Jeżeli bufor jest pusty krok kwantyzacji można 43 zmniejszyć. Oczywiście ze względu na ciągłe fluktuacje entropii kodowanych danych sterowanie to jest niezwykle skomplikowane. Kłopot polega na tym, że tak naprawdę o tym jak „informacyjnie energetyczna” była kodowana ramka, koder dowiaduje się dopiero po kodowaniu entropowym. Dla lepszego gospodarowania pasmem przesyłowym (miejscem w buforze) cenne byłoby przewidywać liczbę bitów potrzebną do zakodowania ramki przy określonym kroku kwantyzacji. Można dokonywać takiej oceny na podstawie pewnych pośrednich informacji o ramce obrazu (Tab. 2) Tab. 2. Informacje do oceny obrazu przed operacją kwantyzacji WARTOŚĆ OCZEKIWANA WARIANCJA STATYSTYKA PARAMETRY WYŻSZEGO RZĘDU BRAK RUCHU RUCH POJEDYNCZYCH OBIEKTÓW KONTEKST GWAŁTOWNY RUCH ZMIANA SCENY RUCH KAMERY PRZESUW KAMERĄ PRZYBLIŻANIE / ODDALANIA Najprostszym sposobem oceny kodowanego obrazu jest oparcie się na parametrach statystycznych obrazu. Na przykład pewnego rodzaju miernikiem entropii jest wariancja wartości punktów obrazu. Innym sposobem jest analiza wektorów estymacji ruchu. Na tej podstawie można przewidzieć z jakiego rodzaju ruchem mamy do czynienia w kodowanej sekwencji i dokonać odpowiedniej klasyfikacji. Następnie na jej podstawie, uwzględniając aktualną zajętość bufora wyjściowego podjąć decyzję o kroku kwantyzacji. Konieczność zapewnienia stałego przepływu powoduje, że im krótszy bufor zastosujemy tym większe będą fluktuacje jakości kodowanego obrazu. Przeciwieństwem systemu typu CBR jest system VBR (ang. Variable Bit Rate). W systemie takim zakłada się, że kanał transmisyjny jest w stanie przesłać w każdej chwili taką ilość bitów jaka wypłynie z kodera. Jest to bardzo komfortowa sytuacja z punktu widzenia kodowania, ale raczej rzadko spotykana. Zawsze raczej brakuje pasma przesyłowego niż jest go nadmiar. Kiedy jednak taka konfiguracja ma miejsce sterowanie kwantyzacją ma na celu 44 zapewnienie w miarę stabilnej jakości obrazu. Zadaniem kanału transmisyjnego jest odpowiednie radzenie sobie z dostarczoną liczbą bitów. Wraz z pojawieniem się sieci transmisyjnych z przełączaniem pakietów (sieci typu ATM), w której kanał fizyczny dzielony jest na kanały logiczne o różnej przepustowości, powstała potrzeba dostosowywania kodera do dostępnego w danej chwili pasma. Ponieważ całkowite pasmo w sieci dzielone jest pomiędzy różnych użytkowników przepustowość dostępna dla pojedynczego użytkownika w danej chwili ulega zmianie w zależności od zapotrzebowania na transmisję innych użytkowników. Taki rodzaj konfiguracji nazywamy ABR (ang. Adaptive Bit Rate). W aplikacji ABR sterowanie przepływem spoczywa na medium transmisyjnym, ale także na koderze. Zadaniem medium jest znalezienie dostępnych w danej chwili kanałów logicznych, tak aby radzić sobie ze stale zmieniającą się gęstością bitową. Kiedy jednak na skutek ogólnego wzrostu zapotrzebowania na pasmo transmisyjne spada średnia prędkość transmisji tzn. tak zwany QOS (ang. Quality of Service), do głosu muszą dochodzić adaptacyjne mechanizmy samego kodera. Należy obniżyć jakość kodowania, tak by zmieścić zakodowany strumień w dysponowanym kanale transmisyjnym. 45 4. Algorytm kwantyzacji PVQ 4.1. Wprowadzenie Zagadnienie kwantyzacji danych doczekało się do tej pory szeregu opracowań teoretycznych. Wczesne prace zapoczątkowane przez C. E. Shannona [108], a uwieńczone podaniem sposobu skonstruowania optymalnego kwantyzatora przez S. P. Lloyd’a [74] i J. Max’a [78] dotyczyły kwantyzacji skalarnej – kwantyzator Lloyda-Maxa. Pomimo swojej prostoty kwantyzator ten ma ograniczone zastosowanie, przy jego konstrukcji przyjęto bowiem, że kodowane źródło jest stacjonarne. W praktyce powoduje to, że kwantyzator gorzej sprawdza się przy kodowaniu takich ważnych z praktycznego punktu widzenia sygnałów jak sygnał wideo czy audio. W rezultacie kwantyzator nie osiąga tak małego błędu kwantyzacji jak teoretycznie przewidywany. Doprowadziło to do rozwoju prac nad kwantyzacją wektorową. Grupowanie danych w bloki (wektory) poprawia statystyczne właściwości kwantowanego źródła danych [40]. Prace te w rezultacie doprowadziły do zaproponowania przez Y. L. Linde, A. Buzo i R.M. Gray’a algorytmu konstrukcji kwantyzatora wektorowego, zwanego kwantyzatorem LBG. Chociaż cechuje go duża uniwersalność i skuteczność przy kwantyzacji źródeł różnych typów to jednak ma on spore praktyczne ograniczenia w zastosowaniu. Przede wszystkim wymaga on opracowania książki kodowej w odniesieniu do konkretnego kwantyzowanego źródła. Konstruowanie książki kodowej wymaga zaangażowania sporych mocy obliczeniowych, a stosowany w tym celu algorytm opiera swoje działanie na losowym doborze danych. Mankamentem jest również konieczność każdorazowego przesyłania nowej książki kodowej z nadajnika do odbiornika, co zwiększa ilość wymaganych do przesłania bitów. Sam proces przypisywania kodowanym danym wektorów z książki kodowej również jest czasochłonny wymaga bowiem obliczenia odległości w przestrzenni wielowymiarowej kodowanego wektora do każdego wektora z książki kodowej. Alternatywą dla kwantyzatorów typu LBG są kwantyzatory kratkowe [40]. Używanie do reprezentacji kwantowanych danych regularnie rozmieszczonych w przestrzeni punktów premiuje znacznym przyspieszeniem procesu kodowania i dekodowania. Zbędne jest również przesyłanie książki kodowej. Do tej grupy kwantyzatorów wektorowych zalicza się zaproponowany przez T. R. Fischer’a [34] kwantyzator PVQ (ang. Pyramid Vector Quantizer). Został on opracowany jako optymalny kwantyzator kratkowy dla kodowania źródła danych o rozkładzie Laplace’a. 46 Źródło takie opisuje funkcja gęstości prawdopodobieństwa podana równaniem ( 20) p ( xi ) = λ 2 e − λ xi ( 20) Jeżeli wartości xi pochodzące ze źródła pogrupujemy w L wymiarowe wektory X, to funkcja gęstości prawdopodobieństwa przybiera postać ( 21) L P ( X ) = ∏ p ( xi ) ( 21) i /1 Dla funkcji P(X) warunek stałej wartości (P(X)=const) przybiera postać ( 22) X 1 = L ∑x i = const ( 22) i /1 Z tego wynika, że prawdopodobieństwo wystąpienia wektorów o tej samej długości w sensie normy l1 jest takie samo. Geometrycznie równanie ( 22) opisuje również w L wymiarowej przestrzeni powierzchnię hiperostrosłupa foremnego, lub inaczej sfery w przestrzeni l1. Na podstawie tak wywiedzionych geometrycznych właściwości źródła Laplace’a T. R. Fisher zaproponował konstrukcję kwantyzatora, którego siatka rozpięta jest na powierzchni ostrosłupa, który dla wygody w dalszej części pracy, opierając się na tłumaczeniu terminu wprowadzonego przez Fishera nazywać będziemy piramidą. Podobne geometryczne właściwości wykazują również wektory utworzone dla innych źródeł. Na przykład dla danych o rozkładzie Gaussa analogicznie rozważany kontur jest sferą [102]. Fisher dokonał w swojej pracy analitycznych wyliczeń i podał wyniki przeprowadzonych symulacji przy kodowaniu przy pomocy zaprojektowanego kwantyzatora źródeł o różnym rozkładzie. Oczywiście w takim przypadku uzyskiwane rezultaty były gorsze w sensie MSE niż dla źródła Laplace’a. Ograniczenie kodowania metodą PVQ do źródła Laplace’a mogłyby świadczyć o nieatrakcyjności rozwiązania, którego zastosowanie jest obwarowane teoretycznym wymogiem źródła stacjonarnego o określonym rozkładzie. Szczególne właściwości powodują jednak, że kwantyzator PVQ może być atrakcyjny z praktycznego punktu widzenia. 4.2. Konstrukcja siatki kwantyzatora Za pracą Fisher’a [33] ostrosłup, na którym rozpięta będzie siatka kwantyzatora będzie oznaczany jako P(L,K), a opisany wzorem( 23): 47 L S ( L, K ) = X : ∑ xi = K . i /1 ( 23) Gdzie K nazwane promieniem ostrosłupa w przestrzeni L wymiarowej jest liczbą całkowitą. Siatkę, lub inaczej książkę kodową stanowią w takim wypadku wszystkie wektory (punkty) o współrzędnych całkowitych leżące na ostrosłupie. Przykład kwantyzatora w przestrzeni trójwymiarowej przedstawia rysunek (Rys. 20). X2 5 4 3 2 1 1 2 3 4 5 X1 X3 Rys. 20. Ostrosłup P(3,5) Każdy punkt o współrzędnych całkowitych na piramidzie reprezentuje punkty leżące w jego L wymiarowym sąsiedztwie. Patrząc na problem geometrycznie można powiedzieć, że punkty na piramidzie kodują kierunek wektora, który stanowią kwantowane dane. Aby informacja konieczna do odtworzenia wektora była pełna konieczna jest jeszcze informacja o długości tego wektora. Tak faktycznie jest dla małych L jednak kiedy liczba ta staje się odpowiednio duża, to brak tej informacji nie powoduje dużego błędu przy odtwarzaniu, czyli dekwantyzacji danych. Wynika to z poniższych równań ( 24)( 25)( 26)( 27): E( X 1) = σ ( X 1) = L λ L λ2 48 ( 24) ( 25) X E( 1 L X σ( 1 L )= )= L ( 26) λ2 1 L λ2 ( 27) Równania ( 24)( 25) opisują odpowiednio wartość oczekiwaną i wariancję długości w sensie normy l1 wektora X=(x1, x2,...,xL), gdzie xi jest opisane równaniem ( 20). Natomiast równania ( 26)( 27) opisują wartość oczekiwaną i wariancję długości tego wektora znormalizowanej do jednego wymiaru – współrzędnej wektora. Jak widać długość l1 wynosi średnio L/λ, i co więcej, dla dużych wartości L arbitralne przyjęcie takiej długości dla wszystkich wektorów statystycznie nie wnosi znaczącego błędu w odniesieniu do wartości współrzędnych (xi) tych wektorów, bowiem σ( X L 1 L → ∞ ) → 0 . ( 28) Z tego praktycznie wynika, że dla dostatecznie dużego L zadowalające kwantowanie można osiągnąć posługując się wyłącznie indeksem punktu z piramidy o promieniu L/λ. Y Y’’ X’ X Y’ X’’ X Y λ L\λ K Rys. 21. Tworzenie siatki kwantyzacji na powierzchni P(L,L/λ) Aby dokonać kwantyzacji na powierzchni ostrosłupa P(L,L/λ) należy dokonać jej przeskalowania na powierzchnię ostrosłupa P(L,K) (Rys. 21). W tym celu mnożymy współrzędne xi przez współczynnik α=K∗(λ/L). Zabieg ten należy jednak traktować czysto formalnie. Wynika on po prostu z tego, że na powierzchni ostrosłupa P(L,K) punkty siatki 49 mają współrzędne całkowite i łatwiejsze staje się zarówno kwantowanie jak i określenie ich liczności. Równie poprawnie można powiedzieć, że siatka kwantyzatora opisana w punktach o współrzędnych całkowitych na P(L,K) służy do równomiernego rozpięcia siatki o takiej samej liczbie punków kwantyzacji na P(L,L/λ). 4.3. Wymagana przepływność bitowa Wartość promienia ostrosłupa K ma praktyczne znaczenie dla parametru R (ang. bitrate) czyli liczby określającej liczbę bitów potrzebnych do zakodowania jednej wartości danych. Pamiętając, że przesyłając pojedynczy punkt z siatki kwantyzacji przesyłamy L wartości danych kodowanego źródła i zakładając, że pasmo przepustowe kanału transmisyjnego odpowiada gęstości bitowej R, musimy spełnić warunek ( 29) N ( L , K ) ≤ 2 R∗L ( 29) gdzie N(L,K) jest liczbą punktów siatki kwantyzatora znajdujących się na P(L,K) – liczbą punktów o współrzędnych całkowitych leżących na tym ostrosłupie. Aby obliczyć N(L,K) dla dowolnego L i K należy posłużyć się równaniem wykorzystującym rekurencję N ( L , K ) = N ( L − 1, K ) + N ( L − 1, K − 1) + N ( L , K − 1) ( 30) i oczywistymi związkami: N(1,K)=2 (x1=K lub x1=-K) oraz N(L,1)=2∗L (tylko jedna współrzędna może być równa 1 albo –1). Przy pomocy promienia K ostrosłupa P(L,K) istnieje możliwość doboru odpowiedniej liczby punktów siatki kwantyzatora na powierzchni P(L,L/λ) dla zapewnienia pożądanej przepływności bitowej R. Gęstość bitową R dla wybranych parametrów (L,K) podaje Dodatek 2. Wartość R ściśle wiąże się z błędem kwantyzacji D (ang. distortion). Wartość błędu można obliczać korzystając z dowolnej przyjętej normy lν – odległości wektora X od jego obrazu po dekwantyzacji Y. lν = X − Y ν =ν L ∑ (x − yi ) ν i ( 31) i /1 gdzie ν jest stopniem normy.Dla ν=2 D przyjmuje postać powszechnie stosowanej miary MSE (ang. Mean Square Error). Dla ν=1 obliczony błąd to MAE (ang. Mean Absolute Error). 50 Ponieważ wartość błędu kwantyzacji wynika z założonego R przy projektowaniu kwantyzatora wygodne jest określenie funkcji D(R) (ang. rate-distorion function). D(R) = E( X − Y ν ) L ( 32) T.R. Fisher pokazał również, że dla tak skonstruowanego kwantyzatora funkcja D(R) w sensie MAE asymptotycznie zmierza do teoretycznej dla źródła Laplace’a linii granicznej D(R)=2-R/λ (ang. asymptotic performance). Podobnie istnieje asymptota dla kryterium MSE. Należy zaznaczyć, że otrzymanie rozwiązania optymalnego wymagałoby losowego rozmieszczenia punktów na ostrosłupie co prowadziłoby do kwantyzatora bez praktycznego znaczenia, ponieważ proces kwantyzacji byłby zbyt skomplikowany. 4.4. Rzutowanie na powierzchnię ostrosłupa Przeprowadzenie kwantyzacji wymaga znalezienia rzutu prostopadłego kodowanego punktu na powierzchnię piramidy. W tym wypadku rzutowanie oznacza przesunięcie punktu r X o wektor A tak, aby znaleźć jego rzut X’ (Rys. 22). Aby znaleźć współrzędne punktu X’(x’1, x’2,...,x’L) znając współrzędne punktu X(x1,x2,...,xL) należy wyznaczyć współrzędne r wektora A (a1,a2, ...,aL). Zachodzi bowiem zależność x i = x ' i + a i ; i ∈ {1, 2,..., L} ( 33) Współrzędne wektora wyznaczymy jeżeli znajdziemy jego długość bowiem łatwo zauważyć, r że jeżeli A jest prostopadłe do powierzchni piramidy to: sign ( a i ) = sign ( x i ) ; i ∈ {1,2,..., L} r . A 1 ai = ; i ∈ {1,2,..., L} L ( 34) Znak współrzędnych wektora zależy od „ćwiartki”, w której znajduje się X, a ich moduły są sobie równe. 51 X X’ M A M’ ° K ∆K X 1 Rys. 22. Rzutowanie punktu na powierzchnię piramidy r Długość l1 wektora A wyznaczymy posługując się przedstawionym poniżej rozumowaniem. Istnieją takie punkty M(m1, m2, ... , mL) i M’(m’1, m’2, ... , m’L), że: M = X 1 1 i mi = M ' 1 = K i mi = X 1 L K L ( 35) a i = m i − m 'i Pomocniczo wyznaczamy takie punkty M i M’, które leżą na powierzchniach piramid odpowiednio o promieniu X1 i K, ale moduły ich współrzędnych są równe. Wektor M ' M r jest poszukiwanym wektorem A . Stąd: sign ( a i ) = sign ( x i ) ; i ∈ {1,2,..., L} ai = X 1 −K L ; i ∈ {1,2,..., L} ( 36) 4.5. Kwantowanie w punktach siatki PVQ Kwantowanie wektora X po przeskalowaniu o współczynnik α na powierzchnię P(L,K) wymaga znalezienia punktu siatki najbliższego mu dla wybranej normy lν. Dla normy l2 wymaga znalezienia rzutu prostokątnego punktu X na powierzchnię ostrosłupa (patrz Rozdział 4.4). Następnie należy, posługując się poniższym zaproponowanym przez 52 T.R. Fisher’a algorytmem znaleźć najbliższy punkt siatki (punkt na ostrosłupie o współrzędnych całkowitych). Algorytm 2 1. Zaokrąglić każdą współrzędną wektora X do najbliższej liczby całkowitej – otrzymujemy w ten sposób wektor y. 2. Obliczyć y1. Jeżeli y1=K to wektor y jest poszukiwanym wektorem Y. 3. Jeżeli y1<K to należy do K-y1współrzędnych, dla których błąd zaokrąglenia w dół był największy dodać jeden. 4. Jeżeli y1>K to należy od y1-K współrzędnych, dla których błąd zaokrąglenia w górę był największy odjąć jeden. Wektor Y=y/α jest wektorem reprezentującym X po dekwantyzacji dla punktów y leżących na powierzchniach ostrosłupa. Dla y leżących na jego krawędziach i wierzchołkach punkt reprezentacyjny Y dla zapewnienia mniejszego błędu powinien leżeć trochę poniżej jego krawędzi. T.R. Fisher zaproponował w tym wypadku użycie współczynnika korygującego γ<1 i obliczenia Y=γ∗(y/α). Współczynnik γ należy dobrać doświadczalnie dla różnych L. 4.6. Kodowanie punktów siatki Przez kodowanie punktów siatki kwantyzatora rozumie się przypisanie każdemu punktowi unikalnego indeksu, dzięki któremu punkt ten może być jednoznacznie interpretowany zarówno w nadajniku jak i w odbiorniku. Zaproponowane przez T.R. Fishera kodowanie przypisuje punktom indeksy z zakresu <0, N(L,K)-1>. Węzły siatki są jednoznacznie opisywane przy pomocy współrzędnych punktów w L wymiarowej przestrzeni, w których umieszczone są węzły. Współrzędne węzłów na piramidzie P(L,K) mają postać ( 32) L X ( x1 , x 2 ,..., x L ); ∑ x i = K ; x i ∈ C ; . ( 37) i/1 Algorytm wykorzystuje współrzędne w procesie iteracji, dzięki któremu dla każdego punktu siatki kwantyzatora otrzymujemy indeks s. 53 Algorytm 3 1. Zakładamy N(l,0)=1 i N(0,k)=0; 2. Ustawić zmienne s=0; i=1; k=K; l=L. 3. Jeżeli xi=0, to s=s+0. 1 − sign( xi ) Jeżeli xi=1, to s = s + N (l − 1, k ) + ∗ N (l − 1, k − 1) 2 xi −1 1 − sign( xi ) Jeżeli xi>1, to s = s + N (l − 1, k ) + 2 ∗ ∑ N (l − 1, k − j ) + ∗ N (l − 1, k − xi ) 2 j =1 4. k=k- xi; l=l-1; i=i+1 5. Jeżeli k=0, to s jest poszukiwanym indeksem punktu Jeżeli k≠0, to wracamy do punktu2 i kontynuujemy. Algorytm kodowania wymaga dodatkowego wyjaśnienia ponieważ choć podany w powyższy sposób dobrze implementuje się przy pomocy programu komputerowego to jednak jest mało przejrzysty. Algorytm polega na podziale całego zakresu iteracji na przedziały odpowiadające odpowiednim wartościom współrzędnych. Najpierw dzielimy zakres na 2∗K+1 przedziałów odpowiadających różnym wartościom pierwszej współrzędnej. Następnie tak otrzymane przedziały iteracyjnie dzielimy na podprzedziały odpowiadające wartościom kolejnych współrzędnych, aż do otrzymania przedziałów o długości 1, a więc konkretnej wartości indeksu s. Indeks o wartości 0 odpowiada punktowi o współrzędnych (x1=0, x2=0,...,xL=). Punktowi o współrzędnych (x1=-1, x2=0,...,xL=0) przypiszemy indeks o wartości N(L-1,K) ponieważ wszystkie indeksy z zakresu od 0 do N(L-1,K) będą przypisane punktom siatki, które mają współrzędną x1=0 (jest ich dokładnie N(L-1,K).. W rozważanym pierwszym zakresie punkty, dla których dwie pierwsze współrzędne x1=0, x2=1 będą kodowane od indeksu N(L-2,K) (punktów o współrzędnych x1=0, x2=0 jest N(L-2,K)) do indeksu N(L2,K)+N(L-2,K-1)-1 (jest ich N(L-2,K-1)). Kolejny zaprojektowany zakres kodowania odpowiada x1=-1, którego szerokość jest dokładnie taka sama jak dla x1=1 (N(L-1,K) wartości). 54 Sposób kodowania (indeksowania) punktów piramidy P(L,K) jest dowolny zaproponowany przez T.R. Fishera to jeden z wielu możliwych. Jak się okazuje pewna jego modyfikacja powoduje dogodniejszą implementacje sprzętową. 4.7. Dekodowanie punktu siatki Dekodowanie punktu polega na podaniu jego współrzędnych X(x1, x2,...,xL) na podstawie indeksu punktu s. Ponieważ kolejne wartości współrzędnych punktów siatki kwantyzatora zawężają przedział kodowania do zakresu <0, N(L,K)-1> to proces dekodowania polega w istocie na porównaniu podanego indeksu z progami odpowiadającymi kolejnym wartościom xi. Po odnalezieniu przedziału dla xi, poszukiwanie jest kontynuowane dla xi+1, poprzez porównywanie z progami w tym przedziale zawartymi, a odpowiadającymi kolejnym wartościom xi+1. Iteracja trwa do momentu, w którym badany próg nie będzie równy dekodowanemu indeksowi. Algorytm 4 1. Zakładamy N(l,0)=1 i N(0,k)=0; 2. Ustawić zmienne X=<0>; xs=0; i=1; k=K; l=L. 3. Jeżeli s=xs, to xi=0, koniec dekodowania 4. Jeżeli s<xs+N(l-1,k), to xi=0, idziemy do 6. i Jeżeli s≥ xs+N(l-1, k), to xs=xs+N(l-1, k), j=1 5. Jeżeli s<xs+2∗N(l-1, k-j), to j dla s < xs + N (l − 1, k − j ) xi = − j dla s ≥ xs + N (l − 1, k − j ) idziemy do 6. Jeżeli s≥xs+2∗N(l-1, k-j) to, xs=xs+2∗N(l-1, k-j), j=j+1, wróć do 5. 6. k=k- xi , l=l-1, i=i+1, Jeżeli k>0 idziemy do 3. Jeżeli k=0 koniec dekodowania. 55 4.8. Algorytm PCPVQ W wielu praktycznych zastosowaniach zapewnienie rozmiaru wektora L na tyle dużego, aby możliwe było zaniedbanie błędu spowodowanego różnicą praktycznej długości kodowanego wektora X1, a promieniem piramidy L/λ nie jest możliwe. Ograniczenia wymiaru L wektora może wynikać na przykład z rozmiaru dostępnej pamięci, czy charakteru kodowanego źródła (jeżeli kwantyzujemy cyfrowy obraz wideo o rozmiarze H×L, to H∗L wydaje się maksymalnym rozsądnym rozmiarem wektora). Dla sytuacji, kiedy długość wektora znacząco różni się od wartości L/λ T.R. Fisher zaproponował algorytm PCPVQ (ang. Product Code Pyramid Vector Quantization). Jest to zmodyfikowany algorytm PVQ. Modyfikacja polega na tym, że kwantyzacja odbywa się nie ja jednej piramidzie, ale na szeregu koncentrycznych piramid (Rys. 23). Dla kwantyzacji PCPVQ należy skonstruować zespół piramid, a kwantyzacje danego wektora przeprowadzić na powierzchni tej piramidy, która jest najbliższa. Wynikiem kwantyzacji jest nie tylko punkt na piramidzie, ale indeks najbliższej piramidy. Pośrednio przesłany indeks wskazuje na długość kodowanego wektora. W tym wypadku następuje podział strumienia zakodowanych danych na strumień bitów kodujących punkt na siatki i bity kodujące indeks piramidy. Obowiązuje związek: Rp∗L+Rr=R∗L. ( 38) Gdzie: Rp - liczba bitów do zakodowania jednej współrzędnej punktu siatki, Rr - liczba bitów do zakodowania indeksu piramidy, R - efektywna liczba bitów potrzebną do zakodowania jednej współrzędnej wektora X (jednej kodowanej danej). 56 K1 K2 K3 Rys. 23. Kwantowanie PCPVQ W uproszczeniu mówiąc kodujemy kierunek i długość wektora. 4.9. Zastosowanie algorytmu PVQ T.R. Fisher opracował algorytm PVQ dla stacjonarnego źródła danych o rozkładzie Laplace’a i pokazał, że kwantyzator ten jest gorszy w odniesieniu do teoretycznego optymalnego kwantyzatora Lloyd-Max’a dla takiego źródła. Mogłoby to wskazywać na brak celu stosowania takiego algorytmu nawet w odniesieniu do stacjonarnego źródła Laplace’a. Jednak algorytm ten w porównaniu z innymi sposobami kompresji danych ma zaletę nie do przecenienia, zwłaszcza, jeśli rozważamy rozwiązania praktyczne, które musi cechować pełny czasowy determinizm – systemy czasu rzeczywistego. Chodzi w tym przypadku o regularność strumienia danych, który powstaje przy kodowaniu z użyciem tego algorytmu. Kompresja przy użyciu skalarnego kwantyzatora Lloyd-Max’a wymaga zastosowania kodowania entropijnego. Uśredniona przepływność bitowa jest lepsza niż dla PVQ jednak mierzona chwilowo waha się. W celu wyrównania przepływu konieczne jest stosowanie w nadajniku i odbiorniku bufora transmisyjnego FIFO (ang. First In First Out). Bufor taki jest kłopotliwy. Wprowadza nieprzewidywalne opóźnienie transmisji. Ponadto należy zapewnić mechanizmy chroniące bufor przed przepełnieniem i brakiem danych. Kodowanie entropijne dla PVQ nie jest konieczne, ponieważ dane grupowanie są w wektory o równym prawdopodobieństwie wystąpienia. Należy także zaznaczyć, że Fisher badał także możliwości kodowania źródeł innego typu. 57 Teoretyczne rozważania Fishera dotyczyły kodowania źródeł stacjonarnych o rozkładzie Gaussa i rozkładzie jednorodnym. Jeśli chodzi o kodowanie źródła Gaussa, to lepsze rezultaty można by osiągnąć kwantyzując na powierzchni sfery. Wtedy jednak algorytm byłby o wiele bardziej skomplikowany. Znalezienie odpowiedniego punktu na powierzchni sfery wymagałoby bardziej skomplikowanych obliczeń. Wydaje się, że polepszenie wyników nie rekompensuje dodatkowego nakładu pracy tym bardziej, że źródło Gaussa ma również charakter czysto teoretyczny. Z oczywistych powodów jesteśmy zainteresowani kodowaniem źródeł nie poddającym się prostemu opisowi przy pomocy modeli matematycznych, więc jeżeli kwantowanie na powierzchni ostrosłupa jest prostsze niż na powierzchni sfery, to z czysto praktycznego punktu widzenia jest bardziej atrakcyjne. Źródło o rozkładzie jednorodnym oraz źródło o rozkładzie gamma teoretycznie rozważone przez Fishera również działają gorzej w porównaniu ze skalarnym kwantyzatorem Lloyd-Max’a. Jeżeli chodzi o równoczesne kodowanie długości wektora i jego kierunku to algorytm PCPVQ zapewnia takie podejście do kompresji i jest prosty w realizacji. Wskazane cechy PVQ czyli prostota i jednorodny strumień danych, spowodowały, że spotkał się on z zainteresowaniem w zastosowaniu do kodowania praktycznie występujących danych. Najlepsze rezultaty kwantyzacji można osiągnąć dla kodowania wektorów wielu wymiarach. Dla algorytmów PVQ i PCPVQ rozmiar wektora jest narzędziem sterowania strumieniem danych. Szczególnie dla PCPVQ wydaje się nie mieć znaczenia rozmiar kodowanego wektora, jednak tak jest tylko w wypadku założenia stacjonarnego źródła Laplace’a. Jeżeli zamierzamy kodować praktycznie występujące dane, powinniśmy formować wektory o tak dużym wymiarze jak to możliwe ze względu na typ źródła i ograniczenia sprzętowe. Dzięki temu możemy zapewnić tak dużą jak to tylko możliwe dekorelację kodowanych danych. W takim wypadku instrumentem sterowania strumieniem danych pozostaje promień piramidy K. I jak się okazuje jest on wystarczający. 58 5. Kwantyzacja PVQ w systemach kompresji obrazu Sukces jaki odniosły metody kodowania obrazu oparte na dekompozycji i kwantyzacji skalarnej, co znalazło odzwierciedlenie w opracowanych standardach kodowania obrazu skłonił badaczy do poszukiwania rozwiązań opartych również na dekompozycji, ale równocześnie na kwantyzacji wektorowej. Zachęcały do tego oczywiście teoretyczne statystycznie lepsze właściwości tej kwantyzacji. Podobne próby podejmowano również w odniesieniu do kwantyzacji PVQ. U podstaw badań dotyczących PVQ leżało spostrzeżenie, że statystyczne właściwości współczynników transformaty kosinusoidalnej (DCT) przy pewnych założeniach są podobne do właściwości zmiennych rozkładu Laplace’a bardziej niż dla zmiennych popularnego rozkładu Gaussa [80][95]. Spostrzeżenie to dotyczy współczynników wysokoczęstotliwosciowych transformaty DCT. Bezpośrednie zastosowanie metody PVQ do kodowania współczynników DCT obrazu dotyczy prac przedstawionych w [122][28]. W pracach tych kodowano współczynniki DCT transformaty o rozmiarze 8×8. Wektory X formowano w następujący sposób Xij=(xij(1), xij(2), xij(3), ..., xij(n), ..., xij(L)) ( 39) gdzie i,j=1,..., 8 - współrzędne odpowiedniego współczynnika w bloku DCT, n – indeks kolejnego bloku DCT. Formowanie wektorów z odpowiadających współczynników różnych bloków DCT jest podyktowane faktem różnych parametrów rozkłady Laplace’a (λ) dla różnych składowych częstotliwościowych. W obydwu pracach współczynnik x11 przekształcenia DCT kodowano przy pomocy kwantyzacji DPCM. Praca [122] dotyczy obrazów stacjonarnych. Przedstawione wyniki wskazują na polepszenie jakości kodowania PSNR przynajmniej o 1dB przy kodowaniu 1bit/piksel i długości wektora L=16. W pracy [28], która dotyczyła kodowania sekwencji wideo zastosowano dodatkowo technikę klasyfikacji bloków DCT. Grupowano je na trzy rodzaje w zależności od zawartości energii. W rezultacie uzyskano wyniki kodowania obrazu standardu CCIR 601 4:2:2 lepsze niż w stosowanym standardzie CMTT/2. CMTT/2 jest standardem kodowania obrazu dla przepływności bitowych 34-45 Mbit/s. Zastosowanie PVQ zamiast kwantyzacji skalarnej dało w rezultacie taką samą jakość kodowania (43dB) przy 22Mbit/s jak CMTT przy 45Mbit/s. Ważnym problemem w omawianych powyżej sposobach kodowania jest problem alokacji bitów. Wektory Xi,j są kodowane z różną dokładnością (z różną wartością gęstości 59 bitowej R). Autorzy korzystają z własności ( 13), która dla rozkładu Laplace’a wyraża się następująco Di , j ( Ri , j ) = e2 −2R 2 i, j 2 3λ i , j ( 40) Pamiętając że 1 λ =β = E( X 1) L . ( 41) I korzystając z ( 15) i ( 16) otrzymujemy wzór na alokacje bitów dla poszczególnych rodzajów współczynników Ri , j β i2, j 1 = R + log 1 2 N 2 ∏ β i , j i j , . ( 42) Alokacja bitów w obydwu metodach odbywa się dynamicznie według wzoru ( 42). Oczywiście dla poprawnego zdekodowania konieczne jest przesłanie do dekodera odpowiednich wartości βi,j w celu odtworzenia sposobu alokacji bitów. Należy podkreślić, że podana zależność ( 42) jest ważna dla dużych wartości L. W pracy [122] L=32, a w pracy [28] L=30. W innej pracy [9] kodowano wektory utworzone ze współczynników transformaty pojedynczego bloku DCT. Aby możliwe było kodowanie w ramach pojedynczego wektora współczynników o różnych parametrach rozkładu zastosowano modyfikację PVQ nazwaną WPVQ (ang. Weighted Pyramid Vector Quantization). Polega ona na tworzeniu siatki kwantyzatora na powierzchni piramidy o pisanej według zależności L S ( L , w , K ) = X : ∑ wi x x = K . i/o ( 43) Gdzie wi są odpowiednio dobranymi współczynnikami wagowymi proporcjonalnym do λ. W metodzie WPVQ uzyskano nieznaczne polepszenie kodowania w stosunku do PVQ. Kolejną odmianą kodowania PVQ jest metoda ECLVQ (ang. Entropy-Coded Lattice Vector Quantization) zaprezentowana w pracy [81]. Modyfikacja tej metody w stosunku do WPVQ polega na możliwości kodowania wektora w zależności od kryterium jego ważności na piramidach o różnych parametrach (L,K). Dodatkowy indeks poprzedza kodowany symbol mówiąc, na której piramidzie odbywało się kodowanie (Rys. 24). 60 K1 K2 K3 Rys. 24. Sposób kodowania w metodzie ECLVQ Kryterium doboru piramidy, na której kodowany jest odpowiedni wektor polegało na obliczeniu energii kodowanego bloku DCT. Współczynnik składowej stałej x11 DCT kodowano metodą DPCM. Mimo, że jak wskazuje kilka opracowań współczynniki dekompozycji podpasmowej charakteryzują się rozkładem Gaussa, a nie Laplace’a metodę PVQ stosowano również z powodzeniem do kodowania obrazów w ten sposób dekomponowanych. W zasadzie trwa spór, o to jak modelować współczynniki dekompozycji falkowej, bowiem inne prace sugerują rozkład Laplace’a jako im bliższy. Tak więc, obok prób na współczynnikach DCT w pracach [9] [81] realizowano również kodowanie PVQ współczynników falkowych. Paradoksalnie uzyskiwano w nich lepsze wyniki dla dekompozycji podpasmowej niż dla DCT. Trzeba jednak przyznać, że większy zysk z kodowania PVQ w stosunku do kodowania skalarnego odnotowano dla współczynników DCT. Przewaga więc dekompozycji podpasmowej nad DCT w kodowaniu PVQ wynika prawdopodobnie z natury samej dekompozycji falkowej, która jest po prostu generalnie korzystniejsza od DCT. Wyniki kodowania zdekomponowanego falkowo obrazu przedstawia również [125]. W prezentowanych pracach wektory tworzone były ze współczynników jednego podpasma. W pracy [81] dokonano dekompozycji obrazu na 16 podpasm równej szerokości. W każdym paśmie formowano wektory z bloków 4×8 lub 8×8.. Do kodowania zastosowano algorytm ECLVQ. Podobnie postąpiono w [9], gdzie zastosowano algorytm PVQ. W pracy [125] postąpiono nieco odmiennie. Przeprowadzono 4-poziomową dekompozycję z logarytmicznym podziałem pasma (Rys. 5). Rozmiary wektorów w każdym z podpasm były różne (od L=4 do L=256). Do kodowania użyto algorytmu PCPVQ. Użycie algorytmu 61 PCPVQ było podyktowane małymi rozmiarami wektora dla pasm o niższych częstotliwościach, gdzie gęstość bitowa była większa. Ograniczenie wielkości wektorów wynikało z tego, że autorzy przedstawiali sposób kodowania odpowiedni do realizacji sprzętowej w strukturze VLSI [43]. Stąd ograniczenia sprzętowe spowodowały niemożność arbitralnego przyjęcia rozmiaru wektora (im wektor i przepływność bitowa większe tym więcej koniecznej pamięci operacyjnej). Uzyskane wyniki były lepsze niż uzyskiwane dla kodowania JPEG dla tej samej wartości gęstości bitowej. W każdym z opisywanych przypadków składowa stałoczęstotliwościowa kodowana była skalarnie (PCM/DPCM), a alokacja bitów do poszczególnych pasm odbywała się proporcjonalnie do logarytmu wariancji wartości współczynników w paśmie ( 15). 62 6. Algorytm przeznaczony do realizacji sprzętowej 6.1. Rzutowanie wektora na powierzchnię ostrosłupa W rozdziale tym przedstawiono realizowany przez autora algorytm kwantyzacji, przy czm kwantyzacja ta dotyczy opisanej w rozdziale 7 implemantacji w układach reprogramowalnych. Realizacja algorytmu T.R. Fishera (Algorytm 2) wymaga znalezienia rzutu prostopadłego punktu X na powierzchnię ostrosłupa – punkt X’ (Rys. 25). O wiele mniej skomplikowane obliczeniowo byłoby zastąpienie rzutu punkt X punktem, który leży na powierzchni ostrosłupa, ale jego współrzędne wynikają z przeskalowania X na powierzchnię piramidy – punkt X’’. Błąd wprowadzany przyjętym uproszczeniem wynosi ∆X’. Błąd ten jest maksymalny dla punktów X leżących w pobliżu wierzchołka ostrosłupa – kąt α zmierza wtedy do wartości 45°. Maksymalna wartość tego błędu w przypadku ogólnym dla L wymiarowej przestrzeni wynosi ∆ X ' MAX = a L − 1 = ∆ K L −1 ≈ ∆K . L ( 44) X X’ α ∆X’ X’’ ∆X’’ a K ∆K X 1 Rys. 25. Znajdowanie obrazu punktu na powierzchni piramidy 63 Jeżeli błąd ten jest mniejszy niż błąd właściwej kwantyzacji na powierzchni piramidy to wprowadzone uproszczenie jest akceptowalne z punktu widzenia pracy całego systemu. Błąd kwantyzacji na powierzchni ostrosłupa wynosi oznaczymy ∆X’’: ∆X ' ' = ∆X ' ' = L L = Kλ 2 1 α X K 1 L 2 (dla PVQ) ( 45) L 2 (dla PCPVQ) Różnice we wzorach dla PVQ i PCPVQ wynikają jedynie z tego, że w PVQ za długość wektora l1 podstawiamy wartość L/λ, ponieważ ta wartość jest z dobrą dokładnością długością dla dużych L. Warunku, dla którego błąd rzutowania jest pomijalny w stosunku do błędu kwantowania dla PCPVQ przybiera postać ∆ X ' MAX < ∆ X ' ' ⇒ ∆ K < L X 1 . 2 K ( 46) Oznacza to, że w przypadku kwantyzacji PVQ w ogóle nie musimy zajmować się ograniczeniem ( 46) ponieważ algorytm wynika z właściwości, że wektory X są zlokalizowane w pobliżu powierzchni piramidy - ∆K→ 0. W przypadku zmodyfikowanego algorytmu PCPVQ należy jednak brać tą właściwość pod uwagę. Oznacza ona, że dla PCPVQ jeżeli skalarna kwantyzacja długości wektora nie jest dostatecznie dokładna lub dla małych wartości L w przypadku PVQ, należy jednak przeprowadzić właściwy rzut prostopadły punktu na powierzchnię piramidy (patrz podrozdział 4.4). 6.2. Zmiany w algorytmie kwantyzacji na powierzchni ostrosłupa Zaproponowany algorytm kwantyzacji punktu na powierzchni ostrosłupa (Algorytm 2) jest możliwy do zaimplementowania przy pomocy architektury potokowej. Wprowadzono jednak pewne niewielkie zmiany, które dodatkowo uprościły zaproponowaną implementacje. Uproszczenie dotyczy zaokrąglenia współrzędnych punktu. Zaproponowany przez T.R. Fishera algorytm (Algorytm 2) wymaga sprawdzenia czy dana współrzędna powinna być zaokrąglona w dół, czy w górę oraz później wybrania współrzędnych, dla których błąd zaokrąglenia jest najmniejszy lub największy w zależności od warunku czy punkt po zaokrągleniu leży wewnątrz ostrosłupa czy na zewnątrz (y1<K i y1>K). W zaproponowanym sposobie postępowania unikamy tych trudności. 64 Algorytm 5 1. Zaokrąglić każdą współrzędną wektora X w dół do najbliższej liczby całkowitej – otrzymujemy w ten sposób wektor y. 2. Obliczyć y1. Jeżeli y1=K to wektor y jest poszukiwanym wektorem Y. 3. Jeżeli y1<K to należy do K-y1współrzędnych dla których błąd zaokrąglenia był największy dodać jeden. Stosując ten zmodyfikowany algorytm unikamy konieczności sprawdzania czy zaokrąglenie ma być w dół, czy w górę oraz konieczności sortowania błędu zaokrąglenia narastająco lub malejąco w zależności od napotkanego przypadku. 6.3. Modyfikacja kodowania Przeznaczony do sprzętowej realizacji algorytm kodowania bazuje na oryginalnym kodowaniu zaproponowanym przez T.R. Fishera. Zastosowano jednak odwrócenie kolejności, według której wektorom przypisywane są indeksy. W zmodyfikowanym sposobie kodowania indeks 0 otrzymuje punkt X(x1=K, x2=0, ...,xL=0), indeks 1 punkt X(x1=-K, x2=0, ...,xL=0). Ostatni przedział odpowiada punktom, dla których x1=0. Nowy sposób kodowania przedstawia Algorytm 6. Algorytm 6 1. Zakładamy N(l,0)=1 i N(0,k)=0; 2. Ustawić zmienne s=0; i=1; k=K; l=L. 3. Jeżeli xi=K, to s=s+0. Jeżeli xi=-K, to s=s+1 Jeżeli xi<K i xi>0, to s = s + 2 ∗ xi +1 1 − sign( xi ) ∗ N (l − 1, k − xi ) 2 ∑ N (l − 1, k − j ) + j =4 1 Jeżeli xi=0, to s = s + 2 ∗ ∑ N (l − 1, k − j ) j =4 4. k=k- xi; l=l-1; i=i+1 5. Jeżeli k=0, to s jest poszukiwanym indeksem punktu Jeżeli k≠0, to wracamy do punktu2 i kontynuujemy. 65 Modyfikacja algorytmu ma znaczenie dla oszczędniejszej realizacji sprzętowej dekodowania, ponieważ dla tak zmodyfikowanego algorytmu wartości progów do dekodowania współrzędnej xi nie zależą od wcześniej zdekodowanych xj; j<i. Doskonale widać ten problem na przykładzie. Rozważmy przedziały kodowania indeksu dla wartości pierwszej współrzędnej x1=0 i x1=1. Długość zakresów kodowania dla x2 w oryginalnym algorytmie T.R Fishera i w algorytmie zaimplementowanym przedstawia tabela (Tab. 3). Tab. 3. Porównanie długości przedziałów dla algorytmu T.R. Fishera i algorytmu zaimplenentowanego ALGORYTM T.R. FISHERA X1=0 IMPLEMENTOWANY ALGORYTM X1=1 X1=0 X1=1 X2=0 N(L-1,K) N(L-1,K-1) X2=K N(L-1,0) X2=K-1 N(L-1,0) X2=1 N(L-1,K-1) N(L-1,K-2) X2=K-1 N(L-1,1) X2=K-2 N(L-1,1) X2=2 N(L-1,K-2) N(L-1,K-3) X2=K-2 N(L-1,K-2) X2=K-3 N(L-1,K-2) X2=K-1 N(L-1,1) N(L-1,0) X2=1 N(L-1,K-1) X2=0 N(L-1,K-1) X2=K N(L-1,0) BRAK X2=0 N(L-1,K) Tak jak pokazuje tabela kolejne przedziały w algorytmie T.R. Fishera mają różne długości, co w konsekwencji prowadzi do konieczności pamiętania innych progów dla komparacji przy x1=0 i x1=1. Co prawda w nowym, zmodyfikowanym algorytmie progi dla x1=0 zaczynają się od podprzedziału dla x2=K, a dla x1=1 pierwszy próg odpowiada wartości x2=K-1 , ale szerokości tych przedziałów są identyczne co umożliwia wykorzystanie tych samych wartości progów komparacji przechowywanych w pamięci dekodera (patrz też rozdz. 7.5). 6.4. Wpływ zmian w algorytmie kodowania na dekodowanie Algorytm kodowania został zmodyfikowany, aby łatwiejsza była realizacja algorytmu dekodowania. Dekodowanie przebiega podobnie jak w przedstawiono w oryginalnym algorytmie T.R. Fisher’a. Zmianie ulegają jedynie wartości progów, z którymi porównujemy dekodowany indeks. 66 Algorytm 7 1. Zakładamy N(l,0)=1 i N(0,k)=0; 2. Ustawić zmienne W=<0>; xs=0; i=1; k=0; l=L; j=0. 3. Jeżeli s=xs, to wi=K, koniec dekodowania 4. Jeżeli j=K i s<xs+N(l-1, j) to wi=0, idziemy do 6. 5. Jeżeli j≠K i s<xs+2∗N(l-1, j), to K − j dla s < xs + N (l − 1, j ) wi = − ( K − j ) dla s ≥ xs + N (l − 1, j ) idziemy do 6. Jeżeli s≥xs+2∗N(l-1, j) to, xs=xs+2∗N(l-1, j), j=j+1, wróć do 4. 6. l=l-1, i=i+1, j=0 Jeżeli i>L to, koniec dekodowania. Jeżeli i≤L to, idziemy do 4. W algorytmie dekodowany wektor oznaczono jako W ponieważ zdekodowana wartość nie jest wprost zdekodowanymi współrzędnymi punktu siatki X. Ponieważ kolejne podprzedziały w różnych przedziałach odpowiadają różnym wartościom xi (patrz Tab. 3), konieczne jest dodatkowe przeliczenie współrzędnych wi na xi. Przeliczenie to odbywa się według bardzo prostego wzoru: w1 dla i = 1 xi = w i - w i −1 dla L ≤ i ≤ 2 ( 47) Proponowane zmiany w algortmie PVQ mają na celu umożliwienie jego latwej realizacji. O ile zmiany w procesie kodownia nie maja żadnego wpływu na jakość kompresji, o tylu w przypadku zrezygnowania z rzutu prostopadłego na powierzchnię piramidy można spodziewać się pogorszenia jakości w zamian za prostszą realizację sprzętową. 67 7. Architektura sprzętowa dla algorytmu PVQ 7.1. Geneza wybranej architektury Zadanie projektowe polegające na praktycznej realizacji algorytmu obliczeniowego można zrealizować wielorako. Sposób realizacji danego zadania projektowego zależy od szeregu czynników. Można tu w pierwszym rzędzie wymienić wydajność obliczeniową systemu, rozpraszana moc i koszt realizacji. Ponieważ nie ma rozwiązań charakteryzujących się optymalnymi parametrami równocześnie w każdym z podanych kryteriów dobrymi rozwiązaniami są takie, które spełniając kryterium uznawane w danym przypadku za najważniejsze oraz charakteryzują się lepszymi niż inne możliwe realizacje pozostałymi parametrami. Jeżeli na przykład realizujemy układ o zadanym poborze mocy dobieramy takie rozwiązanie, które przy poborze mocy mniejszym niż wymagany będzie najszybsze. Rozważania prowadzone w tej pracy dotyczą realizacji systemów czasu rzeczywistego gdzie krytyczny jest czas realizacji zadania obliczeniowego. Istotne jest, że w przypadku tego typu systemów, krytyczny charakter czasu nie oznacza, że zależy nam na maksymalnie szybkiej realizacji algorytmu. Przy osiągnięciu wymaganej szybkości pracy systemy działające szybciej nie będą wcale lepsze dla określonego zadania. System czasu rzeczywistego powinien charakteryzować się wymaganą prędkością pracy. Nie mniejszą od założonej, ale nie koniecznie maksymalną możliwą. Przegląd architektur komputerowych [68] wskazuje na systemy wieloprocesorowe o architekturach sklasyfikowanych przez Flynn’a jako MIMD, MISD lub SIMD [35] jako te o największych mocach obliczeniowych. Są to architektury uniwersalne do realizacji różnych zadań obliczeniowych i stanowią niewątpliwa alternatywę do realizacji zadania postawionego w tej pracy. Wadą tych architektur jest jednak koszt, rozmiary i energochłonność tych systemów, w ogólnym rozumieniu traktowanych jako matryce procesorów ogólnego stosowania. Konkurencyjne dla klasycznych systemów obliczeniowych sklasyfikowanych przez Flynn’a [35] są rozwiązania oparte na procesorach systolicznych osiągających ogromne moce obliczeniowe dzięki przetwarzaniu równoległemu i potokowemu [73] Przy pomocy tego typu systemów najlepiej rozwiązywane są problemy, w których pojedyncza dana obliczeniowa jednorazowo pobrana z pamięci systemu poddana jest szeregowi różnych operacji. Informacja wizyjna podczas przesyłania ma charakter strumienia danych analogowych lub cyfrowych. Współczesne przetwarzanie tych danych odbywa się po zamianie informacji na 68 format cyfrowy, dogodne jest zatem dopasowanie projektowanej architektury systemu cyfrowego do występującej w praktyce struktury danych obrazowych. Do przetwarzania informacji wizyjnej szczególnie przydatna jest podstawowa liniowa konfiguracja tablicy systolicznej. Struktura systoliczna jest regularną siecią powtarzających się elementów. Powoduje to, że przy jej wykorzystaniu daje się rozwiązywać tylko specyficzne, bardzo „symetryczne” problemy obliczeniowe. Zniesienie założenia identyczności elementów obliczeniowych prowadzi do architektury składającej się z różnych procesorów komunikujących się tylko lokalnie ze sobą. Taka liniowa struktura (Rys. 26) zgodnie literaturą [133][132][134] będzie nazywana architekturą potokową. W tej strukturze wynik operacji wykonanych w jednym procesorze jest przekazywany w celu dalszych obliczeń do procesora następnego. Pamięć P1 P2 P3 P4 P5 Rys. 26. Liniowa konfiguracja tablicy systolicznej (P - pojedynczy procesor) Lokalne komunikowanie się procesorów powoduje, że bez komplikacji dokonuje się jedynie operacji obliczeniowych na danych występujących w swoim sąsiedztwie – w strumieniu argumentów operacje są wykonywane lokalnie. Dość kosztowne jest operowanie na danych odległych od siebie. Konieczne jest wtedy stosowanie buforowania wyników cząstkowych i linii opóźniających. To jest wada architektury potokowej. Zastąpienie pojedynczego procesora matrycą procesorów typu 1-D lub 2-D podnosi oczywiście wydajność całego systemu poprzez zrównoleglenie procesu obliczeń, jednak dla celu przetwarzania sygnału wizyjnego takie zabieg powoduje konieczność zmiany organizacji wprowadzanych danych. Taki system powinien pobierać na wejściu dane z częstotliwością pracy systemu wizyjnego, a więc czas operacji w pojedynczym procesorze musi być dostosowany do parametrów tego systemu. Częstotliwość czytania danych, a co za tym idzie częstotliwość pracy zegara zbudowanego w ten sposób układu synchronicznego, wyznacza wzór ( 48) f = 1 =V * H * r T 69 ( 48) gdzie: V – rozdzielczość pionowa obrazu, H – rozdzielczość pozioma obrazu, r – ilość obrazów na sekundę. Każdy procesor musi wykonać powierzone mu operacje w czasie T. Inaczej mówiąc czas przetwarzania najwolniejszego procesora w potoku wyznacza maksymalną częstotliwość f Spełnienie wyznaczonych w ten sposób wymagań czasowych możliwe jest jak już zaznaczono poprzez ewentualne zrównoleglenie architektury, lub też alternatywnie poprzez rozbicie operacji wykonywanych przez procesory na bardziej elementarne – możliwe do wykonania w jednym takcie zegara. Oczywiście, powoduje to wydłużenie potoku, a co za tym idzie czasu opóźnienia danych wyjściowych względem wejściowych. Z idei przetwarzania potokowego czerpią współczesne procesory ogólnego stosowania oraz procesory DSP. Między innymi w ten sposób przyspieszają one typowe, często powtarzające się operacje (np.: mnożenie, mnóż i dodaj). Zastosowanie takich procesorów daje zadawalające rezultaty przy rozwiązywaniu zadania obliczeniowego, którego rozwiązanie wymaga powtarzania tych operacji, które zostały przyspieszone dedykowaną strukturą procesora. W odniesieniu do współczesnych procesorów, co jest oczywiste, są to tylko niektóre operacje. Przy pomocy tych procesorów dobrze i tanio rozwiązuje się typowe algorytmy przetwarzania sygnałów (filtracje cyfrowe, przekształcenia częstotliwościowe) i multimedialne. W przypadku innych problemów, jeżeli projektantowi zależy na wydajności, konieczne jest opracowywanie własnych dedykowanych rozwiązań – dedykowanej architektury potokowej. 7.2. Architektura potokowa PVQ Problem kompresji danych obrazowych nie może być ograniczony tylko do procesu kodowania. Aby tor kompresji był kompletny skonstruować należy zarówno układ kodera jak i dekodera. Ponadto przydatność opracowywanego rozwiązania zależy od tego czy proponowana architektura przeprowadza zarówno proces kwantyzacji jak i kodowania. W przestawionej pracy tor kompresji/dekompresji został podzielony na moduły: kwantyzatora, kodera, dekodera i dekwantyzatora (Rys. 27). Sposób sprzętowej implementacji algorytmu PVQ był już w literaturze podawany w pracy [63]. Cytowana praca ogranicza się jednak tylko do podania budowy modułów kodera i dekodera punktów z powierzchni piramidy. Zastosowane w niej rozwiązanie opiera się na strukturze tablicy systolicznej. Architektura ta jest niewątpliwie bardzo atrakcyjna pod względem oferowanej mocy obliczeniowej jednak ze względu na koszt wykorzystywanych 70 zasobów sprzętowych dedykowana jest raczej dla technologii VLSI. W przeciwieństwie do niej przestawiona przez autora architektura zaprojektowana została dla realizacji w współcześnie dostępnych układach FPGA. Kwantyzator Koder Dekwantyzator Dekoder Rys. 27. Kompletny tor kodowania dekodowania danych wizyjnych Każdy z modułów opracowanego przez autora systemu zaprojektowany został w architekturze potokowej. Dane wizyjne zgrupowane są w wektory L wymiarowe. Powoduje to, że im większe rozmiary wektora tym lokalne sąsiedztwo, w którym znajdują się dane, które poddawane są wzajemnie od siebie zależnym operacjom, staje się większe. Skutkuje to wydłużeniem linii opóźniających zastosowanych do synchronizacji momentu nadejścia do odpowiedniego procesora potrzebnych do obliczeń danych. Podstawowymi operacjami wykonywanymi w pojedynczym takcie zegara są takie operacje jak: dodawanie, odejmowanie, komparacja. Operacje mnożenia i dzielenia zostały rozbite na podane operacje podstawowe. Taki sposób postępowania wydaje się zapewniać maksymalną prędkość działania i akceptowalne rozmiary projektu. Ponadto użyte operatory znajdują się w każdej technologicznej bibliotece służącej do syntezy architektury w języku VHDL. Powoduje to uniwersalność projektowanej architektury i możliwość jej realizacji na różnych platformach FPGA lub przeniesienia do innej technologii. Dodatkowo częstotliwość pracy układu wyznacza czas dostępu do pamięci przy niektórych operacjach. 7.3. Narzędzia i założenia projektowe Proponowana implementacja algorytmu PCPVQ w celu jej ostatecznej weryfikacji powinna być przesymulowana i uruchomiona praktycznie. Opisu dokonano w języku opisu sprzętu VHDL. Taki podejście jest naturalne. Język VHDL został bowiem stworzony do 71 opisu architektur cyfrowych systemów elektronicznych. Ponadto, stosowaniu przez projektanta określonego stylu projektowania, przy użyciu odpowiednich narzędzi można zamienić przygotowany opis architektury na listę połączeń podstawowych bramek logicznych, a więc jest możliwość praktycznej realizacji w wybranej technologii. Podczas projektowania architektury przyjęto założenie, że jej opis powinien być tak sformułowany, aby odnosił się on do algorytmu PCPVQ o dowolnie wybranych parametrach L i K. W języku VHDL do parametrycznego opisu stworzono dyrektywę generic, w której można podawać parametry użyte do opisu architektury. Przy pomocy tej dyrektywy można sparametryzować wiele aspektów projektu, jednak w trakcie projektowanej architektury pojawiły się problemy nie rozwiązywalne przy pomocy tego udogodnienia języka VHDL. W takich przypadkach przyjmowano rozwiązanie automatycznego generowania opisu architektury przez programy przygotowane w języku C [59][58]. Podobnie przy pomocy specjalnie przygotowanych programów musiała być generowana zawartość pamięci używanych do przechowywania współczynników, których wartość uzależniona była do L i K.. Listę parametrów generic (zmiennych projektu), od których uzależniona jest budowa układu wraz z ich opisami zawiera tabela. Tab. 4. Zmienne parametry użyte w opisie architektury ZMIENNA GENERIC OPIS L_VALUE PARAMETR L PIRAMIDY ZASTOSOWANEJ DO KODOWANIA K_VALUE PARAMETR K PIRAMIDY ZASTOSOWANEJ DO KODOWANIA DATA_WIDTH SZEROKOŚĆ REPREZENTACJI BINARNEJ DANYCH WIZYJNYCH L_VAL_LOG2 SZEROKOŚĆ BITOWA L_VALUE ( LOG2 (L _ VALUE ) + 1 ) K_VAL_LOG2 SZEROKOŚĆ BITOWA K_VALUE ( LOG2 (K _ VALUE ) + 1 ) ERROR_WIDTH DATA_WIDTH+K_VAL_LOG2 MODSUM_WIDTH DATA_WIDTH+L_VAL_LOG2 K_NBR_OF_ONES ILOŚĆ JEDYNEK W BINARNEJ REPREZENTACJI K_VAL SYMBOL_WIDTH SZEROKOŚĆ BITOWA KODU SYMBOLU. ( LOG 2 (N (L , K )) + 1 ) Co prawda architekturę w sposób pełny definiują trzy parametry: L_VALUE, K_VALUE i DATA_WIDTH, to jednak dla prostoty wprowadzono pomocnicze parametry, które wynikają z pierwszych trzech, ale ich samoczynne wyliczenie w języku VHDL było kłopotliwe. 72 Opis architektury ma budowę modułową to znaczy, że poszczególne bloki funkcjonalne zapisane zostały w oddzielnych plikach VHDL (.vhd). Wzajemne powiązanie i pochodzenie poszczególnych plików przedstawia rysunek (Rys. 28). Najwyższy poziom w hierarchii zajmują dwa pliki: PVQCoder.vhd – opis architektury połączonej kwantyzatora i kodera oraz PVQDecoder.vhd – łączny opis dekodera i dekwantyzatora. Pozostałe pliki wyszczególnione na rysunku opisują bloki składowe powiązane ze sobą w sposób zdefiniowany w PVQCoder.vhd i PVQDecoder.vhd. Pochodzenie plików tworzących projekt może być dwojakie: z gotowej przygotowanej biblioteki lub może być wynikiem działania specjalnie przygotowanego programu. Parametry tworzonej architektury (L,K) wprowadzone z zewnątrz są w pierwszym wypadku podstawiane do dyrektywy generic, a w drugim są parametrem dla programu, który na ich podstawie konstruuje strukturę bloku i na tej podstawie tworzy jego opis w VHDL. PVQDecoder.vhd: PVQCoder.vhd: PARAMETRY generic Biblioteka PARAMETRY generic argumenty programu CodeROMGen.exe Biblioteka CODEROM.vhd: PVQCode.vhd modsum.vhd cvalmul.vhd scale.vhd sortreg.vhd modsumchk.vhd delay.vhd selectindexval.vhd correct.vhd ROMMUX.vhd CROM_L_K_1_1.vhd parserconv.vhd TuneCoef.vhd sclaedata.vhd cvaldiv.vhd delay.vhd argumenty programu DecodeGen.exe DecodeROMGen.exe PVQDecode.vhd: DROM_L_K_1_1.vhd FirstSymDecCell.vhd DROM_L_K_1_2.vhd SymDecCell.vhd LastSymDecCell.vhd DROM_L_K_l_k.vhd CROM_L_K_l_k.vhd Rys. 28. Organizacja i źródło pochodzenia plików w projekcie algorytmu PVQ Zostały przygotowane trzy programy wspomagające automatyczną generację architektury PVQ: 1. Program CodeROMGen.exe tworzy zawartość i strukturę pamięci wykorzystywanej podczas kodowania (patrz: rozdział 0). 2. Program DecodeGen.exe tworzy tablicową strukturę dekodera łącząc ze sobą w odpowiedni sposób i w odpowiedniej liczbie bloki pamięci i bloki komparatorów (patrz: rozdział 7.6). 73 3. Program DecodeROMGen.exe tworzy zawartość i opis VHDL bloków pamięci używanych w procesie dekodownia (patrz: rozdział 0). Symulacja poprawności pracy architektury przeprowadzano przy pomocy symulatora języka VHDL firmy ALDEC wchodzącego w skład pakietu Active-HDL ver.4.2. Do syntezy opisu VHDL używano narzędzi pakietu firmy SYNOPSYS w wersji v.2000.11. Do kompilacji dla struktur FPGA wykorzystany był program pakietu SYNOPSYS: FPGA_Express 3.5.2. Jednakże, w celu przeglądnięcia i ewaluacji zasobów sprzętowych użytych przez syntezę do realizacji opisanej architektury użyto programu design_compiler. Program FPGA_Express mimo, że bardzo wygodny w użyciu przy układach FPGA jako docelowej technologii nie daje wielu możliwości podglądu architektury zanim zostanie ona połączona z bibliotekami technologicznymi. Program design_compiler dokonuje w pierwszej fazie syntezy do ogólnej biblioteki elementów typu rejestry sumatory, komparatory i dlatego daje możliwość poznania złożoności układu w odniesieniu do tego typu elementów. Styl programowania przyjęty przy opisie wynika z zaleceń firmy SYNOPSYS dotyczących syntezowalnego przez narzędzia tej firmy podzbioru języka VHDL[66][69][115]. 7.4. Moduł kwantyzatora Zgodnie z podanym algorytmem PCPVQ zadaniem kwantyzatora jest znalezienie rzutu punktu o współrzędnych (x1, x2,..., xn) na powierzchnię „najbliższej” piramidy P(L, KN), przeskalowanie powierzchni piramidy P(L,KN) na powierzchnię P(L,K), a następnie znalezieniu najbliższego leżącego na piramidzie P(L,KN) punktu o współrzędnych całkowitych. Operacja rzutowania polega na przesunięciu kodowanego wektora o wektor A (patrz Rozdział 4.4). Przeskalowanie to pomnożenie współrzędnych wektora przez K i podzielenie przez KN. Kwantyzacja punktu na powierzchni piramidy odbywa się według algorytmu opisanego w rozdziale opisującym algorytm PVQ (Algorytm 5). Poniżej omówione zostanie działanie, budowa i koszt realizacji rozumiany jako zużyte zasoby obliczeniowe wszystkich części składowych przedstawionego na rysunku schematu blokowego kwantyzatora (Rys. 29). Blok PRZESUNIECIE Rozpoczęcie kwantyzacji punktu na piramidzie wymaga informacji pochodzącej ze skalarnego kwantyzatora długości wektora o wartości ∆K (patrz rozdz. 4.4). Kwantyzacja 74 długości wektora w algorytmie PCPVQ wymaga znalezienia indeksu piramidy, której promień jest najbliższy długości l1 kodowanego wektora. Na tej podstawie powstaje wartość ∆K/L, która musi być odjęta od każdej współrzędnej kodowanego wektora. Przyjęto uproszczenie, w którym ∆K/L jest zaokrąglane do wartości całkowitej. Powoduje to błąd, ponieważ otrzymany punkt nie leży na powierzchni odpowiedniej piramidy. Wpływ tego uproszczenia przedyskutowano w rozdziale 6.1. ∆K/L DANE WEJŚCIOWE PRZESUNIECIE DANE =DANE_WEJŚCIOWE+(∆K/L) MODUŁ DANE1=ABS(DANE)| NORMA1 NORM1= DANE1 1 DANE1 OPOZ A MNOZENIE NORM DANE2=K∗DANE1 DZIELENIE DANE3=DANE2/NORM OPOZ B NORMA2 SORT NORM2= DANE3 1 DANE3 CWIARTKA RESZTA Z DZIELENIA OPOZ C OPOZ D RESZTA Z DZIELENIA RESZTA Z DZIELENIA POZIOM CWIARTKA KORYGUJ ZNAK DANE WYJŚCIOWE MODUL Rys. 29. Budowa modułu kwantyzatora algorytmu PCPVQ Koszt realizacji bloku PRZESUNIECIE przedstawia tabela (Tab. 5). Opis bloku w języku VHDL zawiera załącznik (Dodatek 3.1). 75 Tab. 5. Zasoby sprzętowe bloku PRZESUNIECIE ZASOBY KOSZT [ILOŚĆ BITÓW] REJESTRY DATA_WIDTH SUMATORY DATA_WIDTH Blok MODUL Kwantowanie punktów w przestrzeni L wymiarowej można znacznie uprościć sprowadzając problem do pierwszej ćwiartki układu współrzędnych. Tak więc, blok MODUL wyznacza wartość bezwzględną wprowadzanych wartości. Informacja o numerze ćwiartki, w której znajduje się rozważany wektor jest oddzielona i przekazywana poprzez linię opóźniającą do bloku KORYGUJ kwantyzatora. Koszt realizacji tego bloku przedstawia tabela (Tab. 6). Opis bloku MODUL w języku VHDL zawiera załącznik (Dodatek 3.2). Tab. 6. Zasoby sprzętowe bloku MODUL ZASOBY KOSZT [LICZBALOŚĆ BITÓW] REJESTRY DATA_WIDTH+2 SUMATORY DATA_WIDTH KOMPARATORY DATA_WIDTH Blok NORMA1 Ponieważ przeskalowanie wektora, tak aby znalazł się na powierzchni piramidy P(L,K,) wymaga podzielenia każdej współrzędnej przez sumę wszystkich współrzędnych (czyli przez długość l1 wektora), blok MODUL dokonuje obliczenia tej sumy. Wynik tego sumowania jest przekazywany do bloku DZIELENIE poprzez linię opóźniającą. Dodatkowo blok musi przenosić dane wejściowe do bloku MNOZENIE. Koszt realizacji tego bloku przedstawia tabela (Tab. 7). Opis bloku NORMA1 w języku VHDL zawiera załącznik (Dodatek 3.3). Tab. 7. Zasoby sprzętowe bloku NORMA ZASOBY KOSZT [LICZBA BITÓW] REJESTRY (L_VALUE+1)∗DATA_WIDTH+2∗MODSUM_WIDTH+1 SUMATORY MODSUM_WIDTH 76 Blok MNOZENIE W celu przeskalowania na piramidę P(L,K,) dane wejściowe zostają pomnożone przez wartość K. Koszt realizacji tego bloku przedstawia tabela (Tab. 8). Opis bloku MNOZENIE w języku VHDL zawiera załącznik (Dodatek 3.4). Trzeba zwrócić uwagą, że złożoność tego bloku zależy od ilości jedynek jaką zawiera binarny zapis wartości K. Wynika to z faktu, że mnożenie odbywa się metodą dodawania przesuniętych odpowiednio wartości mnożnej (danych wejściowych), przy czym tylko pozycje, na której występuje jedynka w mnożniku są znaczące [89]. Tab. 8. Zasoby sprzętowe bloku MNOZENIE ZASOBY KOSZT [LICZBA BITÓW] REJESTRY NBROFONES∗(DATA_WIDTH+MODSUM_WIDTH+ERROR_WIDTH+1)+ MODSUM_WIDTH+ERROR_WIDTH+1 SUMATORY NBROFONES∗(DATA_WIDTH+K_LOG2) Blok DZIELENIE Blok DZIELENIE dzieli dane wejściowe przez obliczoną w bloku MODUL długość wektora. Dzielnie odbywa się metodą „paper and pencil” [89]. Dzięki temu możliwe było sprowadzenie procesu dzielenia do szeregu operacji porównywania i odejmowania. Cały proces dzielenia ta metodą trwa K_LOG2 taktów zegara jednak każdorazowo dzielone jest K_LOG2 wartości. Efektywnie więc, w każdym takcie zegara otrzymujemy wynik. Maksymalną częstotliwość zegara wyznacza prędkość operacji odejmowania i porównania. Na wyjściu bloku DZIELENIE pojawia się całkowita wartość wyniku dzielenia, oraz reszta z dzielenia. Reszta z dzielenia jest konieczna do przeprowadzenia procesu korekcji wartości współrzędnych po podzieleniu. Na skutek zaokrąglania wyniku dzielenia do wartości całkowitej otrzymany punkt może nie być punktem leżącym na piramidzie. Należy dokonać korekcji współrzędnych punktu zgodnie z algorytmem (Algorytm 5) tak aby otrzymać najbliższy punkt o współrzędnych całkowitych leżący na piramidzie. Koszt realizacji tego bloku przedstawia tabela (Tab. 9). Opis bloku DZIELENIE w języku VHDL zawiera załącznik (Dodatek 3.5). 77 Tab. 9. Zasoby sprzętowe bloku DZIELENIE ZASOBY KOSZT [LICZBA BITÓW] REJESTRY K_LOG2∗(3∗K_LOG2+2*MODSUM_WIDTH+2)+ ERROR_WIDTH+1 SUMATORY K_LOG2∗(K_LOG2+MODSUM_WIDTH) KOMPARATORY K_LOG2∗(K_LOG2+MODSUM_WIDTH) Blok SORT Aby możliwe było wyznaczenie tych współrzędnych, dla których błąd zaokrąglenia był największy, reszty z dzielenia współrzędnych wektora muszą być posortowane. Sortowanie odbywa się w bloku SORT. Sortowanie odbywa się zgodnie z zasadą sortowania bąbelkowego. Architektura bloku dostosowana jest do ilości danych, które mają być posortowane. W celu przesortowania L współrzędnych wektora potrzebne jest L jednakowych modułów. Zasada działania jest taka, że każda wchodząca do bloku wartość jest porównywana z wartościami, które znalazły się w bloku przed nią, Jeżeli wartość wprowadzana jest większa od wartości zapisanej to zastępuje ona jej miejsce, a w kierunku wyjścia przesuwa się w danej chwili wartość mniejsza (Rys. 30). M (1 ) M (2 ) d (2 ) d (1 ) C (1 ) C : if M (L ) d (3 ) d (L -1 ) C (2 ) ( d (i)> M (i) ) d (i+ 1 )< = M (i) M (i)< = d (i); d (L ) C (L ) th e n e ls e d (i+ 1 )< = d (i); e n d if; Rys. 30. Schemat blokowy bloku SORT Posortowanie L współrzędnych wektora trwa 2∗L taktów zegara. Koszt realizacji tego bloku przedstawia tabela (Tab. 10). Opis bloku SORT w języku VHDL zawiera załącznik (Dodatek 3.7). 78 Tab. 10. Zasoby sprzętowe bloku SORT ZASOBY KOSZT [LICZBA BITÓW] REJESTRY 2∗L_VALUE (ERROR_WIDTH+1) KOMPARATORY L_VALUE ∗ERROR_WIDTH Blok NORMA2 Działanie bloku NORMA2 jest identyczne do działania bloku NORMA1. Wartości współczynników, już po przeskalowaniu na powierzchnię piramidy, są sumowane w celu sprawdzenia czy ich suma wynosi K. Ta informacja jest konieczna do przeprowadzenia korekcji wartości współrzędnych wektora. Wynik sumowania przekazywany jest do bloku POZIOM. Koszt realizacji tego bloku przedstawia tabela (Tab. 11). Opis bloku NORMA2 w języku VHDL zawiera załącznik (Dodatek 3.6). Tab. 11. Zasoby sprzętowe bloku NORMA2 ZASOBY KOSZT [LICZBA BITÓW] REJESTRY K_LOG2∗(L_VALUE+2)+2∗L_LOG2+1 SUMATORY K_LOG2+L_LOG2 Blok POZIOM Na podstawie informacji o wartości niedoboru sumy współrzędnych wektora z bloku NORMA2 oraz posortowanych wartości błędu dzielenia z bloku SORT wyznaczany jest poziom wartości błędu, powyżej którego odpowiednie współrzędne wektora będą korygowane w górę. Jeżeli suma z bloku NORMA2 wykazuje nadmiar o wartość n to z szeregu błędów od góry wybierana jest n-ta wartość. Koszt realizacji tego bloku przedstawia tabela (Tab. 12). Opis bloku SORT w języku VHDL zawiera załącznik (Dodatek 3.8) Tab. 12. Zasoby sprzętowe bloku POZIOM ZASOBY KOSZT [LICZBA BITÓW] REJESTRY 2∗ERROR_WIDTH+4∗L_LOG2+4 SUMATORY 3∗L_LOG2+2 KOMPARATORY L_LOG2+1 79 Blok KORYGUJ Blok KORYGUJ przeprowadza korekcję współrzędnych kodowanego wektora. Zaokrąglenia podczas dzielenia powodują, że przeskalowany punkt nie znajduje się na piramidzie. Zgodnie z algorytmem (Algorytm 5) przeprowadzana jest korekcja. Możemy mieć do czynienia z niedoborem sumy współrzędnych, więc wartości dla których błąd dzielenia był największy są zwiększane o jeden. Ilość zwiększanych współczynników jest równa wartości niedoboru wyznaczonej według sumy z bloku NORM2. Blok odtwarza dodatkowo znak współrzędnych wektora na podstawie informacji o numerze ćwiartki układu współrzędnych przekazywanej z opóźnieniem z bloku MODUL. Koszt realizacji tego bloku przedstawia tabela (Tab. 13). Opis bloku KORYGUJ w języku VHDL zawiera załącznik (Dodatek 3.9). Tab. 13. Zasoby sprzętowe bloku KORYGUJ ZASOBY KOSZT [LICZBA BITÓW] REJESTRY 2∗ MODSUM_WIDTH+L_LOG2+2∗K_LOG2+2 SUMATORY K_LOG2+L_LOG2 KOMPARATORY DATA_WIDTH+L_LOG2 Bloki OPOZ Ze względu na to, że przetwarzanie w module kwantyzatora w wielu miejscach odbywa się w równoległych torach konieczna jest synchronizacja danych przychodzących do poszczególnych modułów (patrz Rozdział 0). Do wyrównywania czasu przetwarzania w różnych torach służą bloki OPOZ, które są zwykłymi cyfrowymi liniami opóźniającymi. Długość i szerokość tych linii w różnych punktach modułu jest różna (Tab. 14). Tab. 14. Długość i szerokość bloków OPOZ w module kwantyzatora OPOZ DŁUGOŚĆ SZEROKOŚĆ A NBROFONES MODSUM_WIDTH B 2∗L_VALUE-2 K_VAL_LOG2 C 3∗L_VALUE ERROR_WIDTH D 3∗L_VALUE+K_VAL_LOG2+7 1 80 Koszt realizacji tego bloku w funkcji jego szerokości (WIDTH) i długości (LEN) przedstawia tabela (Tab. 15). Opis bloku OPOZ w języku VHDL zawiera załącznik (Dodatek 3.10). Tab. 15.Zasoby sprzętowe modułu OPOZ ZASOBY KOSZT [LICZBA BITÓW] REJESTRY LEN∗(WIDTH+1) Zasoby sprzętowe wymagane do realizacji modułu kwantyzatora Aby oszacować zasoby sprzętowe potrzebne do realizacji całego modułu kwantyzatora dokonano sumowania zasobów zajmowanych przez poszczególne bloki wchodzące w jego skład. Wyniki zawiera tabela (Tab. 16). Tab. 16. Zasoby sprzętowe moduły kwantyzatora ZASOBY KOSZT [LICZBA BITÓW] REJESTRY (5∗L_VALUE+NBROFONES+7)∗ERROR_WIDTH+ (2∗K_LOG2+NBROFONES+3)∗MODSUM_WIDTH+ (L_VALUE+NBROFONES+2)∗DATA_WIDTH+7∗L_LOG2+ (3∗K_LOG2+3∗L_VALUE+NBROFONES+8)∗K_LOG2+13∗L_VALUE+31 SUMATORY (K_VAL_LOG2+1)∗MODSUM_WIDTH+(NBROFONES+1)∗DATA_WIDTH+ 6∗L_LOG2+( K_VAL_LOG2+NBR_OF_ONES+2) ∗K_LOG2 KOMPARATORY ERROR_WIDTH∗L_VALUE+MODSUM_WIDTH∗K_LOG2+DATA_WIDTH+ L_LOG2+2 7.5. Moduł kodera Architektura opracowanego kodera dzięki przyjętym założeniom odznacza się ogromną prostotą. Po przyjęciu, że odpowiednie wartości zakresów z algorytmu kodowania PVQ (Algorytm 6) znajdują się w preprogramowanej pamięci ROM lub RAM proces kodowania polega na kolejnym dodawaniu do siebie wartości z tej pamięci. Moduł kodera funkcjonalnie można więc podzielić na dwa bloki: blok sumatora i blok pamięci (Rys. 31). Kolejne wartości współrzędnych wektora do zakodowania wprowadzane są do bloku sumatora. Na podstawie indeksu współrzędnej jej wartości i znaku oraz wartości współrzędnych o niższych indeksach (wprowadzonych wcześniej) na linie adresowania 81 pamięci K i L wystawiane są odpowiednie dane, które powodują dostęp do wartości, którą należy dodać do tworzonego aktualnie kodu symbolu. PAMIĘĆ T(L, K) DANE K SUMATOR L SYMBOL Rys. 31. Budowa modułu kodera do algorytmu PCPVQ Jeżeli w bloku sumatora pojawia się nowa współrzędna, to jak to wynika z przedstawionego algorytmu kodowania (Algorytm 6) w pamięci musi być zapisana wartość progu zakresu, od którego począwszy znajdują się kody wszystkich wektorów, które odpowiadają danej wartości wprowadzonej współrzędnej. Wartość progu, która odpowiada numerowi indeksu l, liczbie k i znakowi współrzędnej s, którą należy zapisać w pamięci stałej pod adresem odpowiadającym wartościom k, l i s jest wyrażona wzorem: 0 1 T (l , k , s ) = T (l , k + 1, s ) + 2 * N ( L − l , K − k − 1) T ( l ,− k , s ) + N ( L − l , K + k ) dla k = K i s = 0; dla k = K i s = 1; dla k ≠ K i s = 0; ( 49) dla k ≠ K i s = 1; Wartość l należy rozumieć jako indeks współrzędnej wektora z zakresu <1 do L>. Liczba k nie jest wartością aktualnej współrzędnej lecz sumą wartości bezwzględnych współrzędnych o indeksach kodowanych wcześniej i aktualnie. Wartość współrzędnej może być ujemna i dodatnia. We wzorze ( 49) k przyjmuje wartości dodatnie, a znak aktualnej współrzędnej reprezentuje wartość s. Dla s=0 wartość jest dodatnia, a dla s=1 wartość jest ujemna. Adresowanie pamięci można rozumieć jako złożenie wartości l, k i s, na magistrali adresowej pamięci, ale niekoniecznie tak być musi. Jeżeli bit s będzie na najmłodszym bicie adresu to uzyskamy kolejność umiejscowienie progów jak na rysunku (Rys. 32), to znaczy, że wartości indeksów ujemnych i dodatnich współrzędnych będą się znajdować w pamięci na przemian. 82 Pamięć musi zawierać 2∗(K+1)*L komórek pamięci. Ilość bitów tej pamięci została omówiona w rozdziale dotyczącym pamięci kodera. Kolejne współrzędne sukcesywnie zawężają zakres kodowania (Rys. 32). k=x1 K próg 0 k= sign(x2)∗ ∗(|x1|+|x2|) próg K -K K-1 -(K-1) -2 1 -1 0 -K K-1 -(K-1) -2 1 -1 0 0 Rys. 32. Proces iteracyjnego zawężania zakresu wartości symbolu kodu dla kolejnych współrzędnych wektora Każda współrzędna wektora może przyjmować wartości z zakresu <–K do K >. Trzeba zwrócić uwagę, że zakresy odpowiadające różnym wartościom pierwszej współrzędnej są różnej szerokości. Na przykład jeżeli pierwsza współrzędna ma wartość K to symbol kodujący jest znany od razu, ponieważ kolejne wartości muszą być zerowe (suma ma być równa K). Oznacza to jednostkową długość przedziału dla K. Dla wartości 0 pierwszej współrzędnej przedział jest najdłuższy. Jeżeli pierwsza współrzędna miała wartość 1, a druga współrzędna 0 to szerokość kodowanego przedziału jest taka sama jak dla pierwszej współrzędnej równej 0, a drugiej równej 1. Po prostu w obu przypadkach liczność możliwych do zakodowania kombinacji wynosi N(L-2, K-1). Dlatego wartość liczby k nie jest długością aktualnej współrzędnej ale sumą długości współrzędnych poddanych kodowaniu. Przebieg kodowania zależy zatem od ciągle obliczanej sumy wartości bezwzględnych współrzędnych wektora. Przyjęty przez autora sposób kodowania jest odmienny od sposobu kodowania oryginalnie zaproponowanego przez T.R. Fishera [34]. Odmienność polega na odwróceniu kolejności przedziałów. Fisher formuje przedziały zaczynając od k równego 0. W prezentowanej pracy kodowanie pierwszego przedziału odpowiada k równemu K, a ostatni k równemu 0. Ma to ogromne znaczenie i powoduje, że do kodowania można w ogóle użyć tak prostej architektury i pamięci o takiej wielkości jak zaprezentowana. Przy przyjętym sposobie kodowania następuje pokrywanie wartości progów dla kolejnego indeksu (patrz Tab. 83 3). Nie trzeba więc w dalszym procesie kodowania używać innej pamięci dla różnych wartości współrzędnej w danej chwili. Przykładowo dla pierwszej współrzędnej równej 1 przedział kodowania jest co prawda krótszy niż dla współrzędnej równej 0, ale przedział jest odcinany od góry czyli wartości progów poczynając od dołu pokrywają się co powoduje, że możemy używać tych samych komórek pamięci. Odcinanie od dołu zmieniłoby układ progów w rozważanym przedziale. W kodowaniu nie trzeba uwzględniać tego jakie były poprzednie współczynniki, ale wystarczy tylko uwzględnić ich sumaryczną długość Przykład: Jako przykład zostanie zaprezentowane kodowanie wektora X(1,1,2) leżącego na piramidzie P(3,4). 1. x1=1; T(1,1,0)=2∗N(L-1,K-2)+2∗N(L-1,K-3)+2∗N(L-1,K-4)+0= 2∗8+2∗4+2=26 2. x2=1; T(2,2,0)=2∗N(L-1,K-3)+2∗N(L-1,K-4)+0= 2∗2+2=6 3. x3=2; T(3,0,0)=0 4. symbol=(T(1,1,0)+ T(2,2,0)+ T(3,0,0)=32. Blok SUMATOR Blok SUMATOR tworzy unikalny kod odpowiadający kodowanemu punktowi z piramidy PVQ. Dla kolejnych wartości współrzędnych wektora sumuje on wartości z bloku PAMIĘĆ. Blok pamięć jest adresowany aktualnym indeksem współrzędnej kodowanego wektora l, wartością k, która jest sumą wartości bezwzględnych zakodowanych do tej pory i bitem znaku s aktualnej współrzędnej. Przetworzenie jednej współrzędnej trwa 2 takty zegara. W pierwszym takcie zegara pobierana jest zawartość pamięci, a drugim takcie dokonywane jest sumowanie. Zasoby sprzętowe bloku zawiera tabela (Tab. 17). Opis bloku SUMATOR w języku VHDL zamieszczono w załączniku (Dodatek 4.1). Tab. 17. Zasoby sprzętowe bloku SUMATOR ZASOBY KOSZT [LICZBA BITÓW] REJESTRY 2∗SYMBOL_WIDTH+K_WIDTH+L_WIDTH+2 SUMATORY SYMBOL_WIDTH+K_VAL_LOG2+L_VAL_LOG2 84 Blok PAMIĘĆ Blok pamięci zawiera wartości T(l, k, s). Jak wynika z podanego zapisu tablica, którą ma reprezentować pamięć, ma charakter trójwymiarowy, ale w praktyce można wprowadzić liniowe adresowanie w jednym ciągłym obszarze pamięci. Takie rozwiązanie nie jest jednak najlepsze. W rozważaniach należy podkreślić, że wartości, które powinny znaleźć się w pamięci są ogromnie duże. Skonstruowanie jednej liniowo adresowanej pamięci prowadzi do rozrzutności istnieją bowiem duże różnice w szerokości potrzebnej do zapisania wartości T(l, k, s) dla małych i dużych l. Ponieważ liczba symboli potrzebnych do zakodowania wszystkich punktów na piramidzie P(L,K) wynosi oczywiście N(L,K), to gdyby zastosować jedną pamięć o szerokości magistrali danych wystarczającej do zapisania największej występującej wartości, wielkość bitowa B1 takiej pamięci wyraża się wzorem (2 ∗ K + 1) ∗ L ∗ (LOG 2 (N (L, K )) + 1) ( 50) Jeżeli podzielimy pamięć na bloki odpowiadające różnym wartością l (Rys. 33) to liczba wszystkich bitów B1 potrzebnych do zapamiętania tablicy T(l, k, s) wynosi L ( 2 ∗ K + 1) ∗ ∑ (LOG 2 (N (l , K )) + 1) ( 51) l /1 Do konstrukcji bloku PAMIĘĆ można użyć zewnętrznej pamięci RAM. W takim wypadku ze względu na niewielki koszt takich modułów pierwsze podejście wydaje się bardziej atrakcyjne. Jeżeli jednak chcemy zapisać wartości pamięci na stałe w tej samej technologii, w której wykonujemy resztę układu (wewnątrz FPGA), jako bardziej oszczędne powinno być rozważone rozwiązanie drugie. Kiedy decydujemy się, że budujemy własne moduły pamięci łatwo jest zaprojektować dynamiczną szerokość magistrali danych. PAMIĘĆ 1 PAMIĘĆ 1 n1 PAMIĘĆ 1 n2 nk MULTIPLEKSER DANE ADRES n1<n2<...<nk Rys. 33. Sposób dzielenia pamięci na moduły o różnej szerokości magistrali danych 85 7.6. Moduł dekodera Moduł dekodera ma za zadanie odtworzenie współrzędnych wektora na podstawie wprowadzonego słowa kodowego. Zadanie tego modułu polega więc na porównaniu wartości kodu z odpowiednimi przedziałami w przestrzeni kodów i na tej podstawie zdecydowanie, który wektor został zakodowany. Dekodowanie może odbywać się indywidualnie dla każdego indeksu współrzędnej xi dla i∈{1,..,L}. Kolejne współrzędne xi modą przyjmować wartości całkowite z zakresu {-K, ...,0, ..., K} istnieje zatem 2∗K+1 przedziałów do zidentyfikowania dla każdej współrzędnej. Zaproponowano architekturę, w której identyfikacja przedziału odbywa się zmodyfikowaną metodą cyklicznego dzielenia całego zakresu zmienności przez dwa. Jeżeli liczba możliwych przedziałów jest potęgą liczby 2, to metodę tą można sprowadzić do stopniowego dekodowania kolejnych bitów binarnej reprezentacji dekodowanej współrzędnej od najstarszego bitu zaczynając. ??? 1 2 3 4 5 6 7 8 1?? 10? 101 Rys. 34. Identyfikacja przedziału metodą stopniowego dzielenia zakresu przez dwa Wprowadzona modyfikacja polega na tym, że dla uproszczenia architektury sprzętowej dekodera dekodowanie odbywa się tak, że dekodowane są kolejne bity niezależnie od tego czy liczba 2∗K+1 jest potęgą liczby 2 czy nie. Liczba przedziałów jest zaokrąglana w górę do najbliższej liczby będącej potęgą dwójki. Dodawane są od góry dodatkowe przedziały, w których nigdy nie znajdzie się dekodowana wartość. Liczba koniecznych komparacji w celu zdekodowania pojedynczej współrzędnej wynosi C = LOG ( 2 * K + 1) + 1 =K_LOG2+1 86 ( 52) Ponieważ do zdekodowania całego wektora musimy odszukać L współrzędnych potrzeba wykonać L∗C komparacji. Struktura dekodera jest w związku z tym matrycą o rozmiarach C×L, w której węzłach znajdują się bloki dekodujące kolejne bity współczynników wektora. Każdy blok komparatora musi być powiązany z pamięcią, w której zapisane są wartości progowe, z którymi ma być porównywana dekodowana wartość (Rys. 35). Z pamięcią nie musi być powiązany blok pierwszej komparacji, ponieważ w tym bloku porównujemy zawsze z progiem środka przedziału. Drugi komparator porównuje w zależności od wyniku pierwszej komparacji ze środkiem górnej lub dolnej połowy, dlatego drugi blok współpracuje z pamięcią, w której są zapisane dwie wartości (odpowiednio trzeci z pamięcią zapisaną czterema lokacjami itd.). Pamięć o indeksie C musi mieć 2C-1 lokacji. Ponieważ dekodujemy L kolejnych współrzędnych liczba koniecznych do pracy dekodera komórek pamięci wynosi L∗2C-1. PAMIEĆ 1_2 PAMIEĆ 1_3 PAMIEĆ 1_C KOD indeks 1 KOMP_P 1_1 KOMP 1_2 KOMP 1_3 KOMP 1_C PAMIEĆ 2_2 PAMIEĆ 2_3 PAMIEĆ 2_C indeks 2 KOMP_P 2_1 KOMP 2_2 KOMP 2_3 KOMP 2_C PAMIEĆ L_2 PAMIEĆ L_3 PAMIEĆ L_C indeks L KOMP_P L_1 KOMP L_2 KOMP L_3 Rys. 35. Struktura dekodera algorytmu kodowania PVQ 87 KOMP L_C Kod symbolu przechodzi kolejno od bloku do bloku komparacji. Wraz z kodem pomiędzy blokami propaguje się również informacja o bitach już zdekodowanych. Każdy blok dekodera dekoduje bit współrzędnej w ciągu dwóch taktów zegara. Z tego wynika, że co dwa takty zegara można wprowadzać do modułu nowy symbol do zdekodowania. Fakt ten ogranicza wykorzystanie układu do wartości L≥2. Wprowadzone symbole są rozkodowywane równolegle. Pełne rozkodowanie ma miejsce kiedy dany symbol dojdzie do ostatniego bloku w ostatnim wierszu. Po przejściu każdego pełnego wiersza znana jest jedna współrzędna wektora. Bloki KOMP Blok KOMP jest komórką decyzyjną w strukturze dekodera. Porównuje on wartość kodu symbolu z zawartością dołączonej pamięci i na tej podstawie dekoduje pojedynczy bit wartości współczynnika. Z pamięci pobierana jest wartość, która odpowiada środkowej wartości przedziału zdekodowanego w blokach poprzedzających. Pierwszy w każdym wierszu blok KOMP jest nieco odmienny ponieważ nie współpracuje on z pamięcią. Dla rozróżnienia nazywany on będzie KOMP_P. Szerokość magistrali adresującej pamięć w zależności od numeru dekodowanego bitu b∈{0, 1, ..., C-1} i wynosi 2C-b-1. Zasoby sprzętowe konieczne do realizacji bloku KOMP_P zawiera tabela(Tab. 18). Opis bloku w języku VHDL zawiera załącznik (Dodatek 5.1). Zasoby sprzętowe konieczne do realizacji bloku KOMP zawiera tabela (Tab. 19). Opis bloku w języku VHDL zawiera załącznik (Dodatek 5.2). Tab. 18. Zasoby sprzętowe bloku KOMP_P ZASOBY KOSZT [LICZBA BITÓW] REJESTRY COEF_WIDTH+ADDRESS_WIDTH+2 SUMATORY COEF_WIDTH KOMPARATORY COEF_WIDTH Tab. 19. Zasoby sprzętowe bloku KOMP ZASOBY KOSZT [LICZBA BITÓW] REJESTRY 2∗COEF_WIDTH+2∗ADDRESS_WIDTH+2 SUMATORY COEF_WIDTH KOMPARATORY COEF_WIDTH 88 Bloki PAMIĘĆ Blok pamięć zawiera wartości progów do porównywania. Oprócz zawartości poszczególne bloki pamięci różnią się szerokość magistrali adresowej (liczbą lokacji) i szerokością magistrali danych. W obrębie jednego wiersza matrycy dekodującej szerokość magistrali danych jest stała i wynosi LOG 2 (N (L − i + 1, K )) + 1 ( 53) gdzie: i∈{1, 2,..., L } indeks dekodowanej współrzędnej,. N(L,K) - największa spodziewana wartość. Ilość wszystkich lokacji pamięci potrzebnych do zdekodowania jednej współrzędnej (w jednym wierszu matrycy) wynosi C −1 ∑2 y = 2C − 1 ( 54) y/0 gdzie: C - ilość bitów dekodowanej wartości lub inaczej iloścć bloków komparacji. Z dwóch powyższych wzorów można wyliczyć wielkość bitową potrzebnej pamięci ( ) L M = 2 c − 1 * ∑ LOG 2 (N (L − i + 1, K )) + 1 ( 55) i /1 O ile w bloku kodera pamięć komunikowała się z jednym blokiem wykonawczym to w bloku kodera wymagana jest równoległa współpraca z pamięcią wielu modułów komparacji. Powoduje to, że raczej nie opłacalne i nie możliwe jest zastosowanie uniwersalnych modułów pamięci zewnętrznej. Bloki pamięci muszą być implementowane wraz z blokami komparacji w jednej technologii i w jednej strukturze. Powoduje to spore zapotrzebowanie na zasoby sprzętowe FPGA potrzebne do praktycznej realizacji proponowanej struktury dekodera. Bloki LOPOZ Ponieważ zdekodowane współrzędne pojawiają się na wielu wyjściach dekodera nie w sposób jednoczesny do każdego wyjścia muszą być jeszcze dodane linie opóźniające LOPOZ (nie uwidocznione na rysunku dekodera), które zsynchronizują moment pojawiania się współrzędnych tego samego wektora na wyjściu. Pierwsza współrzędna, gotowa już po przejściu pierwszego wiersza, musi odczekać, aż kod dojdzie do końca ostatniego wiersza, aby wszystkie współrzędne mogły być równocześnie w komplecie odczytane. Szerokość tych linii opóźniających jest szerokością zdekodowanej współrzędnej punktu na piramidzie: K_LOG2. Długość jest natomiast zmienna i zależy od numeru wyjścia. 89 Koszt realizacji tego bloku w funkcji jego szerokości (WIDTH) i długości (LEN) przedstawia tabela (Tab. 15). Blok OPOZ Blok OPOZ nie został uwidoczniony na schemacie blokowym dekodera jednak powinien on być uwzględniony jako element jego struktury. Pełna informacja o zakodowanym wektorze w przypadku kodowania PCPVQ składa się z kodu punktu na piramidzie oraz długości zakodowanego wektora. Blok dekodera konwertuje kod na odpowiednie współrzędne punktu na piramidzie, ale nie wykonuje żadnych działań na długości wektora. Aby informacja o długości wektora nie zaginęła, w architekturze potokowej długość musi być przeniesiona z wejścia na wyjście. Do tego celu użyto linii opóźniającej. Gwarantuje ona, że zdekodowane współrzędna punktu pojawią się na wejściu dekwantyzatora równocześnie z odpowiednią długością. Szerokość linii opóźniającej wynosi tyle co szerokość długości wektora czyli SYMBOL_WIDTH, a jej długość wynosi 2∗K_LOG2+2. Podana szerokość jest odpowiednia przy założeniu, że dane do rozkodowania są wprowadzane do dekodera co L taktów zegara. Jest to sensowne jeżeli zakładamy, że w jednym takcie zegara jest przetwarzany jeden element danych obrazowych, a kod i długość niosą informacje o L takich elementach. Koszt realizacji tego bloku w funkcji jego szerokości (WIDTH) i długości (LEN) przedstawia tabela (Tab. 15). Zasoby sprzętowe modułu dekodera Aby obliczyć zasoby sprzętowe modułu dekodera należy zsumować zasoby sprzętowe wszystkich bloków komparacji i pamięci znajdujących się w węzłach tablicy L×(K_LOG2+1) i linii opóźniających wyjścia z dekodera uwzględniając to że każdy węzeł ma indywidualną szerokość magistral i użytych rejestrów. Do opisu bloku KOMP należy podać dwa parametry generic: COEF_WIDTH i ADDRESS_WIDTH. Wartość tych parametrów zależy od położenia (g, h) bloku w tablicy dekodera : COEF _ WIDTH = LOG 2 (N ( L − g , K ) + 1 ; g ∈ {0,1,.., L − 1} ( 56) ADDRESS _ WIDTH = h ; h ∈ {0,1,.., C − 1} ( 57) 90 Do kompletnych szacunków konieczna jest jeszcze zależność długości linii opóźniającej LOPOZ w funkcji numeru wyjścia i. Przy założeniu, że symbol jest wprowadzany do dekodera co L taktów zegara zależność ta przyjmuje postać LEN = 2 ∗ (L − i − 1) ∗ (K _ LOG 2 + 1) + 2 ; i ∈ {0, 1, ..., L - 1} ( 58) L Korzystając z tych zależności oraz tablic (Tab. 19), (Tab. 18) i (Tab. 15) można oszacować potrzebne do realizacji bloków dekodera zasoby. Tab. 20. Zasoby sprzętowe wszystkich bloków KOMP w tablicy dekodera ZASOBY KOSZT [LICZBA BITÓW] REJESTRY L −1 C −1 2 ∗ (C − 1) ∗ ∑ (LOG 2 (N (L − g , K )) + 1) + L ∗ ∑ h + L g /0 h /1 SUMATORY L * ∑ LOG 2 ( N (L − g , K )) + 1 L −1 g /1 KOMPARATORY L −1 L * ∑ LOG 2 ( N (L − g , K )) + 1 g /1 Tab. 21. Zasoby sprzętowe wszystkich bloków KOMP_P w tablicy dekodera ZASOBY KOSZT [LICZBA BITÓW] REJESTRY L ∗ (LOG 2 ( N (L, K )) + 3) SUMATORY L ∗ (LOG 2 ( N (L.K )) + 1) KOMPARATORY L ∗ (LOG 2 ( N (L.K )) + 1) Tab. 22. Zasoby sprzętowe wszystkich bloków LOPOZ w tablicy dekodera. ZASOBY KOSZT [LICZBA BITÓW] REJESTRY (K _ LOG 2 + 1) ∗ ∑ (L − i − 1) ∗ (K _ LOG 2 + 1) = ( K _ LOG 2) L −1 L i/0 2 2 ∗L Aby uzyskać informacje o wymaganych zasobów dla realizacji dekodera należy zsumować zawartość tabelek (Tab. 20)(Tab. 21)(Tab. 22) i ilość pamięci ze wzoru ( 55). 91 7.7. Moduł dekwantyzatora Moduł dekwantyzatora odtwarza zakodowane dane wizyjne. Odtworzenie odbywa się na podstawie rozkodowanych w dekoderze współrzędnych wektora na piramidzie i informacji o długości wektora pierwotnego. Struktura dekwantyzatora (Rys. 36) jest bardzo prosta bowiem jego zadanie sprowadza się praktyczne do pomnożenia współczynników wektora na piramidzie przez długość wektora pierwotnego i podzielania wyniku przez promień piramidy K. Współrzedne wektora są wyprowadzane z dekodera równolegle, dlatego pierwszym blokiem dekwantyzatora jest blok zamieniający postać równoległą tych danych na szeregową. MODUL WEKTOR’ RÓWNOLEGLE ROWDOSZER OPOZ WEKTOR’ SZEREGOWO ODTWORZ MODUL WEKTOR MNOZ WEKTOR∗MODUL DZIEL DANE=(WEKTOR∗MODUL)/K Rys. 36. Struktura blokowa modułu dekwantyzatora Zdekodowane w dekoderze wartości nie są wprost wartościami współczynników podobnie jak podczas kodowania liczba k w procesie kodowania nie była współczynnikiem lecz sumą bezwzględną współrzędnych zakodowanych wcześniej. Dlatego, aby uzyskać właściwie wyrażone wartości współrzędnych wektora potrzebny jest blok ODTWORZ. Wykonuje on działanie wyrażone wzorem: i −1 xi = k i − ∑ x y = k i − k i −1 ( 59) y/0 Gdzie: xi - właściwa i-ta współrzędna wektora, ki - zdekodowana w dekoderze i-ta wartość. Blok MNOZ mnoży współrzędne wektora przez długość wektora pierwotnego, a blok DZIEL dzieli przez K. W rezultacie otrzymujemy wektor o długości wektora pierwotnego. 92 Blok ROWDOSZER Zasoby sprzętowe konieczne do realizacji bloku ROWDOSZER zawiera tabela (Tab. 23). Opis bloku w języku VHDL zawiera załącznik (Dodatek 6.1). Tab. 23. Zasoby sprzętowe bloku ROWDOSZER ZASOBY KOSZT [LICZBA BITÓW] REJESTRY (L_VALUE+1)∗K_VAL_LOG2+L_VALUE+3 Blok ODTWORZ Zasoby sprzętowe konieczne do realizacji bloku ODTWORZ zawiera tabela (Tab. 24). Opis bloku w języku VHDL zawiera załącznik (Dodatek 6.2). Tab. 24. Zasoby sprzętowe bloku ODTWORZ ZASOBY KOSZT [LICZBA BITÓW] REJESTRY 3∗K_VAL_LOG2+4 SUMATORY 2∗K_VAL_LOG2 Blok MNOZ Zasoby sprzętowe konieczne do realizacji bloku MNOŻ zawiera tabela (Tab. 25). Opis bloku w języku VHDL zawiera załącznik (Dodatek 6.3). Tab. 25. Zasoby sprzętowe bloku MNOŻ ZASOBY KOSZT [LICZBA BITÓW] REJESTRY 2∗(DATA_WIDTH+L_VAL_LOG2)∗(DATA_WIDTH+L_VAL_LOG2 +K_VAL_LOG2+1)+DATA_WIDTH+K_VAL_LOG2+2 SUMATORY (DATA_WIDTH+L_VAL_LOG2+K_VAL_LOG2)∗ (DATA_WIDTH+L_VAL_LOG2-2) Blok DZIEL Zasoby sprzętowe konieczne do realizacji bloku DZIEL zawiera tabela (Tab. 26). Opis bloku w języku VHDL zawiera załącznik (Dodatek 6.4). 93 Tab. 26. Zasoby sprzętowe bloku DZIEL ZASOBY KOSZT [LICZBA BITÓW] REJESTRY (DATA_WIDTH+K_VAL_LOG2+1)∗(2∗DATA_WIDTH+K_VAL_LOG2+4) SUMATORY DATA_WIDTH∗ (DATA_WIDTH-K_VAL_LOG2) KOMPARATORY DATA_WIDTH∗ (DATA_WIDTH-K_VAL_LOG2) Blok OPOZ Blok OPOZ jest konieczny jeżeli do modułu dekwantyzatora równocześnie są wprowadzone współczynniki wektora na piramidzie i długość wektora odtwarzanego. Ponieważ każdy odtwarzany wektor jest scharakteryzowany przez L współrzędnych punktu na piramidzie i jedną długość wektora, długość wektora jest wprowadzana do modułu co L taktów zegara. Długość wektora musi być opóźniona na czas przetwarzana współczynników w blokach ROWDOSZER i ODTWORZ bowiem jest potrzebna dopiero w bloku MNOZ. Szerokość linii opóźniającej wynosi tyle co szerokość długości wektora czyli DATA_WIDTH+L_VAL_LOG2, a jej długość wynosi 3. Koszt realizacji tego bloku w funkcji jego szerokości (WIDTH) i długości (LEN) przedstawia tabela (Tab. 15). Zasoby sprzętowe modułu dekwantyzatora Całkowite zasoby sprzętowe konieczne do realizacji modułu dekwantyzatora przedstawia tabela poniżej. Tab. 27. Zasoby sprzętowe modułu dekwantyzatora ZASOBY KOSZT [LICZBA BITÓW] REJESTRY (2∗MODULE_WIDTH+4)∗MODULE_WIDTH+ (DATA_WIDTH-K_LOG2+1)∗DATA_WIDTH+ (2∗MODULE_WIDTH+L_VALUE+2)∗K_LOG2+ 4∗DATA_WIDTH-4∗K_LOG2+MODULE_WIDT+LVALUE+21 SUMATORY 2∗(K_LOG2+1)+(MODULE_WIDTH+K_LOG2)∗(MODULE_WIDTH-2) 94 8. Rekonfigurowalny system kodowania obrazu 8.1. Wprowadzenie Od momentu pojawienia się reprogramowalnych układów cyfrowych nieśmiało pojawiały się pomysły wykorzystania ich w nowej generacji systemów obliczeniowych. Od dawna bowiem zdawano sobie sprawę, że zwiększanie wydajności współczesnych komputerów metodą polepszania technologii (mniejszy tranzystor), a zatem możliwości uzyskania szybszego zegara dobiegnie w końcu kresu swoich możliwości. Twórcy architektur komputerowych wiedzą, że drugą metodą przyśpieszenia pracy procesora jest specjalizacja struktury jego budowy pod katem wykonywania określonych zadań. Stąd ciągłe badania nad statystyką wykonywanych algorytmów i takie projektowanie nowych procesorów, aby najefektywniej wykonywały najczęstsze konstrukcje algorytmów. Stąd też, wbudowane instrukcje specjalne, wykonujące typowe, złożone obliczeniowo operacje multimedialne. Jest to droga słuszna i na obecnym etapie z komercyjnego punktu widzenia jedyna opłacalna. W zastosowaniach specjalistycznych postawiono jednocześnie na architektury specjalizowane do realizacji ściśle określonego zadania czy algorytmu. Przykładem mogą tu być procesory sygnałowe zaprojektowane dla potrzeb cyfrowego przetwarzania sygnału, które zachowują pewne znamiona uniwersalności, ale okupują to mniejszą wydajnością w stosunku do rozwiązań, które są jeszcze bardziej wyspecjalizowane. W stosunku do tych ostatnich funkcjonuje pojęcie procesora sprzętowego (sprzętowego akceleratora), który zaprojektowany do realizacji jednego, ściśle określonego algorytmu jest w stanie efektywnie wykonywać zadany algorytm nawet w jednym takcie zegarowym. Wadą rozwiązania opartego na procesorze sprzętowym jest oczywiście jego koszt. Wymagamy bowiem od określonego użytkownika, aby dla każdego rozwiązywanego przez siebie problemu dysponował osobnym układem scalonym. Jest to nie do przyjęcia dla szerokiego grona użytkowników komputerów. W związku z pojawieniem się układów rekonfigurowalnych pojawia się jednak szansa na pogodzenie tych sprzeczności. Jeżeli zamiast procesora, w naszym systemie obliczeniowym dysponujemy dowolnie konfigurowalnymi zasobami komponentów cyfrowych możemy sobie wyobrazić, że nasz system każdorazowo zostanie skonfigurowany, tak jak tego wymaga aktualnie stosowany algorytm. Taka ma być przyszłość systemów obliczeniowych [3]. Trzeba jednak podkreślić, że nawet jeśli nie nastąpi jakiś diametralny przełom w technologii wykonywania procesorów ogólnego stosowania, to droga do tego typu rekonfigurowalnych rozwiązań nie wydaje się być łatwa i krótka. Można zadać sobie pytanie, 95 co naprawdę przyczyniło się do rozpowszechnienia procesorów poza ich niską ceną. Niewątpliwie jest to obfitość oprogramowania, czyli zakodowanych różnego rodzaju algorytmów rozwiązujących tak różne problemy, że szkoda nawet próbować ich wymieniać. Obfitość taka, nie miałaby miejsca jeżeli nie łatwość tworzenia nowych aplikacji. Łatwość ta stawała się coraz większa, aż do etapu dnia dzisiejszego, w którym software można sobie narysować, a odpowiednie narzędzia zrobią co trzeba żeby go uruchomić na komputerze w odpowiednim środowisku systemu operacyjnego. Nie na przeszkód, aby układy rekonfigurowalne miały podobnie do procesorów niska cenę. Niska cena jest pochodną powszechności stosowania, zatem przy zwiększającej się popularności układów rekonfigurowalnych należy założyć spadek ich aktualnie dość wysokiej ceny. Jeśli natomiast chodzi o narzędzia do generowania hardware’u (sposobu połączenia pozostających do dyspozycji zasobów cyfrowych), można odnieść wrażenie, że nie osiągnęły one poziomu analogicznego do asemblerów jako narzędzi projektowania softwaru. I nie chodzi tu o stopień zaawansowania i złożoności samego narzędzia Programy tego typu są domeną, w której specjalizuje się niewiele firm na świecie, a złożoność i wyrafinowanie wykonywanych przez nie algorytmów sztuką sama w sobie. Porównanie do asemblerów odnosi się raczej do konieczność zaangażowania w szczegóły implementacyjne wiedzy i doświadczenia projektanta, w tym wypadku sprzętowego programisty. Ideałem byłoby narzędzie, które potrafi zamienić istniejące algorytmy zapisane w językach wyższego poziomu (np.: C) na odpowiednią reprezentację sprzętową. Problem tutaj jest wielopoziomowy. Trzeba bowiem zacząć od tego że nauka o syntezie logicznej, a więc podwaliny tego czego żądamy od sprzętowego kompilatora ciągle jeszcze poszukuje odpowiednio szybkich i wydajnych algorytmów. Gdyby użyć współcześnie dostępnych programów syntezy sprzętu do konwersji zapisu wykonanego w języku C, czy na jedno wychodzi zapisu behawioralnego HDL na bramki logiczne (zakładając, że kod taki był pisany z zachowaniem narzuconych reguł). kompilacja zajęłaby bardzo dużo czasu i w przypadku ogólnym rezultat wymagałby zasobów sprzętowych bramek przekraczających możliwości współczesnych cyfrowych układów reprogramowalnych. Chwilowo konieczny jest kompromis, który można rozumieć jako współistnienie procesorów dedykowanych z procesorami rekonfigurowalnymi. Pomysł opiera się na postulacie, aby procesor rekonfigurowalny był swojego rodzaju koprocesorem odciążającym procesor główny od wykonywania cyklicznie powtarzających się w danym algorytmie sekwencji operacji. 96 Kiedy mówi się o logice rekonfigurowalnej zazwyczaj zakłada się, że mowa o układach FPGA. Należy jednak zdawać sobie sprawę, że nie zawsze kiedy system zawiera układy FPGA oznacza to, że jest rekonfigurowalny. Przez rekonfigurowalnośc rozumiemy bowiem wykorzystanie zdolności systemu do pracy w wielu różnych konfiguracjach sprzętowych zmienianych w trakcie pracy w celu wykonania pojedynczego zadania. Logika rekonfigurowalna umożliwia efektywne korzystanie z większej liczby bramek logicznych niż ich liczba dostępna w systemie. Możemy w związku z tym wyróżnić dwie, atrakcyjne cechy rekonfigurowalności: • częściowa rekonfiguracja (ang. Partial Reprogrammability), polegająca na możliwości zmiany struktury tylko części układu bez konieczności każdorazowego konfigurowania jego całości, • rekonfiguracja w czasie pracy (ang. Run-Time Reprogramability), umożliwiająca zmianę struktury części układu bez konieczności przerywania pracy jego pozostałej części. Rekonfiguracja umożliwia równoczesne rozwiązanie problemu dużej objętości generowanych przez automatyczne narzędzia rozwiązań. Dzięki jej zastosowaniu możliwe jest dzielenie problemów na mniejsze części składowe i kolejne ich ładowanie do mniejszych struktur cyfrowych. Wyniki pośrednie działania kolejnych części tak podzielonego algorytmu przechowywane są w pamięci RAM systemu. 8.2. Systemy rekonfigurowalne w kodowaniu obrazu Wśród wielu zastosowań przy rozwiązywaniu złożonych obliczeniowo problemów szeroko rozumianego przetwarzania sygnałów rekonfigurowalne systemy znalazły zastosowanie również w aplikacjach kompresji obrazu. Prace na ten temat pojawiły się w połowie lat 90. Pierwsze pomysły i zrealizowane aplikacje tego typu podał w swoich pracach Villasenor [et al.] [130][129][105]. Idea zakładała podział algorytmu kompresji na podstawowe bloki funkcjonalne takie jak: estymacja ruchu, transformacja częstotliwościowa (DCT, falkowa), kwantyzacja, kodowanie entropowe, a następnie kolejne ładowanie odpowiedniego bloku do FPGA i przetwarzanie danych wizyjnych etapami. W zrealizowanej i opisanej przez Villasenor’a w [129] implementacji nie zrealizowano estymacji ruchu. Kolejne konfiguracje wykonywały następujące funkcje: transformacja falkowa, kwantowanie ADPCM połączone z RLC oraz kodowanie entropijne VLC. Należy zaznaczyć, że zastosowane algorytmy zostały wybrane według kryterium ich maksymalnej prostoty. Nie może to dziwić jeżeli wziąć pod uwagę pojemność zastosowanego układu 97 FPGA (CLAy31 5000 bramek). Celem tego rozwiązania była oszczędność zasobów sprzętowych i faktycznie został on przez autorów osiągnięty. Pamięć konfiguracji Estymacja ruchu Transformacja FPGA RAM Kwantyzacja Kodowanie entropijne Rys. 37. Rekonfigurowalny system kompresji obrazu Inne zastosowania z zakresu kompresji obrazu bazują raczej na koncepcji układu rekonfigurowalnego jako koprocesora. Pojawiło się sporo rozwiązań z zakresu implementacji w FPGA algorytmów wykorzystywanych w kompresji obrazu: DCT, IDCT [48][14][38][37], transformacji falkowej [5][72], estymacji ruchu [14][152], kodowania RLC/VLC [51][52]. Argument oszczędności powierzchni zasobów stosowanego układu to nie jedyny powód skłaniający do zastosowania logiki programowalnej jako platformy dla kompresji obrazu. W pracy [14] zwrócono uwagę na kolejny. Algorytmy cyfrowej wizji podlegają pewnego rodzaju parametryzacji. Parametryzacja ta ma wiele aspektów i jest mocno związana z częstotliwością z jaką zachodzić by miała rekonfiguracja. Najbardziej rozciągnięta w czasie jest rekonfiguracja związana z ustanawianiem międzynarodowych standardów kodowania obrazu. Rekonfiguracja w takim wypadku może zapewnić kompatybilność sprzętu z różnego rodzaju zmieniającymi się standardami zapisu obrazu. Po drugiej stronie osi częstości rekonfigurowania jest parametryzacja algorytmu związana z dostosowaniem wykonywanego algorytmu do chwilowych warunków kodowania strumienia wideo. 8.3. Buforowanie danych Architektura potokowa rozważana w tej pracy zakłada ciągły przepływ danych poprzez system obliczeniowy. Dane są bez przerwy wprowadzane do systemu z częstotliwością f i wyprowadzane z taką sama częstotliwością, lecz opóźnione. Tu pojawia się problem, bowiem aby zrekonfigurować system potrzebny jest czas, luka w procesie przetwarzania 98 danych. Co jednak robić z ciągle napływającymi w tym czasie danymi? Jedynym rozwiązaniem jest wprowadzenie buforowania danych tak, aby w czasie rekonfiguracji mogły się one gromadzić w celu późniejszego przetworzenia. Od razu jednak widać, że aby możliwe były takie luki czasowe w przetwarzaniu danych, częstotliwość pracy systemu rekonfigurowalnego fR musi być większa od częstotliwości systemu f. Schemat pracy jest zatem taki jak przedstawiono na rysunku (Rys. 38). Dane wprowadzane są z częstotliwością f do jednego z bloków pamięci np.: RAM1. W tym czasie pamięć RAM2 jest podłączona do układu rekonfigurowalnego, który w danej chwili albo jest rekonfigurowany, albo przetwarza dane z RAM2. Wynik pracy układu FPGA zapisywany jest w jednym z bloków pamięci wyjściowej RAM3 lub RAM4. Drugi blok jest odczytywany z częstotliwością f. Długość każdego z buforów RAM lB może być według następującego wzoru ( 60) lB = TC ∗ f R fR −1 f ( 60) gdzie TC całkowitym jest czasem potrzebnym na rekonfigurację układu FPGA podczas przetwarzania danych z pojedynczego bufora RAM. Dane rekonfiguracyjne RAM1 RAM3 Dane2 Dane1 fpga f fR f RAM2 f RAM4 sel Rys. 38. Synchronizacja pracy architektury potokowej z układem rekonfigurowalnym 8.3.1. Przykład. Kodowanie współczynników transformaty falkowej. Obraz o rozdzielczości 512×512 przesyłany jest 25 ramek na sekundę. Z tego wyliczamy częstotliwość zegara f systemu: 512∗512∗25=6,5 MHz. Załóżmy, że kodujemy dane obrazowe poddane transformacie falkowej dwupoziomowej (Rozdział 2.2.2). Jeżeli chcemy przeprowadzić kodowanie każdego z poziomów z innym współczynnikiem liczbą bitów na piksel (ang. bitrate) do zakodowania pojedynczej ramki potrzebujemy trzykrotnie przeładować konfigurację. Zakładamy bowiem, 99 że kodowanie z różnymi gęstościami bitowymi odbywa się przy pomocy różnych architektur sprzętowych. Jeżeli dla XCV1000E czas konfiguracji w trybie ekspresowym SelectMap [149] wynosi ok. 17ms, to z tego wynika Tc=3∗17ms=51ms. Dla fR=66MHz otrzymujemy lBi=360k pikseli. Ponieważ najlepiej aby bufor zawierał pełne ramki, to liczbę pikseli zaokrąglamy w górę do 2 ramek obrazowych. Z przykładu widać, że znaczny czas konfiguracji jest główną przeszkodą we właściwym wykorzystaniu mocy obliczeniowej układu. Praca układu w tym przypadku to zaledwie tylko 13% całkowitego czasu przetwarzania. Wskaźnik ten można polepszyć wydłużając bufor danych, a tym samym zwiększając liczbę przetworzonych danych pomiędzy kolejnymi przeładowaniami konfiguracji. 8.4. Propozycja reprogramowalnej architektury kodera/dekodera wideo W ogólności można stwierdzić, że problem efektywnego, a więc takiego, dla którego uzyskujemy optimum jakości uzyskanego obrazu i ilości potrzebnych do zakodowanie bitów polega na właściwym podziale dysponowanego pasma transmisyjnego pomiędzy odpowiednie składowe informacji wizyjnej (patrz Rozdział 2.4). Zadanie to realizowane jest poprzez odpowiednie sterowanie dokładnością kwantyzacji w odniesieniu do rozważanych części zdekomponowanego strumienia wideo. Kodowanie następujących po sobie ramek obrazu wiąże się z koniecznością kodowania kolejno wszystkich jej składowych częstotliwościowych. Postulowane dostosowanie „ziarna” kwantyzacji do ilości informacji lub ich znaczenia dla subiektywnej percepcji przez człowieka jakości kodowania zawartej w kodowanych danych wiąże się ze zmianami algorytmu kwantowania lub przynajmniej jego parametrów. Problem tan faktycznie nie jest odczuwalny przy realizacji kwantowania przy pomocy procesorów ogólnego stosowania. Wiąże się bowiem z prostą zmianą wykonywanej procedury programu lub jej argumentów. Jeśli chodzi o rozwiązania sprzętowe umożliwienie sterowania parametrami realizowanego algorytmu, o ile w ogóle możliwe i opłacalne tylko w przypadku prostych rozwiązań, skutkuje dodatkowym sprzętem i obniżeniem wydajności pracy. Algorytm PVQ na pewno nie należy do algorytmów, których sparametryzowaną realizację sprzętową w ogóle można sobie wyobrazić. Stąd nasunął się pomysł jego realizacji w układach reprogramowalnych. Polega on na realizacji odpowiednich architektur w 100 zależności od dobranych parametrów i ich ciągłą podmianę w strukturze reprogramowalnej w zależności od żądanych parametrów. Pojawiającą się przy takim podejściu podstawową trudność polegającą na konieczności zaprojektowania kolejnych architektur dla algorytmu w zależności od pożądanych parametrów kwantyzacji udało się rozwiązać przy pomocy automatycznego ich generowania przez specjalnie opracowane programy i dyrektywy generic języka VHDL [7.3]. Automatyczna generacja architektury polega na tworzeniu przy pomocy stworzonych narzędzi jej opisu w języku VHDL w zależności od podanych parametrów. Rozwiązanie oparte na VHDL charakteryzuje szereg zalet i wad. Do zalet należy możliwość przenoszenia takiego opisu pomiędzy różnego rodzaju platformami sprzętowymi. Należy zaznaczyć, że nie ograniczają się one wyłącznie do rodzin układów reprogramowalnych. Zastosowany zapis VHDL umożliwia bowiem realizację w dowolnej technologii ponieważ dla każdej aktualnie stosowanej technologii układów cyfrowych istnieją odpowiednie programy (kompilatory VHDL) i narzędzia do implementacji (ang. fitters) pozwalające na automatyczną realizację struktury fizycznej na podstawie opisu w języku opisu sprzętu HDL (ang. HDL. Hardware Description Language). Zależy również podkreślić, że tworzenie zapisu w HDL jest łatwiejsze i bardziej czytelne od innych sposobów opisu architektury. Aby wymienić wady tego rozwiązania zacząć należy od konieczności konwersji opisu VHDL najpierw na opis w postaci sieci połączeń (schemat), a następnie na fizyczną realizację w wybranej technologii. Dla układów reprogramowalnych jest to mapa programowania, a np.: dla układów ASIC odpowiednie maski stosowane w technologii. Pomiędzy schematem, a fizyczną realizacja istnieją jeszcze etapy pośrednie takie jak: łączenie elementów z bibliotek, rozmieszczanie elementów i ich łączenie ze sobą. Chociaż ta bardzo skrótowo opisana translacja odbywa się automatycznie, to pojedyncza implementacja trwa jednak wiele godzin. Ponadto ścieżka ta stwarza projektantowi szereg trudności związanych z niedoskonałościami oferowanych narzędzi softwarowych. Niedoskonałości te objawiają się błędami działania i ograniczoną możliwośc przenoszenia zapisu VHDL działającego w jednej technologii do technologii innej. Czasochłonność procesu zamiany automatycznie wygenerowanej struktury VHDL na odpowiedni zbiór konfiguracyjny układu reprogramowalnego powoduje to, że istnieje konieczność wstępnego wygenerowania pewnej bazy potrzebnych architektur (plików programujących), które są używane do programowania struktury FPGA w czasie pracy układu. Nie ma możliwości podmiany struktury na podstawie dynamicznie wygenerowanego pliku VHDL. Podmiana musi odbywać się na podstawie opisu już skompilowanego 101 Należy zaznaczyć, że uwaga o automatycznym generowaniu realizacji fizycznej odnosi się w przypadku tej pracy do realizacji w układach Virtex/VirexE oraz narzędzi: kompilatora FPGA_Express firmy SYNOPSYS i fitter’a Alliance firmy Xilinx. Autor nie prowadził prób implementacji na innych platformach chociaż, FPGA_Express obsługuje szeroką gamę układów reprogramowalnych, a pokrewny (nadrzędny) produkt firmy SYNOPSYS Design Compiler jest sam w sobie standardem używanym do realizacji układów typu ASIC. Teoretycznie więc nie powinno być problemów z implementacją utworzonego kodu w dowolnej technologii, ale praktyka autora z układami Virtex pokazała, że podczas praktycznej realizacji można natknąć się na wiele problemów szczegółowych wymagających rozwiązania, w tym na błędy i niedoskonałości używanego software’u. Podstawowym parametrem kwantyzatora jest gęstość bitowa (ang. bitrate). Aby zapewnić możliwość efektywnego kodowania projektowany system musi zapewniać możliwość kodowania z różną jego wartością. Klasycznie projektowany kwantyzator wykonując algorytm software’owy ma możliwość „płynnej” regulacji wartości gęstości bitowej. W zaproponowanej rekonfigurowalnej architekturze wartość ta musi zmieniać się skokowo, bowiem każdej z nich odpowiada inna dostępna w bazie konfiguracja układu reprogramowalnego. Oczywiście im więcej dostępnych konfiguracji tym większa dokładność kształtowania żądanej gęstości bitowej. Wartość gęstości bitowej R w algorytmie PVQ zależy od parametrów L i K ( 29). W praktyce jesteśmy zainteresowani maksymalna wartością L, wtedy uzyskujemy bowiem najlepszą dekorelację kodowanych danych. Wartość K dobieramy tak, aby uzyskać żądane R. Należy jednak pamiętać o koniecznych zasobach sprzętowych koniecznych do realizacji tak dobranego L i K. Zasoby te mogą być oszacowane na podstawie informacji zawartych w podrozdziałach 7.4, 7.5, 7.6, 7.7. W praktyce tak dobieramy te parametry (L, K), aby spełnić warunek dostępnych zasobów sprzętowych. Tego rodzaju analizę dla układów Virtex wykonano w rozdziale 9.4. Przy generowaniu kolejnych architektur odpowiadających różnym parametrom R, należy zwrócić dodatkowo uwagę na właściwe dobranie szerokości bitowej danych wejściowych. Najprościej jest dla każdej gęstości bitowej założyć maksymalną wartość kodowanych współczynników. Nie musi być to jednak korzystne bowiem może się okazać, że te maksymalne współczynniki nie będą nigdy kodowane przy pewnych wartościach bitrate co może prowadzić do lepszego doboru wartości L dla tych wartości. Na przykład. Złożoność architektury modułu kwantyzatora szybko rośnie ze wzrostem L, K i szerokości bitowej współczynnika wejściowego. Małe wartości gęstości bitowej 102 odpowiadają pierwszym poziomom dekompozycji falkowej, które mają relatywnie małe wartości współczynników wejściowych (małe szerokości bitowe). Dlatego dla małych wartości R można założyć mniejsze zakresy współczynników wejściowych, osiągając w ten sposób dla zadanych zasobów sprzętowych większą dozwoloną wartość L. Zastosowanie w kryterium doboru L większej wartości współczynników, wynikającą z wyższych poziomów dekompozycji negatywnie odbiłoby się na uzyskanej możliwej do realizacji wartości L dla małej gęstości bitowej. Na rysunku (Rys. 39) przedstawiono koncepcyjny model budowy kodera sekwencji wideo opartego o rekonfigurowalny moduł kwantyzatora. Kwantyzator działa według algorytmu kwantyzacji wektorowej PVQ. Dla uściślenia (przykładowo) w procesie kodowania oparto się na dekompozycji falkowej. Oczywiście nie ma przeszkód, aby w bloku dekompozycji realizować transformatę Fouriera lub DCT. Jak w każdym klasycznym koderze sekwencji wideo dokładność kwantyzacji zależy od 3 czynników: 1. kodowanej składowej częstotliwościowej, 2. rodzaju ramki: inter/intra, 3. dostępnego pasma transmisyjnego QOS (ang. QOS – Quality Of Service). Te trzy informacje skutkują podjęciem przez logikę sterującą decyzji o aktualnie pożądanej gęstości bitowej. Dobrana gęstość bitowa implikuje odpowiednie wartości L i K, a te z kolei odpowiednią architekturę kwantyzatora. Bardziej zaawansowane kodery stosują ponadto technikę predykcji rodzaju kodowanej sceny i w zależności od jej złożoności (zawartej informacji wizyjnej) dokonują bardziej lub mniej szczegółowego kwantowania. Zaproponowaną architekturę można wyposażyć w tego rodzaju predyktor. Dawałby on czwarty argument, na podstawie którego układ decyzyjny dobiera rodzaj kwantyzatora. 103 PAMIĘĆ POPRZEDNIEJ RAMKI KOMPOZYCJA FALKOWA INDEKS PIRAMIDY (B) ESTYMACJA RUCHU DEKOMPOZYCJA FALKOWA BUFOR PVQ (L,K) N, N+3, N+1, N+2 INTER/ INTRA WYBÓR KODOWANEGO SUB PASMO WYBÓR KODOWANIA WEWNĄTRZ I MIĘDZYOBRAZO WEGO ILOŚĆ BITÓW NA PIKSEL KONFIGURACJA SPRZĘTU KONTROLA ZAJETOŚCI BUFORA TRANSMISJI Rys. 39. Schemat blokowy systemu kompresji obrazu z rekonfigurowalnym kwantyzatorem 104 WSPÓŁCZYNNIKI KWANTYZACJI: L, K, B PRZYDZIAŁ DOSTĘPNEGO PASMA QOS PCPVQ 9. Praktyczna implementacja algorytmu PVQ w układach reprogramowalnych VIRTEX 9.1. Układy FPGA serii Virtex Rodzina układów Virtex/Virtex II jest rozwiązaniem układowym FPGA firmy Xilinx. Jest to najnowsza rodzina układów tego typu tej firmy, oferująca największe pojemności (zasoby sprzętowe) i wydajność (parametry czasowe). Oferuje ona architekturę sprzętową zaprojektowaną z myślą o realizacji zadań przetwarzania sygnałów zawierającą linię szybkiego przeniesienia dla sumatorów, wbudowane multiplikatory, układy DLL (ang. DelayLocked Loop). Oprócz klasycznych zasobów rekonfigurowanych FPGA dodano bloki pamięci, interfejsy pamięci zewnętrznej i magistrale 3 stanowe. Dla potrzeb testowania zaimplementowano standard IEEE 1149.1 (ang. boundary scan). Układy Virtex II oferują zasoby reprogramowalne równoważne 10 milionom bramek logicznych. To powoduje, że mogą być one porównywane i stosowane zamiennie z układami ASIC typu semi-custom. Matryca reprogramowalnych połączeń układów Virtex zorganizowane są w podstawowe bloki funkcjonale CLB (ang. Configurable Logic Block) (Rys. 40) i IOB (ang. Input Output Blocks). Bloki CLB dostarczają elementów funkcjonalnych potrzebnych do realizacji układów logicznych. Bloki te tworzą matryce o rozmiarach zależnych od typu układu Bloki IOB stanowią połączenie między połączeniami zewnętrznymi, a matrycą CLB. Rys. 40. Połowa podstawowej komórki matrycy reprogramowalnej układów Virtex: komórki CLB Pojedynczy blok CLB składa się z czterech podstawowych komórek logicznych LC (ang. Logic Cell ). Na pojedynczą LC składają się: element RAM LUT (ang. Look-up Table) 105 realizujący funkcje logiczne, układ szybkiego przeniesienia dla realizacji sumatorów i element przerzutnikowy. Wyjście tablicy LUT może być dołączone albo do przerzutnika albo do wyjścia CLB. Każde CLB zawiera 4 LC. zorganizowane parami. Dodatkowo do 4 układów LUT komórka CLB zawiera dodatkowe elementy logiczne pozwalające 4 wejściowe LUT organizować w celu realizacji funkcji logicznych 5 i 6 argumentowych. Dlatego przy obliczaniu równoważnej liczby bramek logicznych przyjmuje się, że każde CLB zawiera 4.5 LC. Dodatkowo linie szybkiego przeniesienia mogą być użyte do kaskadowania CLB w celu uzyskania jeszcze większych (wielo argumentowych) funkcji logicznych. Element przerzutnikowy może być skonfigurowany w zależności od potrzeb albo jako przerzutnik flip-flop, albo zatrzask (ang. latch). Wejście przerzutnika może być sterowane dwojako: z wejścia komórki LC lub, z wyjścia funkcji logicznej realizowanej w LUT. Dla przerzutnika dostępne są typowe sygnały jak CE (ang. Clock Enable), synchroniczny set i reset. Multipleksery zawarte w CLB konfigurują jego strukturę odpowiadającą funkcji jaka ma być w tym CLB realizowana. 9.2. Implementacja układów funkcjonalnych kwantyzatora w matrycy CLB Przy realizacji algorytmu PCPVQ oprócz elementarnych (AND, OR, NOT) ograniczono się do używania takich funktorów logicznych jak rejestry, sumatory, komparatory i komórki RAM. W celu wstępnego oszacowania potrzebnych zasobów CLB konieczne jest przyjęcie miary CLB dla realizacji tych funktorów. Ponieważ znany jest koszt realizacji podstawowych modułów algorytmu w sensie liczby sumatorów, komparatorów, rejestrów i komórek RAM łatwo przy założeniu docelowej platformy, na której algorytm ma być uruchomiony obliczyć konieczne zasoby sprzętowe tej platformy. W naszym przypadku przeliczenie kosztu realizacji na CLB umożliwi wytypowanie układu Virtex odpowiedniej wielkości. Przeprowadzone szacowanie będzie cechowała ostrożność, która wynika z faktu, że założymy, że jeżeli dane CLB posłuży do realizacji np. rejestru, to jego LUT nie będzie już wykorzystany jako RAM. Tak być nie musi, jednak rozmieszczanie zasobów jest prowadzone automatycznie przez narzędzie Alliance firmy Xilinx i praktycznie nie mamy wpływu na sposób jego realizacji. Lepiej więc założyć najgorszy wariant. Można przeprowadzić ręczne rozmieszczenie logiki, ale złożoność projektu nie zachęca do podejmowania takich prób. Gdyby chodziło o pojedynczy projekt można rozważać jego optymalizację ręczna, jednak 106 przy automatycznym generowaniu kodu VHDL dla różnych parametrów jaki sens miałoby ręczne łączenie CLB? Projekt powinien być automatycznie realizowany od początku do końca i trzeba pogodzić się z nieuniknionymi stratami jego optymalności. Poza tym zawsze lepiej dobrać większy układ, bo to powoduje nie pełne wykorzystanie zasobów połączeniowych co pozytywnie skutkuje w szybkości działania układu (najwolniejsza ścieżka krytyczne). Rejestry Pojedynczy CLB zawierając 4 przerzutniki umożliwia to realizację 4 bitowego rejestru. Taki, oczywisty sposób realizacji rejestrów jest wykorzystywany w odniesieniu do rejestrów danych, które w stosowanym przetwarzaniu potokowym przechowują cząstkowe wyniki pomiędzy kolejnymi etapami przetwarzania. Realizacja potokowa wiąże się również z koniecznością stosowania licznych rejestrów przesuwających (ang. shift registers), które pełnią funkcję linii opóźniających synchronizujących przepływ danych przez różne gałęzie układu. Idealna sytuacja, w której możliwa jest realizacja algorytmu w jednym potoku danych jest możliwa do zastosowania w odniesieniu do wąskiej klasy problemów. Przy projektowaniu architektury potokowej dążymy do realizacji obliczeń jednym ciągu działań, a rozdzielenie przetwarzania wiąże się z koniecznością synchronizacji momentu (taktu zegara), w którym rozdzielone dane łączą się ze sobą (Rys. 41). Linia opóźniająca Procesor N cykli M-N cykli Procesor Procesor Proesor M cykli Rys. 41. Synchronizacja przetwarzania danych w dwóch gałęziach potoku przy pomocy linii opóźniającej (rejestru przesuwnego) o odpowiednio dobranej długości W przypadku realizacji na przerzutnikach tego typu rejestrów pochłaniane są ogromne ich zasoby. W odniesieniu do układów rodziny Virtex użyte do syntezy narzędzie FPGA_Express wykorzystuje do implementacji rejestrów przesuwnych bloki typu SRL (ang. Shift Register). Technika polega na użyciu do realizacji takiego rejestru zasobu LUT komórki CLB. Pojedynczy LUT umożliwia realizację maksymalnie rejestru przesuwnego o 107 pojemności 16×1 bitów [39]. Ponadto w ramach pojedynczego LUT długość może być programowana (w zakresie od 1 do 16). W układach Virtex rejestry dłuższe mogą być realizowane poprzez złożenie 16 bitowych SLR przy pomocy dodatkowej logiki. W najnowszej rodzinie Virtex II kaskadowanie elementów SRL jest możliwe bez żadnych dodatkowych zasobów. Przy szacowaniu koniecznych zasobów CLB można przyjąć, że w odniesieniu do rejestrów przesuwnych pojedyncza komórka umożliwia realizację rejestru przesuwnego o pojemności 64×1 bitów. Sumatory Dedykowane linie szybkiego przeniesienia (ang. fast-carry) powodują, że sumatory implementowane w strukturach CLB dodatkowo zyskują na wydajności (szybkości). Komórkę CLB w rodzinie Virtex charakteryzują dwie niezależne ścieżki szybkiego przeniesienia. Element LC zawiera dodatkową bramkę XOR. Powoduje to, że możliwa jest realizacja pełnego sumatora 1 bitowego w pojedynczej strukturze LC, a więc 4 bitowego w CLB. W kilku punktach architektury mamy do czynienia z dodawaniem lub odejmowaniem jedności. Kompilator FPGA Express wprowadza rozróżnienie pomiędzy kompletnym sumatorami, a tego typu układami (ang. incrementer, decrementer), ponieważ mają one prostsza strukturę i zajmują mniej zasobów. Ze względu jednak na to, że w rozdziale 7 nie wprowadzono rozróżnienia konsekwentnie układy te będą traktowane i szacowane jak kompletne sumatory. Wprowadza to przeszacowanie, na które się godzimy. Komparatory Mogłoby się wydawać, że szacowanie liczby CLB potrzebnych do realizacji komparatora może powodować trudności. Tak jest jeżeli potraktujemy komparator jako funkcję kombinacyjną, którą trzeba implementować w LUT. W takim przypadku liczba wejść komparatora przekłada się na liczbę argumentów funkcji logicznej. Jak wiemy pojedynczy LUT w LC realizuje funkcję 4 argumentową (komparator 2 bitowy). Dla funkcji z większą liczbą argumentów LC musza być łączone szeregowo i kaskadowane w celu jej realizacji. Obliczenie ilości potrzebnych CLB wymagałoby wiedzy o algorytmie minimalizacji logicznej realizowanym przez kompilator VHDL. Taka wiedza nie jest jednak potrzebna, ponieważ implementacja komparatora przeprowadzona przez narzędzie Alliance zakłada kaskadowanie 108 przy użyciu bramek XOR wchodzących w skład ścieżki fast-carry. Tak zrealizowany komparator wymaga pojedynczego LC dla wykonania 1 bitowego komparatora. Jedna CLB zmieści zatem 4-bitowy komparator. W uproszczeniu można powiedzieć, że komparacja w układach Virtex odbywa się metodą odjęcia i sprawdzenia bitu przeniesienia. Stąd komparator zajmuje tyle samo zasobów co sumator. 9.3. Implementacja bloków pamięci Procentowy udział bloków pamięci w zasobach sprzętowych koniecznych do realizacji algorytmu PVQ jest bardzo znaczący w przeliczeniu na zajmowaną powierzchnię układu i to niezależnie od stosowanej technologii. W odniesieniu do układów reprogramowalnych firmy Xilinx tradycyjnym sposobem realizacji pamięci jest wykorzystanie w tym celu zasobów LUT wchodzący w skład komórki CLB. Pojedynczy LUT realizuje 16 bitową pamięć RAM. Ten sposób pamięci jest określany przez firmę Xilinx jako Distributed SelectRAM. W ten sposób zasoby używane przez układ do realizacji funkcji logicznych są zajmowane przez zasoby pamięciowe. Należy zauważyć, że użycie LUT powoduje ograniczenia wykorzystania przerzutników flip-flop wchodzących w skład tego samego CLB. Dlatego przy szacowaniu ilości CLB potrzebnych do realizacji układu bezpieczniej jest przyjąć, że użyty jako RAM CLB nie będzie już mógł pełnić funkcji rejestrowych. Ponieważ w rozważanej rodzinie układów Virtex pojedynczy CLB zawiera 4 struktury LUT, więc jedno CLB umożliwia realizację 64 bitów pamięci. Łatwość wykorzystania i funkcjonalność pamięci Distributed SelectRAM jest bardzo duża. Przy pomocy tej pamięci można bowiem realizować moduły pamięci o dowolnych parametrach szerokości magistrali adresowej i danych. Sposób opisu realizowanej pamięci w języku VHDL nie narzuca dużych ograniczeń jest bowiem bardzo przejrzysty i naturalny. Co ważniejsze, taki sposób realizacji RAM jest przyjmowany przez narzędzia służące do kompilacji i implementacji w przypadku tablicowego opisu pamięci w VHDL. W przypadku realizowanego projektu duże znaczenie ma elastyczność konfiguracji rozmiarów pamięci i możliwość rozmieszczenia wielu bloków w różnych miejscach układu. W szczególności bowiem moduł dekodera składa się z dużej liczby niezależnych bloków RAM o różnorodnej wielkości. W układach rodziny Virtex/Virtex II firma Xilinx wprowadziła nowy rodzaj pamięci nazwanej BSR (ang. Block SelectRAM). W przypadku układów Virtex II stanowi ona sporą część zasobów układu reprogramowalnego. BSR jest matrycą komórek, która może być użyta 109 wyłącznie jako pamięć RAM. Istnieją specjalne części powierzchni układu Virtex, które zawierają bloki tej pamięci. Pamięć BSR w rodzinie Virtex jest zorganizowana w bloki 4096 bitowe, które mogą być konfigurowane w określony sposób (patrz Tab. 28). Tab. 28. Możliwość konfiguracji pamięci blokowej w układach VIRTEX SZEROKOŚĆ GŁĘBOKOŚĆ MAGISTRALA ADRESOWA MAGISTRALA DANYCH 1 4096 ADDR<11:0> DATA<0> 2 2048 ADDR<10:0> DATA<1:0> 4 1024 ADDR<9:0> DATA<3:0> 8 512 ADDR<8:0> DATA<7:0> 16 256 ADDR<7:0> DATA<15:0> Bloki pamięci mogą być ponadto wykorzystane jako pamięć dwuportowa lub jednoportowa. W strukturze bloki o pojemności 4096 zgrupowane są w kolumny zajmujące całą szerokość układu. Główną zaletą tej pamięci jest oferowana przez nią duża pojemność i szybkość. Wadą mała elastyczność konfiguracji rozmiarów i nieco zawiły sposób korzystania z niej, w szczególności jeśli projektuje się w VHDL. Na dzień dzisiejszy nie ma komercyjnego w pełni uniwersalnego narzędzi potrafiącego kompilować tablicowo opisaną strukturę pamięci i ją implementować w BSR. Jedyną możliwością jest korzystanie z elementów bibliotecznych firmy Xilinx i ich bezpośrednie użycie w strukturalnym opisie realizowanej architektury[148]. Niedogodnością BSR jest również to, że praktycznie najpłytszą dostępną pamięcią jest pamięć o 256 komórkach. Jest to problem szczególnie przy realizacji dekodera ponieważ pamięci tam wykorzystane wymagają głębokości {1, 2, 4, 8, ... , 2K_LOG2+1 }. Skutkuje to marnowaniem reszty bloku BSR w przypadku pamięci mniejszych. Lepiej wykorzystać można pamięć blokową w budowie kodera, ponieważ tam pamięć składa się z mniejszej liczby większych (głębszych) bloków. Aby możliwe było korzystanie z pamięci BSR zrealizowano specjalny filtr, który wyszukuje wśród podanych plików z opisami pamięci takie, które najlepiej nadają się do implementacji w blokach BSR. Oznacza to, że w porównaniu z innymi pamięciami generują najmniejsze straty w wykorzystaniu komórek pamięci blokowej. Następnie filtr zamienia opis tablicowy na strukturalny i generuje nowy plik VHDL. Program filtru MapBlockRAM.exe jako parametr przyjmuje także ilość dostępnej pamięci BSR i konwertuje tyle plików ile to 110 jest możliwe. Pozostałe pliki pamięci przeznaczone są do implementowania strukturach typu Distributed Select RAM. Pliki .vhd Opis RTL Mem1 Mem2 ... MemN Pliki .vhd Opis strukturalny Block Select RAM Synopys Alliance MapBlockRAM.exe Pliki .vhd Opis RTL Distributed Select RAM Rys. 42. Sposób wykorzystania pamięci blokowej do implementacji dekodera w układach VIRTEX 9.4. Praktyczna realizacja algorytmu PVQ w układach VIRTEX-E Rzeczywistą implementację sprzętową przeprowadzono w układzie rodziny Virtex–E. Podstawowa struktura tej rodziny jest identyczna jak struktura rodziny Virtex z tą różnicą, że obniżone napięcie zasilania układów tej rodziny (1.8V zamiast 2.5V) umożliwiło wyprodukowanie układów o większych pojemnościach Do realizacji użyto układu XCV1000E o matrycy CLB składającej się z 64 kolumn i 96 wierszy. Do dyspozycji daje to 6 144 komórek CLB. Zakładamy, że wszystkie 4 moduły realizowane są indywidualnie (w samodzielnych strukturach FPGA lub w jednej jeżeli wykorzystamy możliwość jej rekonfigurowania). Dlatego tabela (Dodatek 1).osobno traktuje zasoby kwantyzatora, kodera, dekodera i dekwantyzatora. W praktyce ze względu na największą „zasobność” dekodera dobieramy parametry L,K dla tego modułu. Jeżeli dekoder o określonych parametrach się zmieści do struktury, to inne moduły także powinny się zmieścić. Według informacji zawartych w paragrafach 9.2 i 9.3 przeliczono zasoby sprzętowe opracowane w podrozdziale 7.7 dla dekwantyzatora, w podrozdziale 7.6 dla dekodera, w podrozdziale 7.5 dla kodera i w podrozdziale 7.4 dla kwantyzatora na ilość potrzebnych do realizacji modułów CLB. Wyniki przedstawiono w załączniku (Dodatek 1). Załącznik ten zorganizowany jest według liczby koniecznych bloków CLB dla założonej wartości gęstości bitowej. Ponieważ sterowanie parametrem przepływu może odbywać się przy pomocy zmiany parametru K lub L istnieje pewna dowolność doboru tych parametrów. Wiemy, że pożądana 111 jest największa jak to możliwe wartość L. W praktyce wartość ta ograniczona jest dostępnymi zasobami sprzętowymi. Przyjęto zatem zasadę, aby dla wybranej gęstości bitowej wybrać takie duże L jak to możliwe dla modułu dekodera (dla XCV1000E liczba CLB mniejsza jest od 6144), a wartość K odczytać z tabeli (Tab. 29). Tab. 29. Szacowanie parametrów L,K dla danej wartości gęstości bitowej i wielkości układu reprogramowalnego na bazie wielkości bloku dekodera L\BITRATE 0,2 XCV K 0,4 CLB K CLB 0,5 K CLB 0,7 K 1 CLB 2 4 6 K CLB K CLB K CLB K CLB 4 1 33 4 117 24 318 147 1030 9 3 237 7 499 36 1862 171 4863 16 4 868 12 2003 57 5737 248 15086 6 2037 18 6080 83 18259 255 34096 25 1 299 2 738 3 954 4 1568 39 2 1163 3 1508 4 2565 6 3340 9 5610 25 12429 115 37672 49 2 1702 4 3789 5 4458 7 5590 12 10231 33 29155 154 97994 2 2367 5 6291 6 7130 9 12240 15 16989 43 49676 198 166970 3 4213 6 9648 8 15417 12 20299 19 34732 54 79423 247 266970 3 5464 7 14125 9 22005 14 29774 23 52350 66 160247 255 385620 4 11857 8 25867 11 32391 17 55845 27 75217 80 235036 4 14677 10 37834 13 45687 20 78518 32 136755 94 331280 169 5 21179 11 49842 15 62211 23 106693 38 189941 110 456033 196 6 29196 13 67933 17 105300 27 144781 43 251800 128 867319 225 6 34535 15 89817 20 141207 30 186737 49 330497 146 1140536 256 7 45511 17 148305 22 178598 34 310594 56 429312 165 1472695 64 600 81 100 1000 121 144 3200 Tab. 30. Parametry modułów PVQ praktycznie zrealizowanych w układzie XCV1000E BITRATE L KWANTYZATOR KODER DEKODER DEKWANTYZATOR CLB CLB CLB CLB K 0,2 100 3 4620 (75%) 502 (8%) 5980 (97%) 1800 (29%) 0,5 49 5 2558 (41%) 445 (7%) 4702 (76%) 1851 (30%) 0,7 1 49 36 7 9 2582 (42%) 588 (9%) 5777 (94%) 1849 (30%) 2075 (33%) 630 (10%) 54 (88%) 1938 (31%) 4 16 57 1355 22% 1329 (21%) 5619 (91%) 2049 (33%) 6 9 171 1207 (19%) 1515 (24%) 8077 (65%) 2156 (35%) Zwarte w Tab. 30 wyniki odpowiadające faktycznie przeprowadzonej implementacji pokazują, że liczba potrzebnych CLB różni się nieznacznie od liczby wcześniej oszacowanej. Fakt ten nie jest zaskakujący, ponieważ przeprowadzone szacowanie było bardzo zgrubne – 112 służyć miało tylko do orientacyjnego określenia wielkości docelowego układu i niecelowe było przeprowadzanie dokładniejszej analizy. Dokładnie w sensie ogólnym, koszt realizowanych układów jest oszacowany w rozdziale 7. Niedokładność oszacowanej liczby CLB może wynikać z nieuwzględnienia tylko rejestrów, sumatorów i komparatorów z pominięciem dodatkowej logiki (zwiększa to faktyczną ilość potrzebnej logiki). Ponadto nie brano pod uwagę możliwości dzielenia pojedynczego CLB przez różne zasoby (zmniejsza to liczbę potrzebnych CLB). Spore zamieszanie przy szacowaniu wprowadzają również rejestry SRL, które gdzie tylko jest to możliwe, a nie koniecznie przy zgrubnej analizie oczywiste jest gdzie są stosowane przez FPGA_Express (rejestry SRL w sposób zasadniczy zmniejszają ilość potrzebnych zasobów do implementacji rejestrów (patrz Rozdział 0). Wszystkie przeprowadzone implementacje struktur PVQ obłożono założeniem przetwarzania z częstotliwością zegara 50MHz. We wszystkich przypadkach wymaganie to zostało przez narzędzia implementacyjne spełnione. Przypomnijmy, że dla zaprojektowanej architektury oznacza to przetwarzanie 50 milionów pikseli w ciągu sekundy. 113 10. Kodowanie obrazów determinowane sprzętem 10.1. Parametry kodowania PCPVQ To, że kodowanie obrazu może być zależne od dostępnych do realizacji algorytmu zasobów sprzętowych wynika z przyjętego w pracy punku widzenia. Zakłada on podejście projektanta, który do realizacji kodera/dekodera wideo dysponuje z góry narzuconą ilością „powierzchni krzemu”. W rozważanym przypadku umowna „powierzchnia krzemu” reprezentowana będzie poprzez liczbę podstawowych komórek układu reprogramowalnego (dla układów Virtex są to komórki CLB). Ilość dostępnego miejsca może być pochodną wielu czynników. Między innymi głównymi czynnikami mogą być: koszt, ilość zużywanej energii, gabaryty urządzenia. W przypadku algorytmu PVQ zapotrzebowanie na zasoby sprzętowe rośnie wraz ze wzrostem parametrów L i K. Istotny z punktu widzenia kodowania parametr gęstości bitowej również wynika z L i K, ale zależy raczej od wzajemnego stosunku L do K. Im ten stosunek jest większy tym gęstość bitowa mniejsza. Mając do dyspozycji dwa argumenty, wpływające na sterowany parametr kodowania (gęstość bitową) teoretycznie można przyjąć dowolność przy ich ustalaniu. Kryterium mogłoby być jedynie takie, ze przy większym wymiarze kodowanego wektora uzyskać można lepszą dekorelację danych, a więc lepszy rezultat. Praktyka narzuca tu jednak ograniczenie, które ogranicza przyjęcie dowolnie dużego L. Wykorzystując związki opisujące zasoby sprzętowe rejestrów, sumatorów, komparatorów do realizacji algorytmu dla danego L i K należy tak dobrać te parametry aby nie przekroczyć z góry narzuconej ich liczby przy zadanej wartości gęstości bitowej . Załącznik (Dodatek 1) zawiera przeliczone na CLB zasoby sprzętowe układó Virtex dla wybranych wartości gęstości bitowej i parametrów L i K. Z tablicy tej można odczytać wartość L i K dla układu XCV1000 ( 6144 CLB ). Jeżeli założymy, że jednorazowo do układu załadowany jest koder, dekoder, kwantyzator lub dekwantyzator, to widać, że praktycznie układ dekodera jako najobszerniejszy narzuca swoimi rozmiarami wartość L i K przy kodowaniu dla danej gęstości bitowej. Przy sporządzaniu tabeli w załączniku założono również, że szerokość bitowa kodowanych danych wynosi 45. Wynika to z założenia, że kodowane będą współczynniki 4 poziomowej dekompozycji falkowej - tak jak w [125]. Do dekompozycji 8 bitowego piksela założono użycie filtrów jak podano we wzorach ( 61). Otrzymane wartości L i K przy powyższych założeniach zestawia tabela (Tab. 31). 114 Ponieważ otrzymane wartości L są relatywnie małe aby przeprowadzić można było efektywne kodowanie przy pomocy algorytmu PVQ, zdecydować się należy na algorytm PCPVQ. Z tego wynika, że część całkowitej gęstości bitowej PVQ musi być przeniesiona na kodowanie długości wektora. To jak duża powinna być to cześć ustalono metodą wyczerpującego poszukiwania, tak aby zminimalizować wartość współczynnika PSNR. Dla poszczególnych wartości całkowitej gęstości bitowej (pole tabeli „Bitów/Piksel”) wartość bitów do zakodowania długości podano w kolumnie „LEN”. Aby otrzymać gęstość bitową przypadającą na jeden piksel należy oczywiście wartość „LEN” podzielić przez L w danym wierszu. Kolumna „PVQ” zawiera gęstość bitową przeznaczoną do zakodowania kierunku wektora, czyli gęstość bitową kodowania PVQ. Z gęstością bitową PVQ związane są parametry L i K. Parametry te odpowiednie dla układu Virtex XCV1000 podano w kolumnach „L” i „K”. Tab. 31. Parametry algorytmu PCPVQ dla układy Virtex XCV1000 w zależności od docelowej wartości gęstości bitowej danych bitów/piksel 0,1 0,2 0,3 0,4 0,5 0,6 0,7 0,8 0,9 1,1 1,4 1,7 2,1 2,4 2,7 3,1 3,4 3,7 4,1 4,4 4,7 LEN [bit/wektor] PVQ [bit]/piksel] 0 0,1 10 0,1 10 0,2 6 0,3 5 0,4 5 0,5 5 0,6 5 0,7 10 0,7 7 0,9 7 1,1 7 1,4 7 1,8 10 2,0 5 2,4 6 2,7 5 3,1 5 3,4 6 3,7 11 4,1 9 4.4 115 L 100 100 100 64 49 49 49 49 49 36 36 25 25 25 16 16 16 16 16 16 9 K 2 2 3 3 4 5 6 7 7 8 10 10 15 18 17 22 29 37 47 62 51 5,1 5,4 5,7 6,1 6,4 6,7 7,1 7,4 9 9 6 9 9 9 9 9 4,1 4,4 4,7 5,1 5,4 5,7 6,1 6,4 16 9 9 9 9 9 9 9 62 51 66 86 111 144 186 241 10.2. Kodowanie obrazów statycznych przy wykorzystaniu dekompozycji falkowej Otrzymane parametry kodowania zastosowano w kodowaniu podpasmowym obrazu „Lena”, „Baboon”, „Bridge” i „Boat”. Przeprowadzono 4 poziomową dekompozycję falkową w oparciu o następujące filtry analizujace H0 i H1 oraz syntezujące G0 i G1 ( 1 − z 2 + 2 z + 6 + 2 z −1 − z − 2 8 1 H1 (z) = z 2 − 2z + 1 2 1 G 0 ( z ) = z + 2 + z −1 2 1 G1 ( z ) = z + 2 − 6 z −1 + 2 z − 2 + z −3 8 H 0 ( z) = ( ( ) ) ) ( ( 61) ) Alokacji bitów dokonano stosując algorytm zachłanny opisany w rozdziale 2.4. Metoda ta okazała się znacznie szybsza od metody poszukiwania wyczerpującego i pozwoliła na uzyskanie zadowalających rezultatów. Ponieważ algorytm zachłanny zakłada prawdziwość związku ( 11), a ta jest pochodną ortogonalności zastosowanych filtrów, komentarza wymaga fakt zastosowania zestawu filtrów biortogonalnych. Istotnie dla takich filtrów związek ( 11) nie jest prawdziwy. Jednak w wypadku zastosowanych filtrów biotrogonalnych wprowadzany błąd jest do zaakceptowania. Użyte w pracy filtry są bowiem „prawie” ortogonalne. Pasmo o najniższej częstotliwości zdecydowano się zawsze kodować metodą PCM 8 bit/piksel. Nie powiodła się natomiast próba przydziału bitów proporcjonalnie do logarytmu wariancji. Rezultat ten należy tłumaczyć tym, że przybliżenie ( 13) odnosi się w ogólności do dużych wartości gęstości bitowej, a prowadzone prace ze względu na wielkość układu reprogramowalnego odnosiły się do wartości poniżej 1 bit/piksel. Należy również zaznaczyć, że dla kwantyzatora PVQ ogólny wzór ( 13) jest ważny dla dużych wartości L (patrz [9]). 116 Patrząc na tabele (Tab. 31) należy niestety stwierdzić, że ten warunek dla wartości (L,K) narzuconych przez dysponowane zasoby również nie jest spełniony. W celu porównania ze znanym standardem kodowania dla poszczególnych obrazów dokonano najpierw kompresji wybranych obrazów metodą JPEG dla różnych parametrów kwantyzacji lecz ciągle tych samych dla kolejnych obrazów. W rezultacie otrzymano wynik kodowania JPEG dla różnych współczynników kompresji. Jest tak dlatego, że w JPEG w przeciwieństwie do PVQ ustalony krok kwantyzacji pośrednio decyduje o gęstości bitowe, która właściwie wynika dopiero z kodowania entropijnego. Dla otrzymanych współczynników kompresji dokonano kompresji obrazu w oparciu o kwantyzację PCPVQ. Otrzymany wyniki PSNR dla odpowiednich gęstości bitowych zestawiono w Tab. 32. Tablica ta prezentuje również przyjętą w poszczególnych pasmach gęstość bitową. Tab. 32. PSNR kodowania obrazów metodami JPEG i PCPVQ dla różnych wartości docelowej gęstości bitowej BITRATE JPEG PVQ LL HL LH HH HL LH HH HL LH HH HL LH HH PSNR PSNR 4 4 4 4 3 3 3 2 2 2 1 1 1 [db] [db] Lena 0,83bpp 8 4,7 6,4 6,1 3,4 4,1 4,4 2,1 2,7 2,7 0 0,3 0 37,0 33,0 0,5bpp 8 3,7 4,7 4,4 2,7 3,1 3,1 1,1 1,7 1,7 0 0 0 34,6 30,2 0,34bpp 8 3,4 4,4 4,1 2,1 2,7 3,1 0,1 1,1 1,1 0 0 0 32,6 29 0,25bpp 8 3,1 4,1 3,7 2,1 2,7 2,7 0 0 0 0 30,4 28,6 0,13bpp 8 2,4 3,4 3,1 0,8 1,7 1,7 0 0 0 0 24,5 26,5 0,6 0,4 0 0 Boat 1,06bpp 8 6,1 5,7 5,7 4,1 4,1 4,1 2,4 2,7 2,1 0 1,1 0,2 34,8 30,2 0,64bpp 8 4,7 4,4 4,4 3,4 3,4 3,4 2,1 2,1 1,7 0 0,2 0 32,2 27,9 0,43bpp 8 4,4 4,1 4,1 2,7 3,1 2,7 1,4 1,7 0,6 0 0 0 30,1 27,26 0,29bpp 8 4,1 3,4 3,7 2,7 2,4 2,4 0,4 1,1 0,1 0 0 0 28,1 25,5 0,13bpp 8 2,7 2,4 2,7 1,7 1,4 1,4 0 0 0 22,9 23.3 0 0 0 Bridge 0,97bpp 8 4,7 4,4 4,7 4,1 3,4 3,7 2,7 2,4 2,7 0,8 0,1 0 28,4 26,0 0,65bpp 8 4,7 4,1 4,4 3,4 3,1 3,4 2,4 2,1 2,1 0 0 0 26,7 24,5 0,4bpp 8 4,7 3,4 3,7 2,7 2,1 2,7 1,7 0,5 1,1 0 0 0 23,4 25,1 0,14bpp 8 3,4 2,4 2,7 2,1 1,1 1,7 0 0 0 21,16 21,7 0 117 0 0 Baboon 1,1bpp 8 3,7 3,7 4,4 3,1 3,1 3,7 2,4 2,1 2,7 1,7 0 0 26,8 23,4 0,7bpp 8 3,4 3,7 4,1 3,1 2,7 3,4 2,1 1,7 2,4 0,4 0 0 24,9 22,4 0,45bpp 8 3,1 3,1 3,4 2,4 2,1 2,7 1,7 0,9 1,7 0 0 0 23,4 21,3 0,15bpp 8 2,4 2,4 2,7 1,7 1,7 2,1 0 0 0 19,9 20,3 0 0 0,1 Otrzymane wyniki PSNR są gorsze od przedstawionych w pracy [125], która to praca przedstawiła wyniki lepsze rezultaty dla PCPVQ w porównaniu z JPEG. Rozbieżność wyników wynika z tego, że przedstawione w cytowanej pracy kodowanie obierało się na większych wartościach L. Maksymalnie wynosiła ona 256, podczas gdy w naszym eksperymencie wyniosła 100. Tezę tą potwierdza fakt, że największe rozbieżności pomiędzy metodami PCPVQ, a JPEG otrzymano dla większych wartości bitrate. Im ta wartość jest mniejsza tym większa staje się atrakcyjność metody PCPVQ w porównaniu z JPEG, tak by przy wartościach 0,1bpp uzyskiwać wyniki lepsze niż dla JPEG. Dla mniejszych wartości bitrate możemy używać większych wartości L niż dla większych, lepiej czerpiąc z zalet kwantyzacji wektorowej. Przyczyną pogorszenia jakości kodowania dla PVQ jest niewątpliwie przyjęcie mocno skwantowanych kolejnych wartości gęstości bitowej. Sterowanie alokacją bitów nie było więc tak płynne jak dla rozwiązań softwarowych. Na uwagę zasługuje również fakt, że dla wartości bitrate około 0,5bpp subiektywna ocena jakości kodowania jest lepsza dla zastosowanego PCPVQ z dekompozycją falkową niż dla JPEG z DCT. Wynika to z faktu widocznej segmentacji obrazu zakodowanego JPEG na bloki, w obrębie których stosowano transformatę DCT. Zestawione w tabeli wyniki porównania JPEG i PCPVQ przedstawiono na wykresie (Rys. 43). 118 40 LENAJPEG LENA PVQ BRIDGE JPEG BRIDGE PVQ 35 BABOON JPEG PSNR[dB] BABOON PVQ 30 25 20 15 0 0.2 0.4 0.6 0.8 1 1.2 Bitrate[bpp] Rys. 43. Porównanie jakości kodowania obrazów „Lena”, „Bridge” i „Baboon” metodą JPEG i PCPVQ 10.3. Kodowanie sekwencji wideo Opracowany schemat kodowania dla obrazów statycznych można w łatwy sposób rozszerzyć w celu umożliwienia kodowania sekwencji wideo. Jak pamiętamy koder sekwencji zawiera te same bloki funkcjonalne kodowania co układ kompresji obrazów statycznych, z taką jednak różnicą, że aby wykorzystać dla poprawienia jakości kodowania korelację kolejnych ramek sekwencji, zaopatrzony jest dodatkowo w układ estymacji ruchu. Dla zbadania przydatności kodowania PCPVQ dla kodowania sekwencji wideo wykonano softwarowy moduł estymacji ruchu. W procesie estymacji dzielono obraz na bloki o rozmiarze 15×15 i dokonywano poszukiwania wyczerpującego porównując bloki metodą MSE. Poszukiwanie wykonywano w zakresie od –8 do 7 punktów w pionie i w poziomie. Nietypowy wybór wielkości porównywanych bloków w porównaniu z najczęściej stosowanym rozmiarem 16×16, wynika z tego, że estymacji ruchu poddawane były współczynniki dekompozycji falkowej. Aby zapewnić podzielność rozmiaru każdego z podpasm przez rozmiar bloku przy rozmiarze obrazu 720×480 rozmiar bloku 15 jest rozsądnym wyborem (po 4 poziomowej dekompozycji falkowej rozmiar najmniejszego bloku (4LL) wynosi 45×30. Wspólnym podzielnikiem jest 15, zdecydowano się wiec na rozmiar bloku 15×15. 119 Po kompensacji ruchu obrazy były kodowana według schematu identycznego z tym jaki opisano w rozdziale dotyczącym kodowania obrazów statycznych. Przyjęto znany ze standardów MPEG schemat podziału sekwencji na GOP (ang. Group Of Pictures). Oznacza to, że z sekwencji wyodrębnia się grupy ramek, w których stosuje się określony schemat estymacji ruchu. Oznacza to, pierwsza ramka w grupie jest kodowana wewnątrzobrazowo (bez estymacji ruchu), pozostałe kodowane są międzyobrazowo wstecz (z estymacją ruchu względem ramki poprzedniej). Autor zdecydował się ze strumienia wideo tworzyć 6 elementowe grupy ramek. Kodowano strumienie wideo ze średnią gęstością bitową 0,25; 0,5 i 1.0 bitów na piksel. Do eksperymentu użyto znanych monochromatycznych sekwencji testowych o rozmiarach 720×480 punktów: „Flowergarden”, „Football” i „Susie”. Każda z sekwencji charakteryzowała się innym charakterem. Sekwencja „Flowergadren” to sekwencja powstała w wyniku powolnego ruchu kamery w kierunku poziomym. Charakteryzuje się on średnią wzajemną korelacją kolejnych ramek obrazu. Sekwencja „Football” to zapis zawodów sportowych, który charakteryzuje się gwałtownym ruchem poruszających się obiektów. Charakter ten decyduje o słabej korelacji kolejnych obrazów sekwencji. Największa korelacja kolejnych ramek obrazu występuje w sekwencji „susie”. Zapis ten to twarz dziewczyny rozmawiającej przez telefon. Pomiędzy kolejnymi ramkami obrazu prawie w ogóle nie ma ruchu. Kolejnym zadaniem w kodowaniu sekwencji jest odpowiednia alokacja bitów pomiędzy ramki kodowane wewnątrzobrazowo i międzyobrazowo. Zgodnie z intuicją, ponieważ spodziewamy się korelacji międzyobrazowej, większą liczbę bitów należy przydzielić obrazom kodowanym bez estymacji ruchu. Podczas kodowania sekwencji testowych pogrupowano ramki w grupy składające się z 6 kolejnych ramek. Pierwsza ramka z grupy kodowana była wewnątrzobrazowa, a kolejne 5 międzyobrazowo z estymacją względem ramki poprzedniej. Alokację bitów dla poszczególnych sekwencji dokonano eksperymentalnie tak, aby mierzona współczynnikiem PSNR jakość kolejnych ramek była podobna. Dla sekwencji „Flowergarden” dobrano stosunek 2,5 ilości bitów dla kodowania wewnątrzobrazowego i międzyobrazowego. Dla sekwencji „Football” i „Susie” odpowiednio było to 1,5 i 5. Zgodnie z przewidywaniami na podstawie charakteru sekwencji największy stosunek gęstości bitowej wewnątrz i międzyobrazowej jest dla sekwencji „Susie” (duża korelacja ramek), a najmniejszy dla „Football” (mała korelacja ramek). Oczywiście w rzeczywistym systemie kodowania obrazu eksperymentalne dobieranie podziału bitów pomiędzy ramki estymowane i nieestymowane nie ma racji bytu. W praktyce 120 kodowanie sekwencji należy uzupełnić o znane i opracowane, omówione wcześniej techniki ewaluacji i klasyfikacji kodowanych sekwencji (Rozdział 3.5). Otrzymane wyniki kodowania przedstawiono na wykresach. Aby odnieść się do uzyskanych wyników, należałoby je porównać z wynikami znanych metod kodowania. O ile w wypadku kodowania obrazów statycznych było to dość proste, o tyle dla sekwencji sprawa się komplikuje. O jakości kodowania bardzo mocno decyduje proces estymacji ruchu. W stosowanych standardach MPEG1, MPEG2 jest ona z tego powodu dość zaawansowana. Oprócz tego, że dokonuje się estymacji techniką interpolacji pozwalającą na dokonanie estymacji ruchu z dokładnością do pół piksela, to dodatkowo w ramach GOP możliwe jest kodowanie względem obrazu poprzedniego, ale i następnego. W tym celu dokonuje się zamiany kolejności ramek w przesyłanej sekwencji. Ponieważ autor nie wykonał narzędzi do estymacji ruchu takich jak w MPEG dlatego nie dokonano porównania ilościowego. Można jednak dokonać pewnej analizy jakościowej. 121 Flower Garden 0.5bpp FLower Garden 0.25bpp Flower Garden 0.125bpp 26 25 PSNR(dB) 24 23 22 21 39 37 35 33 31 29 27 25 23 21 19 17 15 13 11 9 7 5 3 1 20 Numer ramki Rys. 44. Wyniki kodowania sekwencji „Flower garden” Football 0.5bpp Football 0.25bpp Football 0.125bpp 29 28 27 25 24 23 22 Numer ramki Rys. 45. Wyniki kodowania sekwencji „Football” 122 39 37 35 33 31 29 27 25 23 21 19 17 15 13 11 9 7 5 3 21 1 PSNR (dB) 26 Susie 0.5bpp Susie 0.25bpp Susie 0.125bpp 39 38 37 PSNR (dB) 36 35 34 33 32 31 39 37 35 33 31 29 27 25 23 21 19 17 15 13 11 9 7 5 3 1 30 Numer ramki Rys. 46. Wyniki kodowania sekwencji „Susie” Na pewno, wyniki kodowania obrazów statycznych wskazują na to, że również dla sekwencji będziemy mieli do czynienia z nieco gorszą jakością kodowania dla PVQ. Zwłaszcza dla większych wartości R. Przyczyny tego zostały omówione w rozdziale dotyczącym kodowania obrazów statycznych (Rozdział 10.2). Pytanie więc może dotyczyć tego, czy kodowanie PVQ nadaje się do kodowania obrazów po estymacji ruchu. Praca [28] udowadnia, że na pewno tak. Autorzy dokonali porównania systemu PVQ z analogicznym systemem opartym o kwantyzację skalarną i otrzymali lepsze rezultaty. Jeżeli przeanalizujemy otrzymane wyniki, to niepokoić może stosunkowo mały stosunek liczby bitów w kodowaniu wewnątrzobrazowym do liczby bitów ramek kodowanych międzyobrazowo. W standardzie MPEG zalecany podział wynosi 1bpp dla ramki kodowanej wewnątrzobrazowo i 0.3 bpp dla ramki kodowanej międzyobrazowo. Otrzymany w MPEG stosunek 0.33 jest mniejszy tylko od stosunku zastosowanego do kodowania PVQ sekwencji „Susie”. Jako zasadę należy przyjąć, że w zastosowanym schemacie kodowania podział bitów dla kodowania kolejnych ramek jest mniej korzystny niż w MPEG. Przyczyna tego faktu jest łatwo widoczna, jeżeli wziąć pod uwagę wyrafinowany schemat kompensacji ruchu stosowany w MPEG. Powoduje on mniejsze zapotrzebowanie na 123 bity w kodowaniu międzyobrazowym. Jest oczywiste, że zadaniem do wykonania w przyszłości jest wykonanie schematu estymacji ruchu analogicznego jak w MPEG i dokonanie właściwego porównania jakości kodowania. Ale na tym sprawa się nie kończy. Rezultaty kompresji jakie otrzymano w nowym standardzie kodowania MPEG-4 pokazują, że blokowa estymacja ruchu powinna być zastąpiona estymacją ruchu prowadzoną na obiektach wyróżnionych w kodowanej sekwencji. Ciekawe mogłoby być zastosowanie PVQ do kodowania sekwencji w oparciu o schemat estymacji ruchu MPEG-4. Przeprowadzone badania pokazują, że sposób kwantyzacji w znaczny sposób waży na jakości kodowania w odniesieniu do obrazów statycznych. W przypadku sekwencji natomiast ciężar odpowiedzialności za jakość przenosi się na sposób przeprowadzenia estymacji ruchu. Stąd porównywanie różnych metod kwantyzacji, metodą porównywania rezultatów kodowania sekwencji choć na pierwszy rzut oka atrakcyjne nie jest najszczęśliwsze. Różne sposoby estymacji ruchu w takim przypadku przesłaniają właściwy obraz porównania. Można więc stwierdzić, że licząc się z drobnym pogorszeniem jakości kodowania dla większych gęstości bitowych, w zamian za którą otrzymujemy możliwość lepszej kontroli generowanego strumienia danych możemy z powodzeniem stosować kwantyzację PVQ do kodowania obrazów. 10.4. Zastosowanie kwantyzatora rekonfigurowalnego Zaprezentowany schemat kodowania współczynników falkowych przy pomocy kwantyzacji PVQ praktycznie może być realizowany przy pomocy architektury rekonfigurowalnego kwantyzatora przedstawionej w rozdziale 8.4. Należy zatem obliczyć, jak duża powinny być bloki RAM buforujące napływające do układu FPGA dane (Rys. 38), aby możliwe była rekonfiguracja i przetwarzanie w czasie rzeczywisty. Założyliśmy 4 poziomową dekompozycję falkową. Ponieważ przyjęto założenie, że każda składowa częstotliwościowa kodowana jest z inną gęstością bitową, to konieczne jest 12-krotna zmiana konfiguracji. Ponadto dla dalszych oszczędności zasobów rekonfigurowalnych podzielono algorytm PVQ na kwantyzację i kodowanie. Bloki kwantyzatora i kodera ładowane są do układu reprogramowalnego na przemian. Na jedną ramkę przypada zatem 24 rekonfiguracje. Dla zastosowanego układu XCV1000 czas rekonfiguracji to 17ms. Całkowity potrzebny na rekonfigurację czas to zatem około 0,4s. 124 Ponieważ ramki napływają w ilości 25 na sekundę nie jest możliwe zmieszczenie się z czasem konfiguracji w czasie trwania jednej ramki. Konieczne jest buforowanie wielu ramek i ich kompresja w czasie pojedynczego cyklu programowania. Do obliczenia wielkości bufora RAM posłużymy się zależnością( 60). Ramki mają rozmiar 720×480 pikseli, co przy 25 ramkach obrazowych na sekundę daje zegar systemu wideo f=6,5MHz (według zależności ( 48)). Dla układu XCV1000 osiągnięto częstotliwość przetwarzania fR=50MHz zatem lB = 0,4 ∗ 50 MHz ≈ 3Mpiksele < 9ramek 50 MHz −1 6,5MHz ( 62) Aby zapewnić odpowiednio szybkie przetwarzanie należy zgromadzć 9 ramek obrazu, a więc zbuforować 0.36s sekwencji wideo. Tego rodzaju buforowanie wprowadza oczywiście poóźnienie w torze kompresji, co w przypadku interkatywnych systemów dwukierunkowych powoduje oczywiście mało komfortową dla użytkowników zwłokę. Zwłokę tą można oczywiście skracać podnosząc koszty systemu poprzez zastosowanie na przykład większego układu, który zmieści w swojej strukturze zarówno koder jak i kwantyzator lub nawet kilka ich konfiguracji odpowiadających różnym wartościom gęstości bitowej. W przypadku systemów z jednokierunkowym przesyłem danych zwłoka nie na dużego praktycznego znaczenia. W systemie MPEG na przykład ramki buforuje się w celu ich łączeni w grupy GOP. 125 11. Zakończenie 11.1. Podsumowanie Przeprowadzone badania miały na celu sprawdzenie możliwości implementacji algorytmu kwantyzacji w układach logiki reprogramowalnej. W wyniku takiej realizacji spodziewano się osiągnąć możliwość realizacji algorytmu w czasie rzeczywistym, a jednocześnie przy znacznej parametryzacji procesu kwantyzacji w kompresji obrazu mieć możliwość oszczędnego wykorzystania zasobów sprzętowych stosowanej technologii układów cyfrowych. Wynikiem poszukiwań algorytmu o charakterze umożliwiającym efektywną implementację na poziomie sprzętu było wytypowanie algorytmu kratkowej kwantyzacji wektorowej o nazwie PVQ (ang. Pyramid Vecto Quantization). W celu uproszczenia struktury sprzętowej oraz ograniczenia potrzebnych zasobów układów cyfrowych wprowadzono modyfikację procesu kodowania wektorów na piramidzie PVQ. Modyfikacja ta w żaden sposób nie wpłynęła na funkcjonalność algorytmu, umożliwiła natomiast jego implementację przy pomocy zasobów sprzętowych o rozmiarach, które oferowane są przez współczesne układy reprogramowalne FPGA. Następnie zaproponowano i opisano w języku opisu sprzętu VHDL strukturę kodera i dekodera wybranego algorytmu kwantyzacji. Zaproponowano architekturę potokową odznaczającą się ogromną wydajnością przetwarzania danych. Podstawowymi operacjami potoku danych były operacje typu dodawanie i komparacja. Takie rozwiązanie gwarantuje możliwość zastosowania częstotliwości zegara bliskiej granicznych częstotliwości dla zastosowanych technologii. Ponadto zrealizowany w języku VHDL projekt cechowała skalowalność umożliwiająca łatwe przejście pomiędzy architekturami PVQ realizującymi różne wartości gęstości bitowej. Dla potrzeb skalowalności projektowanego kwantyzatora opracowano ponadto oprogramowanie wyliczające stałe współczynniki składowane w komórkach ROM konieczne i wykorzystywane w procesie kodowania i dekodowania. Dla zaprojektowanej architektury kwantyzatora wykonano obliczenia zasobów sprzętowych wyrażoną w liczbie rejestrów, sumatorów i komparatorów. Takie podejście umożliwia ocenę kosztu realizacji w dowolnej technologii ASIC. Dla wybranych wartości gęstości bitowej dokonano szacunkowych wyliczeń parametrów kwantyzacji PVQ w taki sposób, aby algorytm o tych parametrach mógł zmieścić 126 się w dysponowanych zasobach sprzętowych i na tej podstawie przeprowadzano implementację sprzętową w układach reprogramowalnych FPGA Virtex firmy Xilinx. W układach tych osiągnięto czas przetwarzania 50 milionów punktów obrazowych w ciągu jednej sekundy. Dla narzuconych podczas procesu implementacji parametrów algorytmu PVQ przeprowadzono kodowanie z dekompozycją falkową osiągając zadowalające, porównywalne z JPEG rezultaty kodowania. W szczególności osiągnieto rezultaty lepsze od JPEG dla wartości małych gęstości bitowych (0.1–0.2 bity na piksel). Zaproponowano ponadto rekonfigurowalny tor kompresji sekwencji wideo zbudowany w oparciu o rekonfigurowalny procesor sprzętowy realizujący proces kwantyzacji. Na rekonfigurację procesora wpływać mogą takie czynniki jak: • rodzaj kodowanej sceny, • dostępna szerokość kanału transmisyjnego, • kodowane pasmo dekompozycji częstotliwościowej, • rodzaj kodowanej ramki (z estymacją lub bez). Do oryginalnych rozwiązań autora należy zaliczyć: 1. wprowadzenie nowego sposobu kodowana wektorów na piramidzie PVQ, umożliwiającego implementację sprzętową przy pomocy architektury potokowej, 2. zaproponowanie systemu kodowania sygnału wizyjnego z rekonfigurowalnym, dedykowanym, sprzętowym procesorem dla kwantyzacji wektorowej, 3. przeprowadzenie parametrycznego kodowania PCPVQ w oparciu o dekompozycję falkową obrazów i sekwencji opierając kryterium dobru parametrów kwantyzacji na dostępnych zasobach obliczeniowych systemu, 4. oszacowanie koniecznych zasobów FPGA, potrzebnych do realizacji kwantyzatora o zadanych parametrach, 5. opracowanie dynamicznego sterowania gęstością bitową kompresowanych danych i związanej z tym architektury systemu rekonfigurowalnego, 6. implementacja skalowalnej architektury algorytmu PVQ w rekonfigurowalnych układach FPGA, 7. opracowanie koncepcji kompresji sekwencji obrazów w trybie czasu rzeczywistego, 127 8. opracownaie dynamicznej rekonfigurowalności systemu z użyciem możliwości języka VHDL, 9. opracowanie środowiska w języku C do tworzenia projektu i symulacji algorytmu kompresji, Wyniki przedstawione w pracy upoważniają do stwierdzenia, że teza postawiona w pracy: „Zastosowanie układów programowalnych umożliwia implementację specjalizowanej architektury kwantyzatora dla potrzeb kompresji sygnału wizyjnego pracującej w czasie rzeczywistym o dużych możliwościach adaptacji w zakresie zmiany parametru gęstości bitowej kwantyzatora w celu dostosowania kroku kwantyzacji do wymogów alokacji bitów kwantowanego sygnału oraz osiągniecia skalowalności kodowania i sterowania strumieniem danych.” została w pełni udowodniona. 11.2. Dalsze kierunki badań Zaproponowana architektura kwantyzatora, oraz jego implementacja jest jedynie częścią kompletnego systemu kompresji obrazu. Aby możliwe było pełne wykorzystanie możliwości kwantyzatora w odniesieniu do kodowania sekwencji konieczne jest wykonanie sprzętowego modułu estymacji ruchu. Ponieważ estymacja ruchu jest procesem niezwykle istotnym i decydującym o jakości kodowania nie można go pominąć w kompletnym torze kompresji. Z drugiej strony estymacja ruchu, co już zaznaczono w tekście pracy, jest procesem niezwykle wyczerpującym obliczeniowo, dlatego konieczna jest jego akceleracja sprzętowa. Możliwe jest zastosowanie oferowanego na rynku rozwiązania VLSI, jednak najpełniejsze możliwości adaptacji do zmiennych potrzeb kodowania może zapewnić przygotowanie odpowiedniej konfiguracji w układzie rekonfigurowalnym FPGA. W takim przypadku możliwe byłoby na przykład wykorzystanie do obliczenia estymacji tej samej struktury FPGA, w której realizowana jest kwantyzacja. Podobnie jak estymacja ruchu w strukturze układu reprogramowalnego, powinna być również zrealizowana dekompozycja falkowa. O atrakcyjności proponowanego rozwiązania decyduje również opracowanie odpowiedniego algorytmu decydującego o liczbie bitów przeznaczonych do zakodowania kolejnej ramki obrazu. Taki algorytm powinien uwzględniać aktualnie dostępne pasmo kanału przesyłowego, zajętość bufora wyjściowego oraz charakter kodowanej ramki (entropia). 128 Nie do końca rozwiązanym przez autora problemem jest również problem alokacji bitów do poszczególnych podpasm kodowanej ramki. Zastosowany algorytm zachłanny nie jest najlepszym rozwiązaniem dla przetwarzania w czasie rzeczywistym, ponieważ wymaga czasochłonnego poszukiwania. Rozwiązaniem szybszym jest niewątpliwie alokacja proporcjonalna do wariancji sygnału lub stała alokacja bitów w poszczególnych podpasmach. W pierwszym przypadku należałoby dokonać odpowiednich prób z innymi zestawami filtrów (zbliżenie się do warunku ortogonalności). W przypadku stałej alokacji bitów konieczne jest przeprowadzenie badań na wielu sekwencjach testowych i wytypowanie alokacji kompromisowej, tak jak to ma miejsce w MPEG. Zaprezentowane rozwiązanie mieści się w nurcie prac nas systemami typu CCM (ang. Custom Computing Machines) [4][104][111], więc systemami dedykowanymi do wykonywania określonego zadania. Dodatkowo, czerpie ono z idei systemów rekonfigurowalnych. Cecha CCM pozwala osiągnąć maksymalnie krótki czas obliczeń dzięki odpowiednio do danego zadania zaprojektowanej architekturze. Aktualnie na drodze do upowszechnienia tego sposobu przetwarzania stoi znacznie większy koszt opracowania rozwiązania sprzętowego w porównaniu z rozwiązaniami programowymi. W przyszłości należy się spodziewać coraz lepszych i wydajniejszych narzędzi projektowania hardwaru. Doprowadzić do tego mają badania nad syntezą logiczną wysokiego poziomu (ang. High Level Synthesis) i poziomu architektury [22][67][131] oraz prace nad syntezą algorytmów zapisanych w języku C (np. Handel-C) [76][42][24][4]. Oczywiście nie może być mowy o wyparciu procesorów ogólnego stosowania i zastąpieniu oprogramowania. Nie jest to celowe. W wieli zastosowaniach sprawdza się znakomicie i nie ma potrzeby rezygnowania z tego dorobku. Przyszłością jest raczej współprojektowanie hardwaru i softwaru (ang. Hardware-Software Co-Design) [114][90][19][60]. Na obecnym etapie rozwoju wyraża się to współpracą procesora z różnego rodzaju akceleratorami (np. akceleratorami grafiki, czy wideo), oraz instrukcjami wbudowanymi w strukturę procesora (np. technologia MMX). Chodzi o to, by już na etapie rozwiązywania zadania, właściwie dzielić problem na część opłacalną do realizacji programowej i część przeznaczoną do realizacji sprzętowej. Do przedstawionej idei świetnie pasują układy reprogramowalne. Dzięki ich zastosowaniu możliwe będzie zbudowanie uniwersalnych rozwiązań typu tandem: sprzętprogram. Uniwersalność polega na możliwości rozwiązywania różnego rodzaju problemów na jednej platformie obliczeniowej. Już w tej chwili pojawiają się propozycje procesorów, 129 które jedną strukturę krzemu dzielą z matrycą reprogramowalną [60][2][86][46]. Dysponując odpowiednim programem oraz opisem architektury sprzętowej w postaci pliku konfiguracyjnego będzie można wykonać program na dedykowanej architekturze osiągając dzięki temu podwyższoną wydajność obliczeń. Idea CCM wiąże się oczywiście z wydajnością rozwiązania, ale także z oszczędnością zasobów sprzętowych. Architektury dedykowane są, bowiem nie tylko szybsze, ale i mniejsze niż rozwiązania uniwersalne. Układy rekonfigurowalne dodają na tym polu dodatkowe możliwości związane z dynamiczną rekonfigurowalnością zasobów (ang. Run-Time Reconfiguration-RTR) [53][104][111]. Struktury sprzętowe, podczas kiedy nie są wykorzystywane mogą być usuwane i zastępowanymi potrzebnymi w danej fazie pracy wykonywanego algorytmu. Jedyną przeszkodą rozwoju takich rozwiązań jest w tej chwili czas potrzebny na rekonfigurację układu reprogramowalnego. W większości przypadków bity konfiguracyjne są wpisywane szeregowo do układu, co zajmuje sporo czasu, osłabiając wydajność systemów RTR i ich konkurencyjność z procesorami ogólnymi. Wychodząc naprzeciw temu problemowi już w tej chwili są dostępne układy z kilkoma przełączalnymi pamięciami rekonfigurowalnymi [18]. Istnieje, więc możliwość zmiany konfiguracji w „jednym takcie zegara”. Trudno także wróżyć, co przyniesie przyszłość w zakresie układów rekonfigurowalnych wobec zaskakujących informacji o układzie rekonfigurowalnym przy pomocy światła. Możliwe jest więc równoczesna konfiguracja całej struktury układu do dowolnej struktury stosując na wzór fotolitografii odpowiednią maskę. Dekompozycja falkowa znalazła zastosowanie w nowo opracowanych metodach kompresji. Ponieważ ten sposób transformacji obrazu jest lepszy od blokowego DCT, wydaje się, że na trwałe zastąpi on sposób dekompozycji stosowany w JPEG, czy MPEG2. Kwantyzacja wektorowa nie znalazła dotychczas zastosowania w opracowanych standardach kodowania obrazu. W najnowszym standardzie MPEG4 stosuje się kwantyzację skalarną, która w powiązaniu z kodowaniem entropijnym daje zadowalające rezultaty kompresji. Wykorzystany w MPEG4 nowy sposób kwantyzacji EZW (ang. Embedded Zero Wavelet Trees) [137][107][141][109] lepsze rezultaty kodowania osiąga wykorzystując korelację współczynników odpowiadających temu samemu obszarowi obrazu, ale należących do różnych podpasm. Jest to nowy sposób podejścia do kodowania. Dotychczas współczynniki dekompozycji odpowiadające różnym częstotliwościom kodowano niezależnie zakładając ich dekorelację. EZW wykorzystując związek współczynników mimo przeprowadzonej dekompozycji poprawia jakość kodowania. Łączne kodowanie wielu 130 współczynników nasuwa analogię do kwantyzacji wektorowej, nie jest to jednak kwantyzacja wektorowa w klasycznym rozumieniu. O wyższości kwantyzacji wektorowej nad skalarną nie trzeba nikogo przekonywać. Dotychczasowy brak jej stosowania wynika jedynie ze zbyt dużej złożoności, aby możliwe było jej efektywne stosowanie w praktyce. Można założyć, że wraz z postępującym wzrostem wydajności obliczeniowej systemów znajdzie ona zastosowanie w kompresji obrazu. Podobnie jak już w tej chwili znalazła zastosowanie w standardach kompresji dźwięku. Algorytm PVQ nie może konkurować pod względem wydajności z EZW, ale są obszary zastosowań, gdzie może być zastosowany. Główną siłą jest jego ogromna prostota w klasie kwantyzatorów wektorowych. Zastosowanie kwantyzacji wektorowej usuwa potrzebę stosowania kodowania entropijnego. Jeżeli więc wymagany jest determinizm działania wyrażający się potrzebą zaplanowania przepływu danych odpowiadających kolejnym ramkom obrazu z dokładnością nawet do jednego bitu danych lub istnieje potrzeba dokładnego zaplanowania gęstości bitowej kwantyzacja wektorowa jest dobrym wyborem. Wektorowa kwantyzacja PVQ oferuje prostotę, która przekłada się na realizującą ją architekturę. W zależności od potrzeb, można osiągnąć albo maksymalną szybkość przetwarzania, albo maksymalne oszczędności poboru mocy. Pierwsza cecha jest odpowiednia dla systemów czasu rzeczywistego (ang. Real Time Systems), natomiast druga dla systemów nisko prądowych (ang. Low Power). 131 12. Bibliografia [1] Assuncao PAA., Ghanbari M., Buffer analysis and control in CBR video transcoding., IEEE Transactions on Circuits & Systems for Video Technology, vol.10, no.1, Feb. 2000, pp.83-92. [2] Bachiochi J., Getting a grip on complex integration Atmel FPSLIC., Circuit Cellar Ink, no.128, March 2001, pp.72-82. Publisher: Circuit Cellar Inc, USA. [3] Barr M., A Reconfigurable Computing Primer, Multimedia Systems Design, September 1998, pp. 44-47. [4] Bazargan K., Kastner R. Ogrenci S. Sarrafzadeh M., A C to hardware/software compiler., Proceedings 2000 IEEE Symposium on Field-Programmable Custom Computing Machines, IEEE Comput. Soc. 2000, pp.331-2. Los Alamitos, CA, USA. [5] Benkird A., Crookes D., Benkird K., Design and Implementation of Generic 2-D Biorthogonal Discrete Wavelet Transform on FPGA. Field-Programable Custom Computing Machines, Ronhert Park CA, USA, April 2001. [6] Bhaskaran V., Konstantinides K., Image and Video Compression Standards. Algorithms and Architectures., Kluwer Academic Publishers 1997. [7] Bhaskaran V., Konstantinides K., Image and Video Compression Standards. Algorithms and Architectures, Kluwer Academic Publishers 1995. [8] Blain M.E. Fisher T.R., Optimum Rate Allocation in Pyramid Vector Quantizer Transform Coding of Imagery, ICASSP’87, pp. 729-732 [9] Blain M.E., Fisher T.R., A Comparison of Vector Quantization Techniques in Transform And Subband Coding of Imagery, Signal Processiong: Image Communication 3 (1991) pp. 91-105, Elsevier 1991 [10] Bo Tao., Dickinson BW., Peterson HA., Adaptive model-driven bit allocation for MPEG video coding., IEEE Transactions on Circuits & Systems for Video Technology, vol.10,no.1, Feb. 2000, pp.147-57. [11] Brebner G., Gray J., Use of Reconfigurability in Variable-Length Code Detection at Video Rates, p , Field-Programmable Logic and Applications, August/September 1995, pp. 429-438. [12] Brunig M., Niehsen W., Fast full-search block matching., IEEE Transactions on Circuits & Systems for Video Technology, vol.11, no.2, Feb. 2001, pp.241-7. [13] Brzozowski I., Gorgoń M., Kasperek J.,Rajda P. J., Russek P., Wiatr K., Programmable Logical Devices in Electronic Engineering Education, Mixed Design of 132 Integrated Circuits and Systems MIXDES Mixed Design of Integrated Circuits and Systems MIXDES’96 Łódź 30.05-01.06.1996 [14] Burleson W.P., Jain P., Venkatraman S., Dynamically Parameterized Architecture for Power-Aware Video Coding: Motion Estimation and DCT, Second USF International Workshop on Digital and Computational Video (DCV’01), 2001. [15] Camilleri N., Status and Control Semaphore Registers Using Partial Reconfiguration, XAPP 153, June 7, 1999, Xilinx [16] Camposano R., Rosenstiel W., Synthestizing Circuits from Behavioral Description, IEEE Trans. On CAD/ICAS, Vol. 8, No. 2, pp.171-180, Feb. 1989 [17] Cao HQ., Li W., A fast search algorithm for vector quantization using a directed graph., IEEE Transactions on Circuits & Systems for Video Technology, vol.10, no.4, June 2000, pp.585-93. [18] Cardoso JMP. Neto HC., Compilation increasing the scheduling scope for multi- memory-FPGA-based custom computing machines, Proceedings of 11th International Conference on Field Programmable Logic and Applications.Belfast, Northern Ireland, UK. 27-29 Aug. 2001. [19] Chatha K.S., Vemuri R., Hardware-Software Codesign for Dynamically Reconfigurable Architectures, , Field-Programmable Logic and Applications, 9th International Workshop, FPL’99, pp.175-184, Glasgow, UK, 1999 [20] Chen C.H., Laplacian Pyramid Image Data Compression, ICASSP’87, pp. 737-739 Vol. 2 [21] Christopoulos V., Cornelis J., A center-biased adaptive search algorithm for block motion estimation., IEEE Transactions on Circuits & Systems for Video Technology, vol.10, no.3, April 2000, pp.423-6. [22] Composano R., Wolf W.[ed], High-Level VLSI Synthesis, Kluwer, Boston, 1991 [23] Conway J.H, Sphere Packing, lattices and groups, New York, Springer 1993 [24] Cordoso J.M.P., Neto H.C., Micro-Based Hardware Compilation of Java Bytecodes into Dynamic Reconfigurable Computing System, Proc. IEEE Symposium on Field Programmable Custom Computng Machines, FCCM 1999, pp.2-11, California, 1999 [25] Cormen T.H., Leiserson C. E., Rivest R.L., Wprowadzenie do algorytmów, WNT Warszawa 1997 [26] D’Alessandro P., Formenti P., Lancini R., Pyramid Vector Quantization Applied To A Video Coding Scheme For Contribution Quality, Proc. of IEEE ICASSP’93, New York, NY, USA, 1993, pp.249-252 133 [27] D’Alessandro P., Lancini R., Video Coding Scheme Using DCT Pyramid Vector Quantization, IEEE Transactions of Image Processing., Vol. 4, No. 3, March 1995 [28] D’Alessandro P., Lancini R., Video Coding Scheme Using DCT-Pyramid Vector Quantization, IEEE Trans. on Image Processing, vol. 4, no. 3, March 1995 [29] De Michelli G., Synteza i optymalizacja układów cyfrowych, WNT Warszawa 1994 [30] Doan T., Wei B., W., Y., Tsern E.K., MengT.H-Y., A Low Power Portable Digital Video on Demand System., IEEE International Symposium on Circuits and systems. Circuits and Systems in the Information Age. ISCAS’97, Vol. 2, 1997, pp. 1233-1236 [31] Drozdek A., Wprowadzenie do kompresji danych, WNT Warszawa 1999. [32] Eldredge J.G., Hutchings B.L., Run-Time Reconfiguration: A Method for Enhancing the Functional Density of SRAM-Based FPGA, Journal of VLSI Signal Processing 12, pp. 67-86, Kluwer, 1996 [33] Fisher T. R., A Pyramid Vector Quantizer, IEEE Trans. Information Theory, vol. IT-32, No 4, July 1986, pp. 568-583. [34] Fisher T.R., A Pyramid Vector Quantizer, IEEE Trans. on Information Theory, Vol. IT-32, No 4, pp. 568-583, July 1986 [35] Flynn M.J., Very High-Speed Computing Systems, Proc. IEEE, Vol. 54, New York 1966, No 12. [36] Gajski D. [ed], Silicon Compilation, Addison-Wesley, 1987 [37] Gause J., Cheung P.Y.K, Luk W., Static and Dynamic Reconfigurable Designs for 2D Shape-Adaptive DCT, , Field-Programmable Logic and Applications, 10th International Workshop, FPL’2000, pp.96-105, Villach, Austria, 2000 [38] Gause J., Cheung P.Y.K., Luk W., Static and Dynamic Reconfigurable Designs for 2D Shape-Adaptive DCT, Field-Programable Logic and Applications, Villach, Austria, August 2000, pp. 96-105. [39] George M., Alfke P., Linear Feedback Shift Registers in Virtex Devices, Application Notes Virtex Series and Virtex II Series XAPP210 (v1.2), January 9, 2001. [40] Gersho A., Gray R. M., Vector Quantization [41] Gersho A., Gray R.M., Vector Quantization and Signal Compression, Kluwer Academic 1992 [42] Gokhale M.B., Stone J.M., Napa C: Compiling for hybrid RISC/FPGA Architecture, Proc. IEEE Symposium on Field Programmable Custom Computng Machines, FCCM 1998, pp.126-135, California, 1998 134 [43] Gordon M.G., Tsern E., Meng T.H., Design of a Low Power Video Decompression Chip Set for Portable Applications, Journal of VLSI Signal Processing Systems 13, pp. 125-142 (1996) [44] Gorgon M., Tadeusiewicz R., Hardware-based image processing library for Virtex FPGA., SPIE-Int. Soc. Opt. Eng. Proceedings of Spie - the International Society for Optical Engineering, vol.4212, 2000, pp.1-10. USA. [45] H. A. Chow and H. M. Alnuweiri. FPGA-based transformable coprocessor for MPEG video processing. In John Schewel, editor, High-Speed Computing, Digital Signal Processing, and Filtering Using reconfigurable Logic, Proc. SPIE 2914, pages 308-320, Bellingham, WA, October 1996. SPIE - The International Society for Optical Engineering. [46] Hartenstein RW; Grunbacher H. Programmable system level integration brings system-on-chip design to the desktop. Field-Programmable Logic and Applications. Roadmap to Reconfigurable Computing. 10th International Conference, FPL 2000. Proceedings, Springer-Verlag. 2000, pp.789-92. Berlin, Germany. [47] Haskell B.G., Puri A., Netravali A.N., Digital Video: An Introduction to MPEG-2, Chapman & Hall 19997. [48] Heron J., Trainor D., Woods R., Image Compression Algorithms Using Re- configurable Logic, 31st Asilomar Conference on Signals, Systems and Computers, Asilomar, USA, Nov. 1997, pp399-403. [49] Hrynkiewicz E., Wyrwoł B., Wykorzystanie struktur programowalnych w realizacji algorytmu defuzyfikacji COG., Materiały V Krajowej Konferencji Naukowej: Reprogramowalne Układy Cyfrowe. RUC’2002 Szczecin 9-10 Maja [50] Hrynkiewicz E., Milik A., Rekonfigurowalny sterownik przemysłowy. Implementacja programów sterowania., Materiały V Krajowej Konferencji Naukowej: Reprogramowalne Układy Cyfrowe. RUC’2002 Szczecin 9-10 Maja [51] Huang W., Saxena N., McCluskey E.J., A Reliable LZ Data Compression on Reconfigurable Coprocessor, Field-Programable Custom Computing Machines, Napa Valley CA, USA, April 2000. [52] Huang W-J., Saxena N., McCluskey E., A Reliable LZ Data Compressor on Reconfigurable Coprocessor, Proc. IEEE Symposium on Field Programmable Custom Computng Machines, FCCM 2000, pp.249-258, California, 2000 135 [53] Hudson R.D., Lehn D.I., Athanas P.M., A Run-Time Reconfigurable Engine for Image Interpolation, Proc. IEEE Symposium on Field Programmable Custom Computng Machines, FCCM 1998, pp.88-95, California, 1998 [54] Hung A.C., Tsern E.K., Meng T.H., Error-Resilence Pyramid Vector Quantization for Image Compression, IEEE Transaction of Image Processing, Vol. 7, No. 10, Oct. 1998, pp. 1373-1386 [55] Hwang K., Advanced Computer Architecture: Parallelism, Scalability, Progrmmability, McGraw-Hill 1993. [56] Hwangjun Song., Kuo C-CJ., Rate control for low-bit-rate video via variable- encoding frame rates., IEEE Transactions on Circuits & Systems for Video Technology, vol.11,no.4, April 2001, pp.512-21. [57] Jae Hun Lee. Kyoung Won Lim. Byung Cheol Song. Jong Beom Ra., A fast multi- resolution block matching algorithm and its LSI architecture for low bit-rate video coding., IEEE Transactions on Circuits & Systems for Video Technology, vol.11, no.12, Dec. 2001, pp.1289-301. [58] Jamro E., Automatyczna synteza układów z parametrem w języku VHDL na przykładzie kodeka kodu BCH, Krajowe Sympozjum Telekomunikacji’ 2000, 6-8 wrzesień 2000, ATR Bydgoszcz. vol. D. pp. 59-64. [59] Jamro E., Synteza układów z parametrem w języku VHDL na przykładzie kodeka kodu BCH., II Krajowa Konferencja Metody i systemy komputerowe w badaniach naukowych i projektowaniu inżynierskim, Kraków 25-17 X 1999, pp. 39-43. [60] Janssens S. Thomas J. Borremans W. Gijsels P. Verbauwhede I., Hardware/software co-design of an elliptic curve public-key cryptosystem., 2001 IEEE Workshop on Signal Processing Systems. SiPS 2001. Design and Implementation, IEEE. 2001, pp.209-16. Piscataway, NJ, USA. [61] Jones C., Oswald J., Schoner B., Villasenor J., Issues in Wireless Video Coding using Run time Reconfiguration FPGAs, Symposiumon FPGAs for Custom Computing Machines, Los Alamitos, CA, USA, April 1995, pp. 85-89. [62] Jong-Nam Kim., Tae-Sun Choi., A fast full-search motion-estimation algorithm using representative pixels and adaptive matching scan., IEEE Transactions on Circuits & Systems for Video Technology, vol.10, no.7, Oct. 2000, pp.1040-8. [63] Jumg B, Burleson W. P., VLSI Array Architectures for Pyramid Vector Quantization, The Journal of VLSI Signal Processing, No 18, 141-154, 1998. 136 [64] Jung B., Burleson W.P., VLSI Array Architectures for Pyramid Vector Quantization, Journal of VLSI Signal Processing, Vol. 18, No. 2, Feb. 1998, pp.141-154 [65] Kelem S., Mapping a Real-Time Video Algorithm to a Context-Switched FPGA, Symposiumon FPGAs for Custom Computing Machines, Los Alamitos, CA, USA, April 1997, pp. 236-237. [66] Knapp D. W., Behavioral Synthesis. Digital System Design Using the Synopsys Behavioral Compiler, Prentice Hall PTR, 1996. [67] Ku D., De Micheli G., High-Level Synthesis of ASICS under Timing and Synchronization Constraints, Kluwer, Boston, 1992 [68] Kung S.Y., VLSI Array Processors, Prentice Hall 1988. [69] Kurup P., Logic Synthesis Using Synopsys, Kluwer Academic Publishers, 1995. [70] Lancini R., Marconetti E. ,Tubaro S., Image Coding with Overlapped Projection and Pyramid Vector Quantization, ICASSP-94 Vol. 5, 1994, pp. V/593-596. [71] Le Gall D., MPEG. A Video Compression Standard for Multimedia Applications, Communications of the ACM, Vol. 34, No. 4, April 1991. [72] Limqueco J.C., Bayoumi M.A, A VLIS Architecture for Separable 2-D Discrete Wavelet Transform, Journal of VLSI Signal Pocessing 18, pp. 125-140, 1998 [73] Lipowska-Nadolska E., Morawski M., Tablice systoliczne. Problemy wybrane, Akademicka oficyna wydawnicza PLJ, Warszawa 1999. [74] Lloyd S. P., Least Squares Quantization in PCM, IEEE Trans. Information Theory, vol. IT-28, pp. 129-137, 1982. [75] Lloyd S.P., Least Square Quantization in PCM, IEEE Trans. On Information Theory, IT-28, pp. 127-135, March 1982 [76] Maruyama T., Hoshino T., A C to HDL Compiler for Pipeline processing on FPGAs, Proc. IEEE Symposium on Field Programmable Custom Computng Machines, FCCM 2000, pp.101-110, California, 2000 [77] Mateka A., Elementy cyfrowego przetwarzania i analizy obrazów,PWN, Łódź 1991 [78] Max J., Quantization For Minimum Distortion, IRE Trans. Information Theory, vol. IT-6, pp.7-12, Mar. 1960. [79] Milik A.,Hrynkiewicz E., PID module for reconfigurable logic controller, Programmable Devices and Systems (PDS 2000). Proceedings volume from the IFAC Workshop, Elsevier Science. 2000, pp.5-9. Kidlington, UK. [80] Modestino J. W., Farvardin N., Ogrinc M. R., Performance of Block Cosine Image Coding, IEEE Trans. On Communication, Vol. COM-33, pp. 210-217, Mar. 1985 137 [81] Mohd-Yusof Z., Fisher T. R., An Entropy-Coded Lattice Vector Quantizer For Transform And Subband Image Coding, IEEE Trans. On Image Processing, Vol. 5, No. 2, Feb., 1996 [82] Mohorko J., CuCej Z., Fast Algorithm for Pyramid Vector Quantization, IEEE Signal Processing Letters, Vol. 8, No 4. April 2001 [83] Mohorko J., Filip P., Planinsisc P, Cucej Z., Donlagic D., Image Compression by Using Pyramid Vector Quantization, Elektrotechniski Viestnik, Vol. 61, No. 1-2, 1994, Slovenia [84] Mohorko J., Filip P., Planinsisc P, Cucej Z., Donlagic D., Image Coding Using Pyramid Vector Quantization of Wavelet Coefficients, ITI’93 Zagreb, 15-18 June 1993 [85] Mohorko J., Planinsic P., CuCej Z., Fast Algorithm for Pyramid Vector Quantization, IEEE Signal Processing Letters, vol. 8, No. 4, April 2001, pp. 103-105 [86] Mukund PR; ChickanoskyJ; KrishnamurthyRK., SoC integration of digital audio applications using protocol compiler and ATMEL FPSLIC., Proceedings 14th Annual IEEE International ASIC/SOC Conference IEEE. 2001, pp.266-70. Piscataway, NJ, USA. [87] Namgoong W., Devenport M., Meng T., A Low Power EncoderArchitecture for Pyramid Vector Quantization of 2D subband coefficient, VLSI Signal Processing, VIII 1995 pp. 391-400 [88] Namgoong W., Meng T.H., A Low Power Encoder for Pyramid Vector Quantization of Subband Coefficients, Journal of VLSI Signal Processing, Vol. 16, No. 1, May 1997, pp. 9-23 [89] Omondi A., Computer arithmetic systems: algorithms, architectures, and implementation, Prentice Hall, 1994. [90] Page I., Construction of Hardware-Software Systems from a Single Description, Journal of VLSI Signal Processing, 12, pp.87-107, March 1996 [91] Pahri K.K., VLSI Digital Signal Processing Systems. Design and Implementations, Wiley & Sons, 1999. [92] Park S.R., Burleson W., Reconfiguration for Power Saving in Real Time Motion Estimation, ICASSP, May, 1998. [93] Postol MS., Some new lattice quantization algorithms for video compression coding., IEEE Transactions on Circuits & Systems for Video Technology, vol.12, no.1, Jan. 2002, pp.53-60. Publisher: IEEE, USA. 138 [94] Qureshi Q., Fisher T.R., A Hardware Pyramid Vector Quantizer, ICASSP’87 pp. 1402-1405 [95] Reininger R.C., Gibson J.D., Distribution of TwoDimentional DCT Coefficients for Images, IEEE Trans. On Communication, Vol. COM-31, pp. 835-839, June 1983. [96] Russek P., Wiatr K.: Dedykowana architektura systemu skalowalnego kodowania obrazow wielkiej rozdzielczości w trybie czasu rzeczywistego. Mat. Konf. - Krajowe Sympozjum Telekomunikacji, Bydgoszcz 2000, s. 195-204 [97] Russek P., Wiatr K., FPGA Based Vector Quantizer for Bitrate Control in Image Compression, The 2002 International Conference on Engineering of Reconfigurable Systems and Algorithms, ERSA’02, Las Vegas Nevada 2002 (przyjęty do druku) [98] Russek P., Wiatr K., Rekonfigurowalny kwantyzator dla potrzeb kodowania obrazów w czasie rzeczywistym, Materiały V Krajowej Konferencji Naukowej: Reprogramowalne Układy Cyfrowe. RUC’2002 Szczecin 9-10 Maja [99] Russek P., Wiatr K.: Rekonfigurowalny kwantyzator implementowany w układzie FPGA do kodowania obrazów w czasie rzeczywistym, Kwartalnik Elektroniki i Telekomunikacji PAN, t. 48, z. 4, Warszawa 2002, (przyjęty do druku) [100] Rutkowski L., Cierniak R., Nowe metody kompresji obrazu, Wyd. „Gnome”, Katowice 2000 [101] Sabin M.J., Gray R.M., Product Code Vector Quantizers for Waveform and Voice Coding, IEEE Trans. on Acoustics, Speech, and Signal Procession, vol. ASSP-32, no. 3, June 1984 [102] Sarkinson D. J., Geometric Treatment of the Source Encoding of a Gaussian Random Variable, IEEE Trans. Information Theory, vol. IT-14, pp. 481-486, May 1968 [103] Saw Yoo-Sok, Rate quality optimised video coding. Kluwer Academic Publishers 1999. [104] Scalera J., Jones M., A run-time reconfigurable plug-in for the Winamp MP3 player., Proceedings 2000 IEEE Symposium on Field-Programmable Custom Computing Machines, IEEE Comput. Soc. 2000, pp.319-20. Los Alamitos, CA, USA. [105] Schoner B. Villasenor J, Molloy S., Jain R., Techniques for FPGA Implementation of Video Compression Systems, FPGA 1995, Monterey, CA, USA, pp. 154-159. [106] Schuster G. M., Katsaggelos, Rate-Distortion Based Video Compression, Kluwer, 1997. 139 [107] Seung-Kwon Paek., Lee-Sup Kim., A real-time wavelet vector quantization algorithm and its VLSI architecture., IEEE Transactions on Circuits & Systems for Video Technology, vol.10, no.3, April 2000, pp.475-89. [108] Shannon C. E., A Mathematical Theory of Communication, Bell Syst. Tech. J., vol. 27, pp379-423, 623-656, 1948. [109] Shapiro J.M., Embedded Image Coding Using Zerotrees of Wavelet Coefficients, IEEE Trans. On Signal Processing, Vol. 41, No. 12, Dec 1993 [110] Shen-Fu Hsiao., Wei-Ren Shiue., A new hardware-efficient algorithm and architecture for computation of 2-D DCTs on a linear array., IEEE Transactions on Circuits & Systems for Video Technology, vol.11, no.11, Nov. 2001, pp.1149-59. [111] Shibata Y., Uno M. Amano H., Furuta K., Fujii T, Motomura M., A virtual hardware system on a dynamically reconfigurable logic device., Proceedings 2000 IEEE Symposium on Field-Programmable Custom Computing Machines, IEEE Comput. Soc. 2000, pp.295-6. Los Alamitos, CA, USA. [112] Skarbek W., Multimedia. Algorytmy i standardy kompresji, Warszawa PLJ 1998. [113] Song X., Neuvo Y., Image Compressionusing Nonlinear Pyramid Vector Quantization, Multidimensional Systems & Signal Processing Vol. 5, No. 2, April 1994, pp. 133-149 [114] Sotiriades E., Dollas A., Athanas P., Hardware-Software Codesign and Parallel Implementation of Golomb Ruler, Proc. IEEE Symposium on Field Programmable Custom Computng Machines, FCCM 2000, pp.227-235, California, 2000 [115] Synopsys, Synopsys On-Line Documentation, Nov. 2000. [116] Tadeusiewicz R., Computer System Dedicated to Image Processing., Proc. Of the 5-th School: Computer Vision and Graphics, Wrocław, Wyd. Format 1994, pp. 111-126 [117] Tadeusiewicz R., Korohoda P., Komputerowa analiza imprzetwarzanie obrazów, Wydaw. Fundacji Postępu Telekomunikacji, Kraków 1997 [118] Tekalp A.M., Digital Signal Processing, Prentice Hall Signal Processing Series 1995. [119] Tekalp A.M., Digital Video Processing, Prentice Hall, 1995. [120] Topiwala P.N. [ed.], Wavelet Image and Video Compression, Kluwer Academic 1998. [121] Torres L., Kunt M. [ed.], Video Coding. The Second Generation Approach, Kluwer 1996. [122] Tseng H.C., Fisher T.R., Transform and Hybrid Transform/DPCM Coding of Images Using Pyramid Vector Quantization, IEEE Trans. on Communications, vol. COM-35, no. 1, Jan. 1987 140 [123] Tsern E. K., Meng H. M., A Low Power Video-Rate Pyramid VQ Decoder, IEEE Journal of Solid-State Circuits, vol 31, No. 11, November 1996 [124] Tsern E.K., Meng T.H., A Low Power Video-Rate Pyramid VQ Decoder, IEEE Journal of Solid State Circuits, Vol. 31, Nov. 1996, pp. 1789-1794 [125] Tsern E.K., Meng T.H.Y, Image Coding Using Pyramid Vector Quantization Of Subband Coefficients, Proc. of IEEE ICASSP’94, New York, NY, USA, 1994, pp. 601604, vol.5 [126] Vaidyanathan P. P. Multirate systems and filter banks. Englewood Cliffs : Prentice Hall, 1993 [127] Vetterli M., J. Kovacevic. Wavelet And Sub-band Coding. Prentice Hall 1995 [128] Vetterli M.,Multi-dimensional sub-band coding. Some theory and algorithms, Signal Processing, vol. 6, pp. 97-112, Apr. 1984 [129] Villasenor J, Jones C., Schoner B., Video Communications using Rapidly Reconfigurable Hardware, IEEE Trans. on Circuits and Systems for Video Technology, vol 5, pp. 565-567, December 1995. [130] Villasenor J, Mangione-Smith W.H., Configurable Computing, Scientific American, June 1997. [131] Walker R., Composano R., A Survey of High-Level Synthesis, Kluwer, Boston, 1991 [132] Wiatr K., Dedicated system Architectures for Parallel Image Computation used Specialised Hardware Processors Implemented in FPGA Structures, International Journal of Parallel and Distributed Systems and Networks, Pittsburgh 1998. [133] Wiatr K., A pipelined Architecture of Specialised Reconfigurable Processors in FPGA Structures for Real - Time Image Data Pre-Processing, IEEE Computer Society: Proceedings of 24th EUROMICRO Conference – Digital Systems Design, Vasteras Sweden 1998, pp. 131-138. [134] Wiatr K., Architektura potokowa specjalizowanych procesorów sprzętowych do wstępnego przetwarzania obrazów w systemach wizyjnych czasu rzeczywistego, Wydawnictwo AGH, Kraków 1998. [135] Wiatr K., Dedicated Hardware Processors for Real-Time Image DataPre-Procesing Implemented in FPGA Structure, Proc. of the 9-th International Conference on Image Analysis and Processing – ICIAP’97, pp. 69-75, Florence, Italy, 1997 [136] Wiatr K., Kasperek J., Rajda P., Russek P.; Sposób transmisji po magistrali do kilku odbiorców. Patent nr OWP-I-P/270 z dnia 12.07.1995 141 [137] Wiatr K., Russek P. Embedded Zero Wavelet Coefficient Coding Method for FPGA Implementation of Video Codec in Real-Time Systems. International IEEE Conference on Information Technology: Coding and Computing, Los Alamitos Nevada 2000, pp. 146151 [138] Wiatr K., Russek P.; Dedykowana architektura do kompresji obrazu wizyjnego w czasie rzeczywistym. Kwartalnik Elektrotechnika i Elektronika, Tom 18, Zeszyt 3-4, Kraków 1999, [139] Wiatr K., Russek P.; Implementacja sprzętowa skalowalnego systemu kodowania obrazów wizyjnych wysokiej rozdzielczości w czasie rzeczywistym. Kwartalnik Elektroniki i Telekomunikacji PAN, t. 45, z. 3, Warszawa 1999 [140] Wiatr K., Russek P.; Implementacja sprzętowa skalowalnego systemu kodowania obrazów wizyjnych wysokiej rozdzielczości w czasie rzeczywistym. Kwartalnik Elektrotechnika i Elektronika [141] Wiatr K., Russek P.; Specjalizowana architektura sprzętowego skalowalnego systemu kodowania obrazów wielkiej rozdzielczości w czasie rzeczywistym. II Krajowa Konferencja Metody i systemy komputerowe w badaniach naukowych i projektowaniu inżynierskim AGH Kraków 25 – 27 października 1999, s. 561-567 [142] Wiatr K., Russek P.; Sprzętowe architektury kompresji obrazu wizyjnego dla potrzeb przetwarzania w czasie rzeczywistym. Kwartalnik Elektroniki i Telekomunikacji PAN, t. 44, z. 2, Warszawa 1998, s. 245-258. . [143] Wiatr K., Russek P.; Synchronizacja pracy procesorów w systemie do analizy obrazów w czasie rzeczywistym. Elektrotechnika, t. 15, z. 4, Kraków 1996, s. 291-301 [144] Wiatr K., Specialised Architecture of Dedicated Hardware Processor for Real Time Image Data Pre-Processing., Proc. of the EUROMICRO International Conference: RealTime Systems, pp. 187, Toledo – Spain 1997 [145] Woods J.W., Subband Image Coding, Kluwer Academic Publ. 1991. [146] Xialnglin W., Xinggang L., Guowei W., Image Coding Method Based on Wavelet Transform and Lattice Vector Quantizaton, Journal of Tsinghua University, Vol. 37, No. 10, Oct. 1997 [147] Xilinx, The Programmable Logic Data Book, 2000. [148] Xilinx, Using the Virtex Block Select RAM+ Features, Application Notes Virtex Series, XAPP130 (v1.4), Dec 18 2000. [149] Xilinx, Virtex FPGA Series Configuration and Readback, Application Notes Virtex Series XAPP138 (v2.4), July 25, 2001. 142 [150] Xu W., Hauske G., Filip P., Ruf M., Subjective Rating of Picture Coding Algorithms, Proceedings of SPIE - the International Society of Optical Engineering., Vol. 2501, 1995 pp. 595-606 [151] Yan Yang., Hemami SS., Generalized rate-distortion optimization for motioncompensated video coders., IEEE Transactions on Circuits & Systems for Video Technology, vol.10, no.6, Sept. 2000, pp.942-55. [152] Zhong-Li He., Chi-Ying Tsui., Kai-Keung Chan., Liou ML., Low-power VLSI design for motion estimation using adaptive pixel truncation., IEEE Transactions on Circuits & Systems for Video Technology, vol.10, no.5, Aug. 2000, pp.669-78. [153] Zieliński T.P., Od teorii do cyfrowego przetwarzania sygnałów, Wyd. AGH, Kraków, 2002 [154] Zielinski T. Turcza P, Design of Lerner prototype filters for communication filter banks., Proceedings Broadband Access Conference. BAC'99. Fundacji Postepu Telekomunikacji. 1999, p.42-7. Cracow, Poland. 143 R→ → L↓ ↓ 4 9 16 25 36 49 64 81 100 121 144 169 196 225 256 4 9 16 25 36 49 64 81 100 121 144 169 196 225 256 4 9 16 25 36 49 64 81 100 121 144 169 196 225 256 4 9 16 25 36 49 64 81 100 121 144 169 196 225 256 K 1 1 1 1 1 1 1 1 2 2 2 3 3 3 3 1 1 1 1 1 1 1 1 2 2 2 3 3 3 3 1 1 1 1 1 1 1 1 2 2 2 3 3 3 3 1 1 1 1 1 1 1 1 2 2 2 3 3 3 3 0.1 CLB 504 755 1102 1543 2086 2721 3460 4291 5387 6436 7591 8878 10225 11674 13230 5 8 12 15 21 26 34 43 128 158 193 420 501 588 686 33 90 182 299 477 671 946 1229 4039 5018 6234 10279 12329 14427 16914 3325 3401 3480 3484 3567 3574 3659 3668 3706 3721 3819 3838 3858 3880 3985 K 1 1 1 1 2 2 2 3 3 4 4 5 6 6 7 1 1 1 1 2 2 2 3 3 4 4 5 6 6 7 1 1 1 1 2 2 2 3 3 4 4 5 6 6 7 1 1 1 1 2 2 2 3 3 4 4 5 6 6 7 0,2 CLB 504 755 1102 1543 2183 2833 3590 4476 5424 6628 7810 9124 10501 11981 13608 5 8 12 15 44 60 79 179 228 441 544 937 1507 1782 2688 33 90 182 299 1163 1702 2367 4213 5464 11857 14677 21179 29196 34535 45511 3325 3401 3480 3484 3579 3589 3679 3691 3706 3757 3861 3886 3913 3942 4056 K 1 1 1 2 2 3 3 4 5 6 7 8 9 10 12 1 1 1 2 2 3 3 4 5 6 7 8 9 10 12 1 1 1 2 2 3 3 4 5 6 7 8 9 10 12 1 1 1 2 2 3 3 4 5 6 7 8 9 10 12 0,3 CLB 504 755 1102 1628 2183 2870 3627 4587 5595 6666 7887 9334 10779 12290 13915 5 8 12 31 44 100 137 273 496 833 1323 2005 2928 4142 6604 33 90 182 738 1163 2259 3148 7172 11049 16074 22310 39325 51827 66589 89767 3325 3401 3480 3493 3579 3589 3679 3717 3736 3757 3861 3934 3968 4004 4127 K 1 1 2 2 3 4 5 6 7 8 10 11 13 15 17 1 1 2 2 3 4 5 6 7 8 10 11 13 15 17 1 1 2 2 3 4 5 6 7 8 10 11 13 15 17 1 1 2 2 3 4 5 6 7 8 10 11 13 15 17 0,4 CLB 504 755 1179 1628 2220 2947 3759 4625 5633 6824 8070 9412 10818 12368 14260 5 8 21 31 71 151 288 507 840 1320 2357 3380 5379 8139 11832 33 90 421 738 1508 3789 6291 9648 14125 25867 37834 49842 67933 89817 148305 3325 3401 3486 3493 3579 3606 3700 3717 3736 3792 3903 3934 3968 4004 4197 K 1 1 2 3 4 5 6 8 9 11 13 15 17 20 22 1 1 2 3 4 5 6 8 9 11 13 15 17 20 22 1 1 2 3 4 5 6 8 9 11 13 15 17 20 22 1 1 2 3 4 5 6 8 9 11 13 15 17 20 22 0,5 CLB 504 755 1179 1665 2284 2985 3759 4740 5769 6902 8109 9451 11059 12601 14300 5 8 21 49 106 209 378 792 1249 2201 3615 5626 8382 13127 18198 33 90 421 954 2565 4458 7130 15417 22005 32391 45687 62211 105300 141207 178598 3325 3401 3486 3493 3593 3606 3700 3742 3766 3792 3903 3934 4023 4066 4197 K 1 2 2 3 5 6 8 10 12 14 16 19 22 25 28 1 2 2 3 5 6 8 10 12 14 16 19 22 25 28 1 2 2 3 5 6 8 10 12 14 16 19 22 25 28 1 2 2 3 5 6 8 10 12 14 16 19 22 25 28 0,6 CLB 504 822 1179 1665 2321 2985 3855 4779 5769 6902 8255 9664 11100 12642 14300 5 13 21 49 144 272 587 1123 1974 3247 5069 8286 12819 18985 27152 33 197 421 954 2954 5045 11308 17943 26806 38340 67471 93684 125994 164935 211416 3325 3405 3486 3493 3593 3606 3721 3742 3766 3792 3945 3982 4023 4066 4197 K 1 2 3 4 6 7 9 12 14 17 20 23 27 30 34 1 2 3 4 6 7 9 12 14 17 20 23 27 30 34 1 2 3 4 6 7 9 12 14 17 20 23 27 30 34 1 2 3 4 6 7 9 12 14 17 20 23 27 30 34 0,7 CLB 504 822 1216 1715 2321 3023 3894 4779 5808 7062 8294 9703 11139 12681 14610 5 13 32 69 186 341 703 1494 2523 4438 7279 11315 17917 25613 37394 33 197 529 1568 3340 5590 12240 20299 29774 55854 78518 106693 144781 186737 310594 3325 3405 3486 3503 3593 3606 3721 3742 3766 3828 3945 3982 4023 4066 4266 K 1 2 3 5 7 9 11 14 17 20 24 28 32 36 41 1 2 3 5 7 9 11 14 17 20 24 28 32 36 41 1 2 3 5 7 9 11 14 17 20 24 28 32 36 41 1 2 3 5 7 9 11 14 17 20 24 28 32 36 41 0,8 CLB 504 822 1216 1752 2359 3103 3933 4818 5945 7062 8294 9664 11302 12917 14650 5 13 32 93 230 496 955 1903 3434 5756 9766 15559 23620 34491 50787 33 197 529 1824 3671 8562 13953 22451 43208 62165 88604 121602 208563 271342 351621 3325 3405 3486 3503 3593 3622 3721 3742 3796 3828 3945 3982 4076 4127 4266 K 1 3 4 6 8 10 13 16 20 24 28 32 37 43 48 1 3 4 6 8 10 13 16 20 24 28 32 37 43 48 1 3 4 6 8 10 13 16 20 24 28 32 37 43 48 1 3 4 6 8 10 13 16 20 24 28 32 37 43 48 K 1 3 4 6 9 12 15 19 23 27 32 38 43 49 56 1 3 4 6 9 12 15 19 23 27 32 38 43 49 56 1 3 4 6 9 12 15 19 23 27 32 38 43 49 56 1 3 4 6 9 12 15 19 23 27 32 38 43 49 56 144 0,9 CLB 504 859 1255 1752 2387 3103 3933 4895 5945 7062 8335 9838 11384 12998 14610 5 19 44 119 279 578 1235 2343 4438 7697 12498 19289 29868 45983 65581 33 237 868 2037 5228 9134 15540 31211 47927 69934 97772 170509 229042 304280 389467 3325 3405 3494 3503 3605 3622 3721 3768 3796 3828 3945 4029 4076 4127 4266 1 CLB 504 859 1255 1752 2426 3103 3971 4974 6024 7141 8481 9920 11425 12958 14650 5 19 44 119 331 761 1539 3064 5529 9270 15457 25387 37989 56717 84053 33 237 868 2037 5610 10231 16989 34732 52350 75217 136755 189941 251800 330497 429312 3325 3405 3494 3503 3605 3622 3721 3768 3796 3828 3985 4029 4076 4127 4266 K 4 7 12 18 25 33 43 54 66 80 94 110 128 146 165 4 7 12 18 25 33 43 54 66 80 94 110 128 146 165 4 7 12 18 25 33 43 54 66 80 94 110 128 146 165 4 7 12 18 25 33 43 54 66 80 94 110 128 146 165 2 CLB 628 965 1375 1937 2571 3346 4251 5174 6305 7466 8875 10259 11874 13595 15399 12 42 163 522 1422 3370 7415 14814 27426 48659 80500 129576 203099 304506 444187 117 499 2003 6080 12429 29155 49676 79423 160247 235036 331280 456033 867319 1140536 1472695 3330 3410 3502 3522 3619 3654 3762 3791 3855 3897 4027 4077 4186 4251 4408 K 10 17 27 40 56 74 96 120 147 177 209 245 255 255 255 10 17 27 40 56 74 96 120 147 177 209 245 255 255 255 10 17 27 40 56 74 96 120 147 177 209 245 255 255 255 10 17 27 40 56 74 96 120 147 177 209 245 255 255 255 3 CLB 731 1075 1535 2033 2680 3511 4313 5335 6572 7756 9067 10562 12169 13805 15568 21 107 444 1511 4296 10373 22891 45632 85045 149777 250061 403912 543204 678492 833532 201 1165 3531 10854 22385 54541 93019 148543 318396 465896 658921 907987 1172250 1462739 1795396 3333 3420 3509 3531 3631 3671 3783 3817 3885 3932 4069 4125 4186 4251 4408 K 24 36 57 83 115 154 198 247 255 255 255 255 255 255 255 24 36 57 83 115 154 198 247 255 255 255 255 255 255 255 24 36 57 83 115 154 198 247 255 255 255 255 255 255 255 24 36 57 83 115 154 198 247 255 255 255 255 255 255 255 4 CLB 799 1154 1624 2211 2874 3681 4541 5625 6739 7923 9235 10646 12169 13805 15568 44 244 1120 3866 11004 27254 59687 119057 177785 245189 327720 426651 543204 678492 833532 318 1862 5737 18259 37672 97994 166970 266970 385620 530994 708836 921771 1172250 1462739 1795396 3336 3424 3515 3541 3645 3687 3804 3842 3885 3932 4069 4125 4186 4251 4408 K 59 79 118 171 236 255 255 255 255 255 255 255 255 255 255 59 79 118 171 236 255 255 255 255 255 255 255 255 255 255 59 79 118 171 236 255 255 255 255 255 255 255 255 255 255 59 79 118 171 236 255 255 255 255 255 255 255 255 255 255 5 CLB 989 1354 1753 2355 2990 3847 4708 5666 6739 7923 9235 10646 12169 13805 15568 102 602 2721 9560 27204 51756 82593 124077 177785 245189 327720 426651 543204 678492 833532 478 2971 9151 31168 64265 112861 179759 269519 385620 530994 708836 921771 1172250 1462739 1795396 3338 3429 3523 3551 3657 3687 3804 3842 3885 3932 4069 4125 4186 4251 4408 6 K 147 171 248 255 255 255 255 255 255 255 255 255 255 255 255 147 171 248 255 255 255 255 255 255 255 255 255 255 255 255 147 171 248 255 255 255 255 255 255 255 255 255 255 255 255 147 171 248 255 255 255 255 255 255 255 255 255 255 255 255 CLB 1102 1439 1847 2479 3115 3847 4708 5666 6739 7923 9235 10646 12169 13805 15568 268 1475 6646 15534 29960 51756 82593 124077 177785 245189 327720 426651 543204 678492 833532 1030 4863 15086 34096 65513 112861 179759 269519 385620 530994 708836 921771 1172250 1462739 1795396 3344 3434 3531 3551 3657 3687 3804 3842 3885 3932 4069 4125 4186 4251 4408 K 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 7 CLB 1265 1562 1971 2479 3115 3847 4708 5666 6739 7923 9235 10646 12169 13805 15568 473 2329 6863 15534 29960 51756 82593 124077 177785 245189 327720 426651 543204 678492 833532 1084 5194 15150 34096 65513 112861 179759 269519 385620 530994 708836 921771 1172250 1462739 1795396 3344 3434 3531 3551 3657 3687 3804 3842 3885 3932 4069 4125 4186 4251 4408 Dodatek 1 Zasoby sprzętowe CLB konieczne do realizacji dekodera PVQ dla róznych parametrów L, K Kwantyzator Koder Dekoder Dekwantyzator Dodatek 2 Wybrane wartości bitrate dla parametrów L i K LK 4 9 16 25 36 49 64 81 100 121 144 169 196 225 256 1 1,00 0,75 0,31 0,23 0,17 0,13 0,11 0,09 0,08 0,07 0,06 0,05 0,04 0,04 0,04 2 1,00 1,25 0,56 0,41 0,31 0,25 0,20 0,17 0,14 0,12 0,11 0,09 0,08 0,07 0,07 3 1,00 1,61 0,78 0,57 0,44 0,35 0,29 0,24 0,20 0,17 0,15 0,13 0,12 0,11 0,10 4 1,00 1,90 0,96 0,72 0,56 0,45 0,37 0,31 0,26 0,22 0,20 0,17 0,15 0,14 0,12 5 1,00 2,12 1,13 0,85 0,67 0,53 0,44 0,37 0,31 0,27 0,24 0,21 0,18 0,17 0,15 6 1,00 2,31 1,29 0,98 0,76 0,62 0,51 0,43 0,36 0,31 0,27 0,24 0,22 0,19 0,17 7 1,00 2,47 1,42 1,09 0,86 0,69 0,57 0,48 0,41 0,36 0,31 0,28 0,24 0,22 0,20 8 1,00 2,61 1,55 1,20 0,95 0,77 0,64 0,54 0,46 0,40 0,35 0,31 0,27 0,25 0,22 9 1,00 2,74 1,67 1,30 1,03 0,84 0,70 0,59 0,50 0,44 0,38 0,34 0,30 0,27 0,24 10 1,00 2,85 1,78 1,39 1,11 0,91 0,75 0,64 0,55 0,47 0,42 0,37 0,33 0,29 0,27 11 1,00 2,95 1,89 1,48 1,19 0,97 0,81 0,69 0,59 0,51 0,45 0,40 0,35 0,32 0,29 12 1,00 3,05 1,98 1,57 1,26 1,03 0,86 0,73 0,63 0,55 0,48 0,43 0,38 0,34 0,31 13 1,00 3,13 2,07 1,65 1,33 1,09 0,91 0,78 0,67 0,58 0,51 0,45 0,41 0,36 0,33 14 1,00 3,21 2,16 1,72 1,40 1,15 0,96 0,82 0,71 0,62 0,54 0,48 0,43 0,39 0,35 15 1,00 3,29 2,24 1,80 1,46 1,21 1,01 0,86 0,74 0,65 0,57 0,51 0,45 0,41 0,37 16 1,00 3,36 2,32 1,87 1,52 1,26 1,06 0,90 0,78 0,68 0,60 0,53 0,48 0,43 0,39 17 1,00 3,42 2,39 1,93 1,58 1,31 1,11 0,94 0,82 0,71 0,63 0,56 0,50 0,45 0,41 18 1,00 3,48 2,46 2,00 1,64 1,36 1,15 0,98 0,85 0,74 0,66 0,58 0,52 0,47 0,43 19 1,00 3,54 2,53 2,06 1,69 1,41 1,19 1,02 0,89 0,77 0,68 0,61 0,55 0,49 0,45 20 1,00 3,60 2,59 2,12 1,75 1,46 1,24 1,06 0,92 0,80 0,71 0,63 0,57 0,51 0,46 21 1,00 3,65 2,65 2,18 1,80 1,51 1,28 1,10 0,95 0,83 0,74 0,66 0,59 0,53 0,48 22 1,00 3,70 2,71 2,23 1,85 1,55 1,32 1,13 0,98 0,86 0,76 0,68 0,61 0,55 0,50 23 1,00 3,75 2,77 2,29 1,90 1,60 1,36 1,17 1,01 0,89 0,79 0,70 0,63 0,57 0,52 LK 4 9 16 25 36 49 64 81 100 121 144 169 196 225 256 24 1,00 3,79 2,82 2,34 1,95 1,64 1,40 1,20 1,05 0,92 0,81 0,73 0,65 0,59 0,54 25 1,00 3,84 2,88 2,39 1,99 1,68 1,43 1,24 1,08 0,95 0,84 0,75 0,67 0,61 0,55 26 1,00 3,88 2,93 2,44 2,04 1,72 1,47 1,27 1,11 0,97 0,86 0,77 0,69 0,63 0,57 27 1,00 3,92 2,97 2,48 2,08 1,76 1,51 1,30 1,13 1,00 0,89 0,79 0,71 0,64 0,59 28 1,00 3,96 3,02 2,53 2,12 1,80 1,54 1,33 1,16 1,02 0,91 0,81 0,73 0,66 0,60 29 1,00 4,00 3,07 2,57 2,17 1,84 1,58 1,36 1,19 1,05 0,93 0,83 0,75 0,68 0,62 30 1,00 4,03 3,11 2,61 2,21 1,87 1,61 1,39 1,22 1,07 0,96 0,85 0,77 0,70 0,63 31 1,00 4,07 3,15 2,66 2,24 1,91 1,64 1,42 1,25 1,10 0,98 0,88 0,79 0,71 0,65 32 1,00 4,10 3,20 2,70 2,28 1,95 1,67 1,45 1,27 1,12 1,00 0,90 0,81 0,73 0,67 33 1,00 4,14 3,24 2,74 2,32 1,98 1,71 1,48 1,30 1,15 1,02 0,92 0,82 0,75 0,68 34 1,00 4,17 3,27 2,77 2,36 2,02 1,74 1,51 1,33 1,17 1,04 0,93 0,84 0,76 0,70 35 1,00 4,20 3,31 2,81 2,39 2,05 1,77 1,54 1,35 1,19 1,06 0,95 0,86 0,78 0,71 36 1,00 4,23 3,35 2,85 2,43 2,08 1,80 1,57 1,38 1,22 1,09 0,97 0,88 0,80 0,73 37 1,00 4,26 3,39 2,88 2,46 2,11 1,83 1,59 1,40 1,24 1,11 0,99 0,90 0,81 0,74 38 1,00 4,29 3,42 2,92 2,49 2,14 1,86 1,62 1,43 1,26 1,13 1,01 0,91 0,83 0,76 39 1,00 4,32 3,46 2,95 2,53 2,18 1,89 1,65 1,45 1,28 1,15 1,03 0,93 0,84 0,77 40 1,00 4,35 3,49 2,99 2,56 2,21 1,91 1,67 1,47 1,31 1,17 1,05 0,95 0,86 0,78 41 1,00 4,37 3,52 3,02 2,59 2,24 1,94 1,70 1,50 1,33 1,19 1,07 0,96 0,88 0,80 42 1,00 4,40 3,55 3,05 2,62 2,26 1,97 1,72 1,52 1,35 1,21 1,08 0,98 0,89 0,81 43 1,00 4,42 3,58 3,08 2,65 2,29 1,99 1,75 1,54 1,37 1,22 1,10 1,00 0,91 0,83 44 1,00 4,45 3,62 3,11 2,68 2,32 2,02 1,77 1,56 1,39 1,24 1,12 1,01 0,92 0,84 45 1,00 4,47 3,65 3,14 2,71 2,35 2,05 1,80 1,59 1,41 1,26 1,14 1,03 0,94 0,85 46 1,00 4,50 3,67 3,17 2,74 2,38 2,07 1,82 1,61 1,43 1,28 1,15 1,04 0,95 0,87 LK 4 9 16 25 36 49 64 81 100 121 144 169 196 225 256 47 1,00 4,52 3,70 3,20 2,77 2,40 2,10 1,84 1,63 1,45 1,30 1,17 1,06 0,96 0,88 48 1,00 4,54 3,73 3,23 2,79 2,43 2,12 1,87 1,65 1,47 1,32 1,19 1,08 0,98 0,90 49 1,00 4,57 3,76 3,25 2,82 2,45 2,15 1,89 1,67 1,49 1,34 1,20 1,09 0,99 0,91 50 1,00 4,59 3,79 3,28 2,85 2,48 2,17 1,91 1,69 1,51 1,35 1,22 1,11 1,01 0,92 51 1,00 4,61 3,81 3,31 2,87 2,50 2,19 1,93 1,71 1,53 1,37 1,24 1,12 1,02 0,93 52 1,00 4,63 3,84 3,33 2,90 2,53 2,22 1,95 1,73 1,55 1,39 1,25 1,14 1,04 0,95 53 1,00 4,65 3,86 3,36 2,92 2,55 2,24 1,98 1,75 1,57 1,41 1,27 1,15 1,05 0,96 54 1,00 4,67 3,89 3,39 2,95 2,58 2,26 2,00 1,77 1,58 1,42 1,29 1,17 1,06 0,97 55 1,00 4,69 3,91 3,41 2,97 2,60 2,28 2,02 1,79 1,60 1,44 1,30 1,18 1,08 0,99 56 1,00 4,71 3,94 3,43 3,00 2,62 2,31 2,04 1,81 1,62 1,46 1,32 1,20 1,09 1,00 57 1,00 4,73 3,96 3,46 3,02 2,65 2,33 2,06 1,83 1,64 1,47 1,33 1,21 1,10 1,01 58 1,00 4,75 3,98 3,48 3,04 2,67 2,35 2,08 1,85 1,66 1,49 1,35 1,22 1,12 1,02 59 1,00 4,77 4,01 3,50 3,07 2,69 2,37 2,10 1,87 1,67 1,51 1,36 1,24 1,13 1,04 60 1,00 4,78 4,03 3,53 3,09 2,71 2,39 2,12 1,89 1,69 1,52 1,38 1,25 1,14 1,05 61 1,00 4,80 4,05 3,55 3,11 2,73 2,41 2,14 1,91 1,71 1,54 1,39 1,27 1,16 1,06 62 1,00 4,82 4,07 3,57 3,13 2,75 2,43 2,16 1,92 1,72 1,55 1,41 1,28 1,17 1,07 63 1,00 4,84 4,09 3,59 3,15 2,77 2,45 2,18 1,94 1,74 1,57 1,42 1,29 1,18 1,08 64 1,00 4,85 4,12 3,61 3,17 2,80 2,47 2,20 1,96 1,76 1,59 1,44 1,31 1,19 1,10 65 1,00 4,87 4,14 3,64 3,19 2,82 2,49 2,21 1,98 1,77 1,60 1,45 1,32 1,21 1,11 66 1,00 4,89 4,16 3,66 3,22 2,84 2,51 2,23 1,99 1,79 1,62 1,46 1,33 1,22 1,12 67 1,00 4,90 4,18 3,68 3,24 2,86 2,53 2,25 2,01 1,81 1,63 1,48 1,35 1,23 1,13 68 1,00 4,92 4,20 3,70 3,26 2,87 2,55 2,27 2,03 1,82 1,65 1,49 1,36 1,24 1,14 69 1,00 4,94 4,22 3,72 3,28 2,89 2,57 2,29 2,05 1,84 1,66 1,51 1,37 1,26 1,15 LK 4 9 16 25 36 49 64 81 100 121 144 169 196 225 256 70 1,00 4,95 4,24 3,74 3,29 2,91 2,58 2,30 2,06 1,85 1,68 1,52 1,39 1,27 1,16 71 1,00 4,97 4,25 3,76 3,31 2,93 2,60 2,32 2,08 1,87 1,69 1,53 1,40 1,28 1,18 72 1,00 4,98 4,27 3,77 3,33 2,95 2,62 2,34 2,09 1,89 1,70 1,55 1,41 1,29 1,19 73 1,00 5,00 4,29 3,79 3,35 2,97 2,64 2,36 2,11 1,90 1,72 1,56 1,42 1,30 1,20 74 1,00 5,01 4,31 3,81 3,37 2,99 2,66 2,37 2,13 1,92 1,73 1,57 1,44 1,32 1,21 75 1,00 5,03 4,33 3,83 3,39 3,00 2,67 2,39 2,14 1,93 1,75 1,59 1,45 1,33 1,22 76 1,00 5,04 4,35 3,85 3,41 3,02 2,69 2,40 2,16 1,95 1,76 1,60 1,46 1,34 1,23 77 1,00 5,05 4,36 3,87 3,42 3,04 2,71 2,42 2,17 1,96 1,77 1,61 1,47 1,35 1,24 78 1,00 5,07 4,38 3,88 3,44 3,06 2,72 2,44 2,19 1,97 1,79 1,63 1,49 1,36 1,25 79 1,00 5,08 4,40 3,90 3,46 3,07 2,74 2,45 2,20 1,99 1,80 1,64 1,50 1,37 1,26 80 1,00 5,10 4,42 3,92 3,48 3,09 2,76 2,47 2,22 2,00 1,82 1,65 1,51 1,38 1,27 81 1,00 5,11 4,43 3,93 3,49 3,11 2,77 2,48 2,23 2,02 1,83 1,66 1,52 1,40 1,28 82 1,00 5,12 4,45 3,95 3,51 3,12 2,79 2,50 2,25 2,03 1,84 1,68 1,53 1,41 1,29 83 1,00 5,14 4,46 3,97 3,53 3,14 2,81 2,52 2,26 2,05 1,86 1,69 1,54 1,42 1,31 84 1,00 5,15 4,48 3,98 3,54 3,16 2,82 2,53 2,28 2,06 1,87 1,70 1,56 1,43 1,32 85 1,00 5,16 4,50 4,00 3,56 3,17 2,84 2,55 2,29 2,07 1,88 1,71 1,57 1,44 1,33 86 1,00 5,17 4,51 4,02 3,57 3,19 2,85 2,56 2,31 2,09 1,89 1,73 1,58 1,45 1,34 87 1,00 5,19 4,53 4,03 3,59 3,20 2,87 2,58 2,32 2,10 1,91 1,74 1,59 1,46 1,35 88 1,00 5,20 4,54 4,05 3,61 3,22 2,88 2,59 2,34 2,11 1,92 1,75 1,60 1,47 1,36 89 1,00 5,21 4,56 4,06 3,62 3,23 2,90 2,60 2,35 2,13 1,93 1,76 1,61 1,48 1,37 90 1,00 5,22 4,57 4,08 3,64 3,25 2,91 2,62 2,36 2,14 1,95 1,77 1,62 1,49 1,38 91 1,00 5,23 4,59 4,09 3,65 3,26 2,93 2,63 2,38 2,15 1,96 1,79 1,64 1,50 1,39 92 1,00 5,25 4,60 4,11 3,67 3,28 2,94 2,65 2,39 2,17 1,97 1,80 1,65 1,51 1,40 LK 4 9 16 25 36 49 64 81 100 121 144 169 196 225 256 93 1,00 5,26 4,62 4,12 3,68 3,29 2,96 2,66 2,40 2,18 1,98 1,81 1,66 1,52 1,41 94 1,00 5,27 4,63 4,14 3,70 3,31 2,97 2,67 2,42 2,19 1,99 1,82 1,67 1,53 1,42 95 1,00 5,28 4,65 4,15 3,71 3,32 2,98 2,69 2,43 2,20 2,01 1,83 1,68 1,54 1,42 96 1,00 5,29 4,66 4,17 3,72 3,34 3,00 2,70 2,44 2,22 2,02 1,84 1,69 1,55 1,43 97 1,00 5,30 4,67 4,18 3,74 3,35 3,01 2,72 2,46 2,23 2,03 1,86 1,70 1,56 1,44 98 1,00 5,31 4,69 4,20 3,75 3,36 3,03 2,73 2,47 2,24 2,04 1,87 1,71 1,57 1,45 99 1,00 5,33 4,70 4,21 3,77 3,38 3,04 2,74 2,48 2,25 2,05 1,88 1,72 1,58 1,46 100 1,00 5,34 4,72 4,22 3,78 3,39 3,05 2,75 2,49 2,27 2,06 1,89 1,73 1,59 1,47 101 1,00 5,35 4,73 4,24 3,79 3,41 3,07 2,77 2,51 2,28 2,08 1,90 1,74 1,60 1,48 102 1,00 5,36 4,74 4,25 3,81 3,42 3,08 2,78 2,52 2,29 2,09 1,91 1,75 1,61 1,49 103 1,00 5,37 4,76 4,26 3,82 3,43 3,09 2,79 2,53 2,30 2,10 1,92 1,76 1,62 1,50 104 1,00 5,38 4,77 4,28 3,83 3,45 3,10 2,81 2,54 2,31 2,11 1,93 1,77 1,63 1,51 105 1,00 5,39 4,78 4,29 3,85 3,46 3,12 2,82 2,56 2,33 2,12 1,94 1,78 1,64 1,52 106 1,00 5,40 4,79 4,30 3,86 3,47 3,13 2,83 2,57 2,34 2,13 1,95 1,79 1,65 1,53 107 1,00 5,41 4,81 4,32 3,87 3,48 3,14 2,84 2,58 2,35 2,14 1,96 1,80 1,66 1,54 108 1,00 5,42 4,82 4,33 3,89 3,50 3,16 2,86 2,59 2,36 2,15 1,97 1,81 1,67 1,55 109 1,00 5,43 4,83 4,34 3,90 3,51 3,17 2,87 2,60 2,37 2,17 1,98 1,82 1,68 1,55 110 1,00 5,44 4,84 4,35 3,91 3,52 3,18 2,88 2,62 2,38 2,18 1,99 1,83 1,69 1,56 111 1,00 5,45 4,86 4,37 3,92 3,54 3,19 2,89 2,63 2,39 2,19 2,01 1,84 1,70 1,57 112 1,00 5,46 4,87 4,38 3,94 3,55 3,20 2,90 2,64 2,40 2,20 2,02 1,85 1,71 1,58 113 1,00 5,47 4,88 4,39 3,95 3,56 3,22 2,92 2,65 2,42 2,21 2,03 1,86 1,72 1,59 114 1,00 5,48 4,89 4,40 3,96 3,57 3,23 2,93 2,66 2,43 2,22 2,04 1,87 1,73 1,60 115 1,00 5,49 4,90 4,42 3,97 3,58 3,24 2,94 2,67 2,44 2,23 2,05 1,88 1,74 1,61 LK 4 9 16 25 36 49 64 81 100 121 144 169 196 225 256 116 1,00 5,50 4,92 4,43 3,99 3,60 3,25 2,95 2,68 2,45 2,24 2,06 1,89 1,75 1,62 117 1,00 5,51 4,93 4,44 4,00 3,61 3,26 2,96 2,69 2,46 2,25 2,07 1,90 1,76 1,62 118 1,00 5,52 4,94 4,45 4,01 3,62 3,28 2,97 2,71 2,47 2,26 2,08 1,91 1,76 1,63 119 1,00 5,52 4,95 4,46 4,02 3,63 3,29 2,98 2,72 2,48 2,27 2,09 1,92 1,77 1,64 120 1,00 5,53 4,96 4,47 4,03 3,64 3,30 3,00 2,73 2,49 2,28 2,10 1,93 1,78 1,65 121 1,00 5,54 4,97 4,49 4,04 3,65 3,31 3,01 2,74 2,50 2,29 2,10 1,94 1,79 1,66 122 1,00 5,55 4,98 4,50 4,06 3,67 3,32 3,02 2,75 2,51 2,30 2,11 1,95 1,80 1,67 123 1,00 5,56 4,99 4,51 4,07 3,68 3,33 3,03 2,76 2,52 2,31 2,12 1,96 1,81 1,68 124 1,00 5,57 5,01 4,52 4,08 3,69 3,34 3,04 2,77 2,53 2,32 2,13 1,97 1,82 1,68 125 1,00 5,58 5,02 4,53 4,09 3,70 3,35 3,05 2,78 2,54 2,33 2,14 1,98 1,83 1,69 126 1,00 5,59 5,03 4,54 4,10 3,71 3,37 3,06 2,79 2,55 2,34 2,15 1,98 1,83 1,70 127 1,00 5,60 5,04 4,55 4,11 3,72 3,38 3,07 2,80 2,56 2,35 2,16 1,99 1,84 1,71 128 1,00 5,60 5,05 4,56 4,12 3,73 3,39 3,08 2,81 2,57 2,36 2,17 2,00 1,85 1,72 129 1,00 5,61 5,06 4,57 4,13 3,74 3,40 3,09 2,82 2,58 2,37 2,18 2,01 1,86 1,72 130 1,00 5,62 5,07 4,58 4,14 3,75 3,41 3,10 2,83 2,59 2,38 2,19 2,02 1,87 1,73 131 1,00 5,63 5,08 4,59 4,15 3,76 3,42 3,11 2,84 2,60 2,39 2,20 2,03 1,88 1,74 132 1,00 5,64 5,09 4,60 4,16 3,77 3,43 3,12 2,85 2,61 2,40 2,21 2,04 1,89 1,75 133 1,00 5,65 5,10 4,62 4,17 3,78 3,44 3,13 2,86 2,62 2,41 2,22 2,05 1,89 1,76 134 1,00 5,65 5,11 4,63 4,19 3,79 3,45 3,14 2,87 2,63 2,42 2,23 2,05 1,90 1,76 135 1,00 5,66 5,12 4,64 4,20 3,81 3,46 3,15 2,88 2,64 2,43 2,23 2,06 1,91 1,77 136 1,00 5,67 5,13 4,65 4,21 3,82 3,47 3,16 2,89 2,65 2,44 2,24 2,07 1,92 1,78 137 1,00 5,68 5,14 4,66 4,22 3,83 3,48 3,17 2,90 2,66 2,44 2,25 2,08 1,93 1,79 138 1,00 5,69 5,15 4,67 4,23 3,84 3,49 3,18 2,91 2,67 2,45 2,26 2,09 1,93 1,80 145 LK 4 9 16 25 36 49 64 81 100 121 144 169 196 225 256 139 1,00 5,69 5,16 4,68 4,24 3,85 3,50 3,19 2,92 2,68 2,46 2,27 2,10 1,94 1,80 140 1,00 5,70 5,17 4,69 4,25 3,86 3,51 3,20 2,93 2,69 2,47 2,28 2,11 1,95 1,81 141 1,00 5,71 5,18 4,70 4,26 3,87 3,52 3,21 2,94 2,70 2,48 2,29 2,11 1,96 1,82 142 1,00 5,72 5,19 4,71 4,27 3,88 3,53 3,22 2,95 2,71 2,49 2,30 2,12 1,97 1,83 143 1,00 5,72 5,20 4,72 4,28 3,88 3,54 3,23 2,96 2,72 2,50 2,30 2,13 1,97 1,83 144 1,00 5,73 5,21 4,72 4,29 3,89 3,55 3,24 2,97 2,72 2,51 2,31 2,14 1,98 1,84 145 1,00 5,74 5,22 4,73 4,29 3,90 3,56 3,25 2,98 2,73 2,52 2,32 2,15 1,99 1,85 146 1,00 5,75 5,23 4,74 4,30 3,91 3,57 3,26 2,99 2,74 2,52 2,33 2,15 2,00 1,86 147 1,00 5,75 5,24 4,75 4,31 3,92 3,58 3,27 3,00 2,75 2,53 2,34 2,16 2,01 1,86 148 1,00 5,76 5,24 4,76 4,32 3,93 3,59 3,28 3,00 2,76 2,54 2,35 2,17 2,01 1,87 149 1,00 5,77 5,25 4,77 4,33 3,94 3,60 3,29 3,01 2,77 2,55 2,35 2,18 2,02 1,88 150 1,00 5,78 5,26 4,78 4,34 3,95 3,60 3,30 3,02 2,78 2,56 2,36 2,19 2,03 1,89 151 1,00 5,78 5,27 4,79 4,35 3,96 3,61 3,31 3,03 2,79 2,57 2,37 2,19 2,04 1,89 152 1,00 5,79 5,28 4,80 4,36 3,97 3,62 3,32 3,04 2,80 2,58 2,38 2,20 2,04 1,90 153 1,00 5,80 5,29 4,81 4,37 3,98 3,63 3,32 3,05 2,80 2,58 2,39 2,21 2,05 1,91 154 1,00 5,80 5,30 4,82 4,38 3,99 3,64 3,33 3,06 2,81 2,59 2,40 2,22 2,06 1,91 155 1,00 5,81 5,31 4,83 4,39 4,00 3,65 3,34 3,07 2,82 2,60 2,40 2,23 2,07 1,92 156 1,00 5,82 5,32 4,84 4,40 4,01 3,66 3,35 3,08 2,83 2,61 2,41 2,23 2,07 1,93 157 1,00 5,82 5,32 4,84 4,41 4,01 3,67 3,36 3,08 2,84 2,62 2,42 2,24 2,08 1,94 158 1,00 5,83 5,33 4,85 4,41 4,02 3,68 3,37 3,09 2,85 2,63 2,43 2,25 2,09 1,94 159 1,00 5,84 5,34 4,86 4,42 4,03 3,69 3,38 3,10 2,85 2,63 2,44 2,26 2,10 1,95 160 1,00 5,85 5,35 4,87 4,43 4,04 3,69 3,39 3,11 2,86 2,64 2,44 2,26 2,10 1,96 161 1,00 5,85 5,36 4,88 4,44 4,05 3,70 3,39 3,12 2,87 2,65 2,45 2,27 2,11 1,96 LK 4 9 16 25 36 49 64 81 100 121 144 169 196 225 256 162 1,00 5,86 5,37 4,89 4,45 4,06 3,71 3,40 3,13 2,88 2,66 2,46 2,28 2,12 1,97 163 1,00 5,87 5,37 4,90 4,46 4,07 3,72 3,41 3,13 2,89 2,67 2,47 2,29 2,12 1,98 164 1,00 5,87 5,38 4,90 4,47 4,08 3,73 3,42 3,14 2,90 2,67 2,47 2,29 2,13 1,99 165 1,00 5,88 5,39 4,91 4,47 4,08 3,74 3,43 3,15 2,90 2,68 2,48 2,30 2,14 1,99 166 1,00 5,89 5,40 4,92 4,48 4,09 3,75 3,44 3,16 2,91 2,69 2,49 2,31 2,15 2,00 167 1,00 5,89 5,41 4,93 4,49 4,10 3,75 3,44 3,17 2,92 2,70 2,50 2,32 2,15 2,01 168 1,00 5,90 5,42 4,94 4,50 4,11 3,76 3,45 3,18 2,93 2,70 2,50 2,32 2,16 2,01 169 1,00 5,90 5,42 4,95 4,51 4,12 3,77 3,46 3,18 2,94 2,71 2,51 2,33 2,17 2,02 170 1,00 5,91 5,43 4,95 4,52 4,13 3,78 3,47 3,19 2,94 2,72 2,52 2,34 2,17 2,03 171 1,00 5,92 5,44 4,96 4,52 4,13 3,79 3,48 3,20 2,95 2,73 2,53 2,35 2,18 2,03 172 1,00 5,92 5,45 4,97 4,53 4,14 3,79 3,48 3,21 2,96 2,74 2,53 2,35 2,19 2,04 173 1,00 5,93 5,46 4,98 4,54 4,15 3,80 3,49 3,22 2,97 2,74 2,54 2,36 2,20 2,05 174 1,00 5,94 5,46 4,99 4,55 4,16 3,81 3,50 3,22 2,97 2,75 2,55 2,37 2,20 2,05 175 1,00 5,94 5,47 4,99 4,56 4,17 3,82 3,51 3,23 2,98 2,76 2,56 2,37 2,21 2,06 176 1,00 5,95 5,48 5,00 4,56 4,17 3,83 3,52 3,24 2,99 2,77 2,56 2,38 2,22 2,07 177 1,00 5,95 5,49 5,01 4,57 4,18 3,83 3,52 3,25 3,00 2,77 2,57 2,39 2,22 2,07 178 1,00 5,96 5,49 5,02 4,58 4,19 3,84 3,53 3,25 3,00 2,78 2,58 2,39 2,23 2,08 179 1,00 5,97 5,50 5,03 4,59 4,20 3,85 3,54 3,26 3,01 2,79 2,59 2,40 2,24 2,09 180 1,00 5,97 5,51 5,03 4,60 4,21 3,86 3,55 3,27 3,02 2,80 2,59 2,41 2,24 2,09 181 1,00 5,98 5,52 5,04 4,60 4,21 3,87 3,56 3,28 3,03 2,80 2,60 2,42 2,25 2,10 182 1,00 5,98 5,52 5,05 4,61 4,22 3,87 3,56 3,28 3,03 2,81 2,61 2,42 2,26 2,11 183 1,00 5,99 5,53 5,06 4,62 4,23 3,88 3,57 3,29 3,04 2,82 2,61 2,43 2,26 2,11 184 1,00 6,00 5,54 5,06 4,63 4,24 3,89 3,58 3,30 3,05 2,82 2,62 2,44 2,27 2,12 LK 4 9 16 25 36 49 64 81 100 121 144 169 196 225 256 185 1,00 6,00 5,55 5,07 4,63 4,24 3,90 3,59 3,31 3,06 2,83 2,63 2,44 2,28 2,12 186 1,00 6,01 5,55 5,08 4,64 4,25 3,90 3,59 3,31 3,06 2,84 2,63 2,45 2,28 2,13 187 1,00 6,01 5,56 5,09 4,65 4,26 3,91 3,60 3,32 3,07 2,85 2,64 2,46 2,29 2,14 188 1,00 6,02 5,57 5,09 4,66 4,27 3,92 3,61 3,33 3,08 2,85 2,65 2,46 2,30 2,14 189 1,00 6,03 5,57 5,10 4,66 4,27 3,93 3,61 3,34 3,09 2,86 2,65 2,47 2,30 2,15 190 1,00 6,03 5,58 5,11 4,67 4,28 3,93 3,62 3,34 3,09 2,87 2,66 2,48 2,31 2,16 191 1,00 6,04 5,59 5,11 4,68 4,29 3,94 3,63 3,35 3,10 2,87 2,67 2,48 2,31 2,16 192 1,00 6,04 5,60 5,12 4,69 4,30 3,95 3,64 3,36 3,11 2,88 2,68 2,49 2,32 2,17 193 1,00 6,05 5,60 5,13 4,69 4,30 3,95 3,64 3,36 3,11 2,89 2,68 2,50 2,33 2,17 194 1,00 6,05 5,61 5,14 4,70 4,31 3,96 3,65 3,37 3,12 2,89 2,69 2,50 2,33 2,18 195 1,00 6,06 5,62 5,14 4,71 4,32 3,97 3,66 3,38 3,13 2,90 2,70 2,51 2,34 2,19 196 1,00 6,06 5,62 5,15 4,71 4,32 3,98 3,67 3,39 3,13 2,91 2,70 2,52 2,35 2,19 197 1,00 6,07 5,63 5,16 4,72 4,33 3,98 3,67 3,39 3,14 2,91 2,71 2,52 2,35 2,20 198 1,00 6,08 5,64 5,16 4,73 4,34 3,99 3,68 3,40 3,15 2,92 2,72 2,53 2,36 2,20 199 1,00 6,08 5,64 5,17 4,74 4,35 4,00 3,69 3,41 3,16 2,93 2,72 2,53 2,37 2,21 200 1,00 6,09 5,65 5,18 4,74 4,35 4,00 3,69 3,41 3,16 2,93 2,73 2,54 2,37 2,22 201 1,00 6,09 5,66 5,19 4,75 4,36 4,01 3,70 3,42 3,17 2,94 2,73 2,55 2,38 2,22 202 1,00 6,10 5,66 5,19 4,76 4,37 4,02 3,71 3,43 3,18 2,95 2,74 2,55 2,38 2,23 203 1,00 6,10 5,67 5,20 4,76 4,37 4,03 3,71 3,43 3,18 2,95 2,75 2,56 2,39 2,23 204 1,00 6,11 5,68 5,21 4,77 4,38 4,03 3,72 3,44 3,19 2,96 2,75 2,57 2,40 2,24 205 1,00 6,11 5,68 5,21 4,78 4,39 4,04 3,73 3,45 3,20 2,97 2,76 2,57 2,40 2,25 206 1,00 6,12 5,69 5,22 4,78 4,39 4,05 3,73 3,45 3,20 2,97 2,77 2,58 2,41 2,25 207 1,00 6,12 5,70 5,23 4,79 4,40 4,05 3,74 3,46 3,21 2,98 2,77 2,59 2,41 2,26 LK 4 9 16 25 36 49 64 81 100 121 144 169 196 225 256 208 1,00 6,13 5,70 5,23 4,80 4,41 4,06 3,75 3,47 3,22 2,99 2,78 2,59 2,42 2,26 209 1,00 6,13 5,71 5,24 4,80 4,41 4,07 3,75 3,47 3,22 2,99 2,79 2,60 2,43 2,27 210 1,00 6,14 5,72 5,25 4,81 4,42 4,07 3,76 3,48 3,23 3,00 2,79 2,60 2,43 2,28 211 1,00 6,14 5,72 5,25 4,82 4,43 4,08 3,77 3,49 3,23 3,01 2,80 2,61 2,44 2,28 212 1,00 6,15 5,73 5,26 4,82 4,43 4,09 3,77 3,49 3,24 3,01 2,80 2,62 2,44 2,29 213 1,00 6,15 5,74 5,27 4,83 4,44 4,09 3,78 3,50 3,25 3,02 2,81 2,62 2,45 2,29 214 1,00 6,16 5,74 5,27 4,84 4,45 4,10 3,79 3,51 3,25 3,02 2,82 2,63 2,46 2,30 215 1,00 6,16 5,75 5,28 4,84 4,45 4,11 3,79 3,51 3,26 3,03 2,82 2,63 2,46 2,30 216 1,00 6,17 5,76 5,28 4,85 4,46 4,11 3,80 3,52 3,27 3,04 2,83 2,64 2,47 2,31 217 1,00 6,17 5,76 5,29 4,86 4,47 4,12 3,81 3,53 3,27 3,04 2,84 2,65 2,47 2,32 218 1,00 6,18 5,77 5,30 4,86 4,47 4,13 3,81 3,53 3,28 3,05 2,84 2,65 2,48 2,32 219 1,00 6,18 5,77 5,30 4,87 4,48 4,13 3,82 3,54 3,29 3,06 2,85 2,66 2,48 2,33 220 1,00 6,19 5,78 5,31 4,88 4,49 4,14 3,83 3,55 3,29 3,06 2,85 2,66 2,49 2,33 221 1,00 6,19 5,79 5,32 4,88 4,49 4,14 3,83 3,55 3,30 3,07 2,86 2,67 2,50 2,34 222 1,00 6,20 5,79 5,32 4,89 4,50 4,15 3,84 3,56 3,30 3,07 2,87 2,68 2,50 2,34 223 1,00 6,20 5,80 5,33 4,89 4,51 4,16 3,85 3,56 3,31 3,08 2,87 2,68 2,51 2,35 224 1,00 6,21 5,80 5,33 4,90 4,51 4,16 3,85 3,57 3,32 3,09 2,88 2,69 2,51 2,35 225 1,00 6,21 5,81 5,34 4,91 4,52 4,17 3,86 3,58 3,32 3,09 2,88 2,69 2,52 2,36 226 1,00 6,22 5,82 5,35 4,91 4,52 4,18 3,86 3,58 3,33 3,10 2,89 2,70 2,52 2,37 227 1,00 6,22 5,82 5,35 4,92 4,53 4,18 3,87 3,59 3,33 3,10 2,89 2,70 2,53 2,37 228 1,00 6,23 5,83 5,36 4,93 4,54 4,19 3,88 3,59 3,34 3,11 2,90 2,71 2,54 2,38 229 1,00 6,23 5,83 5,37 4,93 4,54 4,19 3,88 3,60 3,35 3,12 2,91 2,72 2,54 2,38 230 1,00 6,24 5,84 5,37 4,94 4,55 4,20 3,89 3,61 3,35 3,12 2,91 2,72 2,55 2,39 LK 4 9 16 25 36 49 64 81 100 121 144 169 196 225 256 231 1,00 6,24 5,85 5,38 4,94 4,55 4,21 3,89 3,61 3,36 3,13 2,92 2,73 2,55 2,39 232 1,00 6,25 5,85 5,38 4,95 4,56 4,21 3,90 3,62 3,36 3,13 2,92 2,73 2,56 2,40 233 1,00 6,25 5,86 5,39 4,96 4,57 4,22 3,91 3,63 3,37 3,14 2,93 2,74 2,56 2,40 234 1,00 6,26 5,86 5,40 4,96 4,57 4,22 3,91 3,63 3,38 3,15 2,94 2,74 2,57 2,41 235 1,00 6,26 5,87 5,40 4,97 4,58 4,23 3,92 3,64 3,38 3,15 2,94 2,75 2,57 2,41 236 1,00 6,27 5,87 5,41 4,97 4,58 4,24 3,92 3,64 3,39 3,16 2,95 2,75 2,58 2,42 237 1,00 6,27 5,88 5,41 4,98 4,59 4,24 3,93 3,65 3,39 3,16 2,95 2,76 2,58 2,42 238 1,00 6,27 5,89 5,42 4,99 4,60 4,25 3,94 3,65 3,40 3,17 2,96 2,77 2,59 2,43 239 1,00 6,28 5,89 5,42 4,99 4,60 4,25 3,94 3,66 3,41 3,17 2,96 2,77 2,60 2,43 240 1,00 6,28 5,90 5,43 5,00 4,61 4,26 3,95 3,67 3,41 3,18 2,97 2,78 2,60 2,44 241 1,00 6,29 5,90 5,44 5,00 4,61 4,27 3,95 3,67 3,42 3,19 2,97 2,78 2,61 2,45 242 1,00 6,29 5,91 5,44 5,01 4,62 4,27 3,96 3,68 3,42 3,19 2,98 2,79 2,61 2,45 243 1,00 6,30 5,91 5,45 5,01 4,63 4,28 3,97 3,68 3,43 3,20 2,99 2,79 2,62 2,46 244 1,00 6,30 5,92 5,45 5,02 4,63 4,28 3,97 3,69 3,43 3,20 2,99 2,80 2,62 2,46 245 1,00 6,31 5,93 5,46 5,03 4,64 4,29 3,98 3,69 3,44 3,21 3,00 2,80 2,63 2,47 246 1,00 6,31 5,93 5,46 5,03 4,64 4,29 3,98 3,70 3,45 3,21 3,00 2,81 2,63 2,47 247 1,00 6,32 5,94 5,47 5,04 4,65 4,30 3,99 3,71 3,45 3,22 3,01 2,81 2,64 2,48 248 1,00 6,32 5,94 5,48 5,04 4,65 4,31 3,99 3,71 3,46 3,22 3,01 2,82 2,64 2,48 249 1,00 6,32 5,95 5,48 5,05 4,66 4,31 4,00 3,72 3,46 3,23 3,02 2,83 2,65 2,49 250 1,00 6,33 5,95 5,49 5,05 4,67 4,32 4,00 3,72 3,47 3,24 3,02 2,83 2,65 2,49 251 1,00 6,33 5,96 5,49 5,06 4,67 4,32 4,01 3,73 3,47 3,24 3,03 2,84 2,66 2,50 252 1,00 6,34 5,96 5,50 5,07 4,68 4,33 4,02 3,73 3,48 3,25 3,03 2,84 2,66 2,50 253 1,00 6,34 5,97 5,50 5,07 4,68 4,33 4,02 3,74 3,48 3,25 3,04 2,85 2,67 2,51 146 Dodatek 3 Pliki źródłowe realizacji modułu kwantyzatora Dodatek 3.1 Blok PRZESUNIECIE --- File: shift.vhd -library IEEE; use IEEE.std_logic_1164.all; use IEEE.std_LOGIC_arith.all; entity shift is generic( DATA_WIDTH: integer ); port ( DATAIN: in UNSIGNED(DATA_WIDTH-1 downto 0); SHIFTVAL: in UNSIGNED(DATA_WIDTH-1 downto 0); FRMIN: in STD_LOGIC; DATAOUT: out UNSIGNED(DATA_WIDTH-1 downto 0); FRMOUT: out STD_LOGIC; CLK: in STD_LOGIC; RESET: in STD_LOGIC ); end shift; architecture shift_arch of shift is begin shift: process begin reset_loop:loop wait until clk'event and clk='1'; if ( reset='1') then exit reset_loop; end if; main_loop:loop DATAOUT<=DATAIN+SHIFTVAL; FRMOUT<=FRMIN; wait until clk'event and clk='1'; if ( reset='1') then exit reset_loop; end if; end loop main_loop; end loop reset_loop; end process shift; end shift_arch; 147 Dodatek 3.2 Blok MODUL --- File: Quarter.vhd -- Author: Pawel Russek -- Date: 9.04.2001 -- Modified: 11.06.2001 -- Plik konweruje wektor wejsciowy do I cwiartki ukl. wsp. i wyprowadza informacje -- o wlasciwej cwiartce dla tego wektora -library IEEE; use IEEE.std_logic_1164.all; use IEEE.std_logic_arith.all; package quarterpackage is function CONV_UNSIGNED(ARG: STD_LOGIC_VECTOR; SIZE: INTEGER ) return UNSIGNED; end quarterpackage; package body quarterpackage is function CONV_UNSIGNED(ARG: STD_LOGIC_VECTOR; SIZE: INTEGER ) return UNSIGNED is variable result: UNSIGNED (SIZE-1 downto 0); begin for i in 0 to SIZE-1 loop result(i) := ARG(i); end loop; return result; end; end quarterpackage; entity Quarter is generic ( DATA_WIDTH : integer:=8; L_VALUE : integer:=3; K_VALUE : integer:=4 ); port ( DATAIN: in SIGNED ( DATA_WIDTH-1 downto 0); DATAOUT: out UNSIGNED ( DATA_WIDTH-1 downto 0); SHIFTIN: in UNSIGNED ( DATA_WIDTH-1 downto 0); SHIFTOUT: out UNSIGNED ( DATA_WIDTH-1 downto 0); CLK: in STD_LOGIC; RESET: in STD_LOGIC; FRM: in STD_LOGIC; --poczatek nowego wektora FRMOUT: out STD_LOGIC; SIGN: out STD_LOGIC ); end Quarter; architecture Quarter_arch of Quarter is 148 signal sig: std_logic; signal moddatain: SIGNED( DATA_WIDTH-1 downto 0); signal shiftvalreg: UNSIGNED(DATA_WIDTH-1 downto 0); begin shift: process begin reset_loop:loop wait until clk'event and clk='1'; if ( reset='1') then exit reset_loop; end if; main_loop:loop shiftvalreg<=shiftin; shiftout<=shiftvalreg; dataout<=CONV_UNSIGNED(moddatain,DATA_WIDTH); wait until clk'event and clk='1'; if ( reset='1') then exit reset_loop; end if; end loop main_loop; end loop reset_loop; end process shift; signproc: process ( datain ) begin if ( datain>=CONV_UNSIGNED(0,DATA_WIDTH ) ) then moddatain<=datain; sig<='0'; else moddatain<=0-datain; sig<='1'; end if; end process signproc; signshift: process begin reset_loop:loop wait until clk'event and clk='1'; if ( reset='1') then exit reset_loop; end if; main_loop:loop sign<=sig; if ( FRM='1' ) then FRMOUT<='1'; else FRMOUT<='0'; end if; wait until clk'event and clk='1'; if ( reset='1') then exit reset_loop; end if; end loop main_loop; end loop reset_loop; end process signshift; end Quarter_arch; 149 Dodatek 3.3 Blok NORMA1 --- File: modsum.vhd -- Author: Pawel Russek -- Date: 9.04.2001 -- Modified: 11.06.2001 -- Uklad oblicza dlugosc wektora ( Norm1 ) o dlugosci 16 -library IEEE; use IEEE.std_logic_1164.all; use IEEE.std_logic_arith.all; entity modsum is generic ( DATA_WIDTH : integer:=8; MODSUM_WIDTH : integer:=10; L_VALUE : integer:=3 ); port ( DATAIN: in UNSIGNED (DATA_WIDTH-1 downto 0); --wspolczynniki wejsciowe DATAOUT: out UNSIGNED (DATA_WIDTH-1 downto 0); --wspolczynniki wejsciowe wraz z suma MODSUM: out UNSIGNED (MODSUM_WIDTH-1 downto 0); --dlugosc wektora pojawia sie na tyjsciu o 16 taktów CLK: in STD_LOGIC; RESET: in STD_LOGIC; FRM: in STD_LOGIC; --flaga - na wejsciu pojawia sie 1 wsp. nowego wektora FRMOUT: out STD_LOGIC ); end modsum; architecture modsum_arch of modsum is type dataregistertype is array (0 to L_VALUE-1) of UNSIGNED( DATA_WIDTH-1 downto 0); signal datareg: dataregistertype; signal modsumreg: UNSIGNED ( MODSUM_WIDTH-1 downto 0); begin shift: process begin reset_loop:loop wait until clk'event and clk='1'; if ( reset='1') then exit reset_loop; end if; main_loop:loop datareg(0)<=datain; shift_reg_loop:for I in 0 to L_VALUE-2 loop datareg(I+1)<=datareg(i); end loop; dataout<=datareg(L_VALUE-1); FRMOUT<=FRM; wait until clk'event and clk='1'; if ( reset='1') then exit reset_loop; end if; end loop main_loop; end loop reset_loop; 150 end process shift; add: process begin reset_loop:loop wait until clk'event and clk='1'; if ( reset='1') then exit reset_loop; end if; main_loop:loop if FRM='1' then modsum<=modsumreg; modsumreg(DATA_WIDTH-1 downto 0)<=datain; modsumreg(MODSUM_WIDTH-1 downto DATA_WIDTH ) <=CONV_UNSIGNED(0,MODSUM_WIDTH-DATA_WIDTH);--(others=>'0'); else modsumreg<=modsumreg+datain; end if; wait until clk'event and clk='1'; if ( reset='1') then exit reset_loop; end if; end loop main_loop; end loop reset_loop; end process add; end modsum_arch; Dodatek 3.4 Blok MNOZENIE --- File: cvalmul.vhd -library IEEE; use IEEE.std_logic_1164.all; use IEEE.std_logic_arith.all; entity cvalmul is generic( M_W: integer:=10; --MODSUM_WIDTH D_W:integer:=8; --DATA_WIDTH MV_W: integer:=4; --MULVAL_WIDTH MUL_VAL:integer:=9; NBROFONES:integer:=2 ); port ( DATAIN: in UNSIGNED( D_W-1 downto 0); MODSUMIN: in UNSIGNED ( M_W-1 downto 0); FRMIN: in STD_LOGIC; DATAOUT: out UNSIGNED ( D_W+MV_W-1 downto 0); MODSUMOUT: out UNSIGNED ( M_W-1 downto 0); FRMOUT: out STD_LOGIC; CLK: in STD_LOGIC; RESET: in STD_LOGIC ); 151 end cvalmul; architecture cvalmul_arch of cvalmul is type mulregtype is array ( NBROFONES-1 downto 0 ) of UNSIGNED (D_W+MV_W-1 downto 0); signal mulreg: mulregtype; type dataregtype is array ( NBROFONES-1 downto 0 ) of UNSIGNED (D_W-1 downto 0); signal datareg: dataregtype; signal framereg: STD_LOGIC_VECTOR( NBROFONES-1 downto 0 ); type modregtype is array ( NBROFONES-1 downto 0 ) of UNSIGNED (M_W-1 downto 0); signal modreg: modregtype; --funkcja zwraca indeks jedynki wystepujacej jako NUMBER w kolejnosci function GETONEINDEX(VAL: INTEGER; VAL_WIDTH:INTEGER; NUMBER: INTEGER) return INTEGER is variable TEMP: INTEGER; variable UVAL: UNSIGNED( VAL_WIDTH-1 downto 0); begin UVAL:=CONV_UNSIGNED( VAL, VAL_WIDTH); TEMP:=0; for I in 0 to VAL_WIDTH-1 loop if ( UVAL(I)='1' ) then TEMP:=TEMP+1; end if; if ( temp=NUMBER ) then return I; end if; end loop; return VAL_WIDTH-1; end; begin main: process variable ONEINDEX: integer; begin reset_loop:loop wait until clk'event and clk='1'; if ( reset='1') then exit reset_loop; end if; main_loop:loop for I in 0 to NBROFONES-1 loop ONEINDEX:=GETONEINDEX(MUL_VAL, MV_W, I+1); if ( I=0 ) then framereg(I)<=frmin; datareg(I)<=datain; modreg(I)<=modsumin; mulreg(I)( MV_W+D_W-1 downto ONEINDEX+D_W) <=CONV_UNSIGNED(0, MV_W-ONEINDEX); mulreg(I)( ONEINDEX+D_W-1 downto GETONEINDEX(MUL_VAL,MV_W, I+1) )<=datain; if ( NOT (ONEINDEX=0 ) ) then mulreg(I)( ONEINDEX-1 downto 0 )<=CONV_UNSIGNED(0, ONEINDEX); end if; end if; if ( NOT (I=0) ) then framereg(I)<=framereg(I-1); datareg(I)<=datareg(I-1); modreg(I)<=modreg(I-1); mulreg(I)( ONEINDEX-1 downto 0 152 )<=mulreg(I-1)( ONEINDEX-1 downto 0 ); mulreg(I)( D_W+MV_W-1 downto ONEINDEX ) <=mulreg(I-1)( D_W+MV_W-1 downto ONEINDEX )+datareg(I-1); end if; dataout<=mulreg(NBROFONES-1); frmout<=framereg(NBROFONES-1); modsumout<=modreg(NBROFONES-1); end loop; wait until clk'event and clk='1'; if ( reset='1') then exit reset_loop; end if; end loop main_loop; end loop reset_loop; end process main; end cvalmul_arch; Dodatek 3.5 Blok DZIELENIE --File: scale.vhd --Author: pr --Date: 10.04.2001 --Modified: 11.06.2001 --Plik implementujacy przeskalowanie wspolczynnikow wejsciowych --na powierzchnie piramidy o promieniu K=256. Mnozy przez 256 --i dzieli przez dana SCALEFACTOR. Dzielenie zajmuje 8 taktów --zegara ( w wyniku dzielenia otrzymujemy 8 bitiwa wartosc ). Mnozenie ~1 takt. --Wyniki pojawiaja sie na wyjsciu z opoznieniem 25 taktow zegara. --Dzielenie oparte na metodzie "pen and paper" patrz div2.vhd library IEEE; use IEEE.std_logic_1164.all; use IEEE.std_logic_arith.all; entity scale is generic ( MODSUM_WIDTH: integer:=10; DATA_WIDTH: integer:=8; L_VALUE: integer:=3; K_VALUE: integer:=4; K_VAL_LOG2: integer:=3 ); port ( DATAIN: in UNSIGNED (K_VAL_LOG2+DATA_WIDTH-1 downto 0); FRM: in STD_LOGIC; CLK: in STD_LOGIC; RESET: in STD_LOGIC; SCALEFACTOR: in UNSIGNED (MODSUM_WIDTH-1 downto 0); DATAOUT: out UNSIGNED (K_VAL_LOG2-1 downto 0); ERROR: out UNSIGNED (K_VAL_LOG2+DATA_WIDTH-1 downto 0); FRMOUT: out STD_LOGIC --lamanie danych na wektory ); end scale; 153 architecture scale_arch of scale is type quonientregistertype is array ( K_VAL_LOG2-1 downto 0 ) of unsigned ( K_VAL_LOG2-1 downto 0 ); type reminderregistertype is array ( K_VAL_LOG2-1 downto 0 ) of unsigned ( K_VAL_LOG2+MODSUM_wIDTH-1 downto 0 ); type divisorregistertype is array ( K_VAL_LOG2-1 downto 0 ) of unsigned ( K_VAL_LOG2+MODSUM_wIDTH-1 downto 0 ); signal remainders : reminderregistertype; signal quonients : quonientregistertype; signal divisors : divisorregistertype; signal framereg: STD_LOGIC_VECTOR( K_VAL_LOG2-1 downto 0 ); --sygnal ramki opozniamy begin --architecture main: process begin --process reset_loop: loop zeroing_variables: for l in 0 to K_VAL_LOG2-1 loop divisors(l)<=(others=>'0'); quonients(l)<=(others=>'0'); remainders(l)<=(others=>'0'); end loop zeroing_variables; wait until clk'event and clk='1'; if ( reset='1' ) then exit reset_loop; end if; main_loop: loop remainders(0)(K_VAL_LOG2+DATA_WIDTH-1 downto 0)<=datain; -- divident * 256; remainders(0)(MODSUM_WIDTH+K_VAL_LOG2-1 downto K_VAL_LOG2+DATA_WIDTH)<=CONV_UNSIGNED(0,MODSUM_WIDTH-DATA_WIDTH); divisors(0)(MODSUM_WIDTH+K_VAL_LOG2-2 downto K_VAL_LOG2-1 )<=scalefactor; --divisor; divisors(0)(MODSUM_WIDTH+K_VAL_LOG2-1)<='0'; divisors(1)(MODSUM_WIDTH+K_VAL_LOG2-3 downto K_VAL_LOG2-2)<=divisors(0) (MODSUM_WIDTH+K_VAL_LOG2-2 downto K_VAL_LOG2-1); --shift right divisors(1)(MODSUM_WIDTH+K_VAL_LOG2-1 downto MODSUM_WIDTH+K_VAL_LOG2-2) <="00"; quonients(1)(K_VAL_LOG2-2 downto 0)<=quonients(0)(K_VAL_LOG2-2 downto 0); if (divisors(0)<=remainders(0)) then quonients(1)(K_VAL_LOG2-1)<='1'; remainders(1)<=remainders(0)-divisors(0)(K_VAL_LOG2+MODSUM_WIDTH-1 downto 0); else quonients(1)(K_VAL_LOG2-1)<='0'; remainders(1)<=remainders(0); end if; -- div_for_loop: for i in 2 to K_VAL_LOG2-1 loop divisors(i)(K_VAL_LOG2+MODSUM_wIDTH-2-i downto K_VAL_LOG2-1-i)<=divisors(i-1) (K_VAL_LOG2+MODSUM_wIDTH-1-i downto K_VAL_LOG2-i); --shift right divisors(i)(K_VAL_LOG2+MODSUM_wIDTH-i downto K_VAL_LOG2+MODSUM_WIDTH-1-i) <="00"; quonients(i)(K_VAL_LOG2-1 downto K_VAL_LOG2-1+2-i)<=quonients(i-1) (K_VAL_LOG2-1 downto K_VAL_LOG2-1+2-i); quonients(i)(K_VAL_LOG2-1-i downto 0)<=quonients(i-1)(K_VAL_LOG2-1-i downto 0); if ( divisors(i-1)<=remainders(i-1) ) then quonients(i)(K_VAL_LOG2-i)<='1'; remainders(i)<=remainders(i-1)-divisors(i-1) (K_VAL_LOG2+MODSUM_WIDTH-1 downto 0); else quonients(i)(K_VAL_LOG2-i)<='0'; 154 remainders(i)<=remainders(i-1); end if; end loop div_for_loop; dataout(K_VAL_LOG2-1 downto 1)<=quonients(K_VAL_LOG2-1)(K_VAL_LOG2-1 downto 1) if ( divisors(K_VAL_LOG2-1)<=remainders(K_VAL_LOG2-1) ) then dataout(0)<='1'; error<=remainders(K_VAL_LOG2-1)(K_VAL_LOG2+DATA_WIDTH-1 downto 0)divisors(K_VAL_LOG2-1)(K_VAL_LOG2+DATA_WIDTH-1 downto 0); --remainder else dataout(0)<='0'; error<=remainders(K_VAL_LOG2-1)(K_VAL_LOG2+DATA_WIDTH-1 downto 0); end if; wait until clk'event and clk='1'; if ( reset='1' ) then exit reset_loop; end if; end loop main_loop; end loop reset_loop; end process main; shift: process begin reset_loop:loop wait until clk'event and clk='1'; if ( reset='1') then exit reset_loop; end if; main_loop:loop framereg(0)<=frm; shift_reg_loop:for i in 0 to K_VAL_LOG2-2 loop framereg(i+1)<=framereg(i); end loop; frmout<=framereg(K_VAL_LOG2-1); wait until clk'event and clk='1'; if ( reset='1') then exit reset_loop; end if; end loop main_loop; end loop reset_loop; end process shift; end scale_arch; Dodatek 3.6 Blok NORMA2 --File: modsumchk.vhd --Author: pr --Date: 13.04.2001 --Modified: 12.06.2001 --Modul oblicza dlugosc uzyskanego wektora i porownuje go z dlugoscia jaka powinna --byc uzyskana na powierzchni piramidy. Otrzymana wartosc wystawia na DIFF. -library IEEE; use IEEE.std_logic_1164.all; use IEEE.std_logic_arith.all; entity modsumchk is generic ( K_VAL_LOG2: integer:=4; 155 L_VAL_LOG2: integer:=3; L_VALUE: integer:=4; K_VALUE: integer:=8 ); port ( DATAIN: in UNSIGNED (K_VAL_LOG2-1 downto 0); DATAOUT: out UNSIGNED (K_VAL_LOG2-1 downto 0); DIFF: out SIGNED (L_VAL_LOG2 downto 0); --od -<ilosac pixeli do <ilosc pikseli> CLK: in STD_LOGIC; RESET: in STD_LOGIC; FRMOUT: out STD_LOGIC; FRM: in STD_LOGIC ); end modsumchk; architecture modsumchk_arch of modsumchk is type dataregistertype is array (0 to L_VALUE-1) of UNSIGNED( K_VAL_LOG2-1 downto 0); signal datareg: dataregistertype; signal modsumreg: UNSIGNED ( K_VAL_LOG2+L_VAL_LOG2-1 downto 0); begin shift: process begin reset_loop:loop wait until clk'event and clk='1'; if ( reset='1') then exit reset_loop; end if; main_loop:loop datareg(0)<=datain; shift_reg_loop:for I in 0 to L_VALUE-2 loop datareg(I+1)<=datareg(i); end loop; dataout<=datareg(L_VALUE-1); FRMOUT<=FRM; wait until clk'event and clk='1'; if ( reset='1') then exit reset_loop; end if; end loop main_loop; end loop reset_loop; end process shift; add: process variable DIFFVAR : SIGNED ( K_VAL_LOG2+L_VAL_LOG2 downto 0 ); begin reset_loop:loop wait until clk'event and clk='1'; if ( reset='1') then exit reset_loop; end if; main_loop:loop if FRM='1' then DIFFVAR:=modsumreg-CONV_SIGNED(K_VALUE,K_VAL_LOG2+L_VAL_LOG2); DIFF(L_VAL_LOG2)<=DIFFVAR(K_VAL_LOG2+L_VAL_LOG2-1); DIFF( L_VAL_LOG2-1 downto 0 )<=DIFFVAR( L_VAL_LOG2-1 downto 0); modsumreg(K_VAL_LOG2-1 downto 0)<=datain; 156 modsumreg(K_VAL_LOG2+L_VAL_LOG2-1 downto K_VAL_LOG2)<=CONV_UNSIGNED(0,L_VAL_LOG2); else modsumreg<=modsumreg+datain; end if; wait until clk'event and clk='1'; if ( reset='1') then exit reset_loop; end if; end loop main_loop; end loop reset_loop; end process add; end modsumchk_arch; Dodatek 3.7 Blok SORT --- File: SortReg.vhd -- Author: Pawel Russek -- Data: 12.06.2001 -- Description: Plik opisujke dzilanie rejestru sortujacego. Dane nie posotrowane wchodza, -- wychodza posortowane -library IEEE; use IEEE.std_logic_1164.all; use IEEE.std_logic_arith.all; entity SortReg is generic ( ERROR_WIDTH: integer:=10; L_VALUE: integer:=3 ); port( CLK : in STD_LOGIC; FORCEIN : in STD_LOGIC; RESET : in STD_LOGIC; DATAIN : in UNSIGNED(ERROR_WIDTH-1 downto 0); FORCEOUT : out STD_LOGIC; DATAOUT : out UNSIGNED(ERROR_WIDTH-1 downto 0) ); end SortReg; architecture SortReg_arch of SortReg is component SortRegCell generic ( DATA_WIDTH: integer ); port ( clk : in STD_LOGIC; datain : in UNSIGNED(DATA_WIDTH-1 downto 0); forcein : in STD_LOGIC; reset : in STD_LOGIC; 157 dataout : out UNSIGNED(DATA_WIDTH-1 downto 0); forceout : out STD_LOGIC ); end component; type magtype is array ( 0 to L_VALUE-2 ) of UNSIGNED ( ERROR_WIDTH-1 downto 0 ); type nettype is array ( 0 to L_VALUE-1 ) of STD_LOGIC; signal MYBUS : magtype; signal MYNET : nettype; begin U1 : SortRegCell generic map( DATA_WIDTH => ERROR_WIDTH ) port map( clk => CLK, datain => DATAIN, dataout => MYBUS(0), forcein => FORCEIN, forceout => MYNET(0), reset => RESET ); G0: for I in 1 to L_VALUE-2 generate U2 : SortRegCell generic map( DATA_WIDTH => ERROR_WIDTH ) port map( clk => CLK, datain => MYBUS(I-1), dataout => MYBUS(I), forcein => MYNET(I-1), forceout => MYNET(I), reset => RESET ); end generate; U3 : SortRegCell generic map( DATA_WIDTH => ERROR_WIDTH ) port map( clk => CLK, datain => MYBUS(L_VALUE-2), dataout => DATAOUT, forcein => MYNET(L_VALUE-2), forceout => FORCEOUT, reset => RESET ); 158 end SortReg_arch; entity SortRegCell is generic ( DATA_WIDTH: integer:=8 ); port ( clk, reset: in std_logic; datain: in UNSIGNED ( DATA_WIDTH-1 downto 0 ); forcein:in STD_LOGIC; dataout: out UNSIGNED ( DATA_WIDTH-1 downto 0 ); forceout: out STD_LOGIC ); end SortRegCell; architecture SortRegCell_Arch of SortRegCell is signal reg : UNSIGNED ( DATA_WIDTH-1 downto 0 ); --wartosc przechowywana signal comp: std_logic; --wynik komparacji signal force: std_logic; begin process begin reset_loop: loop reg<=(others=>'0'); dataout<=(others=>'0'); wait until clk'event and clk='1'; if ( reset='1' ) then exit reset_loop; end if; main_loop: loop if ( comp='0' OR forcein='1' ) then dataout<=reg; reg<=datain; else dataout<=datain; end if; force<=forcein; forceout<=force; wait until clk'event and clk='1'; if ( reset='1' ) then exit reset_loop; end if; end loop main_loop; end loop reset_loop; end process; process( datain ) begin if( datain>=reg ) then comp <= '0'; else comp <='1'; end if; 159 end process; end SortRegCell_Arch; Dodatek 3.8 Blok POZIOM ---File: selectindexval.vhd --Author: pr --Date: 18.04.2001 --Modul wybiera ze stringu o dlugosci 4 wartosc o indeksie podanym na wejsciu --Indeks moze byc ujemny. Potrzeba ABS() -library IEEE; use IEEE.std_logic_1164.all; use IEEE.std_logic_arith.all; entity selectindexval is generic ( ERROR_WIDTH: integer:=10; L_VAL_LOG2: integer:=4; L_VALUE: integer:=3 ); port ( STRINGIN: in UNSIGNED (ERROR_WIDTH-1 downto 0); INDEX: in SIGNED (L_VAL_LOG2 downto 0); CLK: in STD_LOGIC; RESET: in STD_LOGIC; FRMIN: in STD_LOGIC; VALUEOUT: out UNSIGNED(ERROR_WIDTH-1 downto 0); SIGN: out STD_LOGIC; --nadmiar czy niedomiar DIFF: out UNSIGNED ( L_VAL_LOG2-1 downto 0 ); --jaki nadmiar/niedomiar FRMOUT: out STD_LOGIC ); end selectindexval; architecture selectindexval_arch of selectindexval is signal indexabsreg: SIGNED ( L_VAL_LOG2 downto 0 ); signal selectvaluereg: UNSIGNED ( ERROR_WIDTH-1 downto 0); signal signreg: STD_LOGIC; signal diffreg: SIGNED ( L_VAL_LOG2 downto 0 ); signal counter: UNSIGNED ( L_VAL_LOG2-1 downto 0 );--range 0 to L_VALUE-1; begin main: process begin reset_loop:loop wait until clk'event and clk='1'; if ( reset='1') then exit reset_loop; end if; main_loop:loop selectvaluereg<=stringin; 160 if ( CONV_SIGNED(counter,L_VAL_LOG2+1)=indexabsreg ) then valueout<=selectvaluereg; else end if; wait until clk'event and clk='1'; if ( reset='1') then exit reset_loop; end if; end loop main_loop; end loop reset_loop; end process main; frame: process variable si :SIGNED(L_VAL_LOG2 downto 0); begin reset_loop:loop wait until clk'event and clk='1'; if ( reset='1') then exit reset_loop; end if; main_loop:loop if ( FRMIN='1' ) then if ( index<CONV_SIGNED(0,L_VAL_LOG2+1) ) then --odliczamy od konca lancucha PARAMETR si:=CONV_SIGNED(L_VALUE,L_VAL_LOG2+1)+index; --odliczamy od konca lancucha PARAMETR indexabsreg<=si; SIGNREG<='1'; DIFFREG<=0-index; else indexabsreg<=index; SIGNREG<='0'; DIFFREG<=index; end if; FRMOUT<='1'; SIGN<=SIGNREG; DIFF<=CONV_UNSIGNED(DIFFREG( L_VAL_LOG2-1 downto 0),L_VAL_LOG2); else FRMOUT<='0'; end if; wait until clk'event and clk='1'; if ( reset='1') then exit reset_loop; end if; end loop main_loop; end loop reset_loop; end process frame; count: process begin reset_loop:loop wait until clk'event and clk='1'; if ( reset='1') then exit reset_loop; end if; main_loop:loop if ( FRMIN='1' ) then COUNTER<=CONV_UNSIGNED(0, L_VAL_LOG2); 161 else COUNTER<=COUNTER+1; end if; wait until clk'event and clk='1'; if ( reset='1') then exit reset_loop; end if; end loop main_loop; end loop reset_loop; end process count; end selectindexval_arch; Dodatek 3.9 Blok KORYGUJ ---File: correct.vhd --Author: pr --Date: 18.04.2001 --Opis: Modul koryguje wartosc wspolczynnikow ( DATAIN ) zgodnie z warotscia ( DIFF ) -library IEEE; use IEEE.std_logic_1164.all; use IEEE.std_logic_arith.all; entity correct is generic( ERROR_WIDTH: integer; L_VAL_LOG2: integer; K_VAL_LOG2: integer ); port ( DATAIN:in UNSIGNED (K_VAL_LOG2-1 downto 0); ERROR: in UNSIGNED (ERROR_WIDTH-1 downto 0); --blad dzielenia dla datain THVAL: in UNSIGNED (ERROR_WIDTH-1 downto 0); --wartosc odniesienia DIFF: in UNSIGNED ( L_VAL_LOG2-1 downto 0 ); SIGN: in STD_LOGIC; --flaga niedobor czy nadmiar '1' niedobor FRMIN: in STD_LOGIC; --synch ramki CLK: in STD_LOGIC; RESET: in STD_LOGIC; DATAOUT: out UNSIGNED (K_VAL_LOG2-1 downto 0); FRMOUT: out STD_LOGIC ); end correct; architecture correct_arch of correct is signal thvalreg: UNSIGNED (ERROR_WIDTH-1 downto 0); signal dataholdreg: UNSIGNED ( K_VAL_LOG2-1 downto 0); signal errorholdreg: UNSIGNED ( ERROR_WIDTH-1 downto 0); signal diffcounter: UNSIGNED ( L_VAL_LOG2-1 downto 0); signal frmreg: std_logic; begin main: process 162 --skorygowane dane wyjscopwe variable cmp: std_logic; -- blad wiekszy od poziomu variable equ: std_logic; -- blad rowny poziomowi variable zero: std_logic; variable dec: std_logic; -- steroewanie licznika diffcounter begin reset_loop:loop wait until clk'event and clk='1'; if ( reset='1') then exit reset_loop; end if; main_loop:loop dataholdreg<=datain; errorholdreg<=error; if ( errorholdreg=thvalreg ) then equ:='1'; else equ:='0'; end if; if ( errorholdreg>thvalreg ) then cmp:='1'; else cmp:='0'; end if; if ( diffcounter=CONV_UNSIGNED(0,L_VAL_LOG2) ) then zero:='1'; else zero:='0'; end if; if ( SIGN='1' ) then if( --niedobor ( equ='1' OR cmp='1' ) AND zero='0' ) then dataout<=dataholdreg+1; dec:='1'; else dataout<=dataholdreg; dec:='0'; end if; else --nadmiar if( ( equ='0' OR cmp='1' ) AND zero='0' dataout<=dataholdreg-1; dec:='1'; else dataout<=dataholdreg; dec:='0'; end if; end if; if ( FRMIN='1' ) then thvalreg<=thval; diffcounter<=diff; else if ( dec='1' ) then diffcounter<=diffcounter-1; end if; end if; frmreg<=frmin; frmout<=frmreg; wait until clk'event and clk='1'; if ( reset='1') then exit reset_loop; end if; end loop main_loop; end loop reset_loop; end process main; end correct_arch; 163 ) then Dodatek 3.10 Blok OPOZ ---File: delay.vhd --Author: pr --Date: 13.04.2001 --Linia opozniajaca o dlugosci len w szerokosci WIDTH -library IEEE; use IEEE.std_logic_1164.all; use IEEE.std_logic_arith.all; entity delay is generic ( LEN: integer:=100; WIDTH: integer:=8 ); port ( DATAIN: in UNSIGNED (WIDTH-1 downto 0); DATAOUT: out UNSIGNED (WIDTH-1 downto 0); FRMIN: in STD_LOGIC; FRMOUT: out STD_LOGIC; CLK: in STD_LOGIC; RESET: in STD_LOGIC ); end delay; architecture delay_arch of delay is type register_type is array( LEN-1 downto 0 ) of unsigned( WIDTH-1 downto 0 ); signal delayreg: register_type; signal framereg: STD_LOGIC_VECTOR( LEN-1 downto 0 ); begin process (clk) begin if clk'event and clk='1' then delayreg<=delayreg(LEN-2 downto 0 ) & datain; framereg<=framereg(LEN-2 downto 0 ) & frmin; dataout<=delayreg(LEN-1); frmout<=framereg(LEN-1); end if; end process; end delay_arch; Dodatek 4 Pliki źródłowe realizacji modułu kodera Dodatek 4.1 Blok SUMATOR --- File: PVQCode.vhd -- created by Design Wizard: 06/05/01 10:46:45 164 -library IEEE; use IEEE.std_logic_1164.all; use IEEE.std_logic_arith.all; entity PVQCode is generic( SYMBOL_WIDTH: integer:=10; N_WIDTH: integer:=10; L_WIDTH: integer:=4; K_WIDTH: integer:=4; K: integer:=8 ); port ( DATAIN: in UNSIGNED ( K_WIDTH-1 downto 0); SIGN: in STD_LOGIC; FRMIN: in STD_LOGIC; SYMBOLOUT: out UNSIGNED ( SYMBOL_WIDTH-1 downto 0 ); FRMOUT: out STD_LOGIC; NVAL: in UNSIGNED ( N_WIDTH-1 downto 0 ); --wartosc iteracji LVAL: inout UNSIGNED ( L_WIDTH-1 downto 0 );--LMJ_WIDTH-1 downto 0 ); --dla L=LVAL, KVAL: inout UNSIGNED ( K_WIDTH-1 downto 0 ); --K=KVAL SIGNVAL: out STD_LOGIC; --i SIGN=SIGNVAL; CLK: in STD_LOGIC; RESET: in STD_LOGIC ); end PVQCode; architecture PVQCode_Arch of PVQCode is signal Kauxreg: UNSIGNED( K_WIDTH-1 downto 0); signal Lindexreg: UNSIGNED( L_WIDTH-1 downto 0 );--LMJ_WIDTH-1 downto 0); signal signreg: STD_LOGIC; signal symbolreg: UNSIGNED( SYMBOL_WIDTH-1 downto 0); signal frmreg: STD_LOGIC; begin main: process begin reset_loop:loop wait until clk'event and clk='1'; if ( reset='1') then exit reset_loop; end if; main_loop: loop frmreg<=FRMIN; FRMOUT<=frmreg; if( FRMIN='1' ) then KVAL<=CONV_UNSIGNED( K, K_WIDTH )-DATAIN; LVAL<=CONV_UNSIGNED( 0, L_WIDTH);--LMJ_WIDTH); else KVAL<=KVAL-DATAIN; LVAL<=LVAL+1; end if; if ( DATAIN=CONV_UNSIGNED(0,K_WIDTH) ) then 165 SIGNVAL<='0'; else SIGNVAL<=sign; end if; if ( frmreg='1' )then symbolreg( N_WIDTH-1 downto 0 )<=NVAL; else symbolreg<=symbolreg+NVAL; end if; SYMBOLOUT<=symbolreg; wait until clk'event and clk='1'; if ( reset='1') then exit reset_loop; end if; end loop main_loop; end loop reset_loop; end process main; end PVQCode_Arch; Dodatek 5 Pliki źródłowe realizacji modułu dekodera Dodatek 5.1 Blok KOMP_P --- File: FirstSymDecCell.vhd -- Author: Pawel Russek -- Date: 24.05.2001 -library IEEE; use IEEE.std_logic_1164.all; use IEEE.std_logic_arith.all; entity FirstSymDecCell is generic ( INSYMBOL_WIDTH: INTEGER:=96; --szerokosc magistrali wejsciowej OUTSYMBOL_WIDTH: INTEGER:=91 ); port ( symbol_in: in UNSIGNED ( INSYMBOL_WIDTH-1 downto 0 ); symbol_out: out UNSIGNED ( OUTSYMBOL_WIDTH-1 downto 0 ); index_out: out UNSIGNED ( 0 downto 0 ); refdata: in UNSIGNED ( OUTSYMBOL_WIDTH-1 downto 0 ); --wartosc z ROM'u zewnetrznego clk: in STD_LOGIC; reset: in STD_LOGIC; framein: in STD_LOGIC; --bramkowanie waznych danych frameout: out STD_LOGIC ); end FirstSymDecCell; architecture FirstSymDecCell_Arch of FirstSymDecCell is signal idle: std_logic; --flaga czy komorka pracuje czy nie signal symbol_reg: UNSIGNED ( OUTSYMBOL_WIDTH-1 downto 0 ); 166 begin main: process begin reset_loop:loop idle<='1'; wait until clk'event and clk='1'; if ( reset='1') then exit reset_loop; end if; main_loop:loop if ( framein='1' and idle='1' ) then idle<='0'; --rozpocznij poownanie symbol_reg<=symbol_in( OUTSYMBOL_WIDTH-1 downto 0 ); end if; if ( idle='0' ) then idle<='1'; end if; wait until clk'event and clk='1'; if ( reset='1') then exit reset_loop; end if; end loop main_loop; end loop reset_loop; end process main; notidle: process variable tmp_symbol_out: SIGNED ( OUTSYMBOL_WIDTH-1 downto 0 ); begin reset_loop:loop wait until clk'event and clk='1'; if ( reset='1') then exit reset_loop; end if; main_loop:loop if ( idle='0' ) then frameout<='1'; if ( symbol_reg < refdata ) then --porownanie ze srodkiem przedzialu index_out(0)<='0'; symbol_out<=symbol_reg; else index_out(0)<='1'; tmp_symbol_out:=SIGNED(symbol_reg)-SIGNED(refdata); symbol_out<=UNSIGNED(tmp_symbol_out( OUTSYMBOL_WIDTH-1 downto 0 )); end if; else frameout<='0'; end if; wait until clk'event and clk='1'; if ( reset='1') then exit reset_loop; end if; end loop main_loop; end loop reset_loop; end process notidle; end FirstSymDecCell_Arch; Dodatek 5.2 Blok KOMP --- File: FirstSymDecCell.vhd 167 -- Author: Pawel Russek -- Date: 24.05.2001 -library IEEE; use IEEE.std_logic_1164.all; use IEEE.std_logic_arith.all; entity FirstSymDecCell is generic ( INSYMBOL_WIDTH: INTEGER:=96; --szerokosc magistrali wejsciowej OUTSYMBOL_WIDTH: INTEGER:=91 ); port ( symbol_in: in UNSIGNED ( INSYMBOL_WIDTH-1 downto 0 ); symbol_out: out UNSIGNED ( OUTSYMBOL_WIDTH-1 downto 0 ); index_out: out UNSIGNED ( 0 downto 0 ); refdata: in UNSIGNED ( OUTSYMBOL_WIDTH-1 downto 0 ); --wartosc z ROM'u zewnetrznego clk: in STD_LOGIC; reset: in STD_LOGIC; framein: in STD_LOGIC; --bramkowanie waznych danych frameout: out STD_LOGIC ); end FirstSymDecCell; architecture FirstSymDecCell_Arch of FirstSymDecCell is signal idle: std_logic; --flaga czy komorka pracuje czy nie signal symbol_reg: UNSIGNED ( OUTSYMBOL_WIDTH-1 downto 0 ); begin main: process begin reset_loop:loop idle<='1'; wait until clk'event and clk='1'; if ( reset='1') then exit reset_loop; end if; main_loop:loop if ( framein='1' and idle='1' ) then idle<='0'; --rozpocznij ponownanie symbol_reg<=symbol_in( OUTSYMBOL_WIDTH-1 downto 0 ); end if; if ( idle='0' ) then idle<='1'; end if; wait until clk'event and clk='1'; if ( reset='1') then exit reset_loop; end if; end loop main_loop; end loop reset_loop; end process main; notidle: process variable tmp_symbol_out: SIGNED ( OUTSYMBOL_WIDTH-1 downto 0 ); begin reset_loop:loop wait until clk'event and clk='1'; 168 if ( reset='1') then exit reset_loop; end if; main_loop:loop if ( idle='0' ) then frameout<='1'; if ( symbol_reg < refdata ) then --porownanie ze srodkiem przedzialu index_out(0)<='0'; symbol_out<=symbol_reg; else index_out(0)<='1'; tmp_symbol_out:=SIGNED(symbol_reg)-SIGNED(refdata); symbol_out<=UNSIGNED(tmp_symbol_out( OUTSYMBOL_WIDTH-1 downto 0 )); end if; else frameout<='0'; end if; wait until clk'event and clk='1'; if ( reset='1') then exit reset_loop; end if; end loop main_loop; end loop reset_loop; end process notidle; end FirstSymDecCell_Arch; Dodatek 6 Pliki źródłowe realizacji modułu dekwantyzatora Dodatek 6.1 Blok ROWDOSZER --- File: ParSerConv.vhd -library IEEE; use IEEE.std_logic_1164.all; use IEEE.std_logic_arith.all; entity parserconv is generic ( K_VAL_LOG2: INTEGER:=4; L_VALUE: INTEGER:=3 ); port ( COEFFICIENTS_IN: in UNSIGNED ( L_VALUE*K_VAL_LOG2-1 downto 0); SIGNS_IN: in STD_LOGIC_VECTOR (L_VALUE-1 downto 0); FRMIN: in STD_LOGIC; COEFFICIENT_OUT: out UNSIGNED (K_VAL_LOG2-1 downto 0); SIGN_OUT: out STD_LOGIC; FRMOUT: out STD_LOGIC ; CLK: in STD_LOGIC; RESET: in STD_LOGIC ); end parserconv; 169 architecture parserconv_arch of parserconv is subtype SYMBOLTYPE is UNSIGNED ( K_VAL_LOG2-1 downto 0 ); type SYMBOLREGISTERTYPE is array( L_VALUE-1 downto 0 ) of SYMBOLTYPE; signal symbolregister: SYMBOLREGISTERTYPE; signal signregister: STD_LOGIC_VECTOR( L_VALUE-1 downto 0 ); signal frm: std_logic; begin shift: process begin reset_loop:loop wait until clk'event and clk='1'; if ( reset='1') then exit reset_loop; end if; main_loop:loop if ( frmin='0' ) then --shift shift_reg_loop:for i in 1 to L_VALUE-1 loop symbolregister(i-1)<=symbolregister(i); signregister(i-1)<=signregister(i); end loop; else --load for I in 0 to L_VALUE-1 loop symbolregister(I)<=COEFFICIENTS_IN((I+1)*K_VAL_LOG2-1 downto I*K_VAL_LOG2 ); end loop; signregister<=SIGNS_IN; end if; frm<=frmin; frmout<=frm; COEFFICIENT_OUT<=symbolregister(0); SIGN_OUT<=signregister(0); wait until clk'event and clk='1'; if ( reset='1') then exit reset_loop; end if; end loop main_loop; end loop reset_loop; end process shift; end parserconv_arch; Dodatek 6.2 Blok ODTWORZ --- File: TuneCoef.vhd -- Author: Pawel Russek -- Date: 06/04/01 12:49:54 -library IEEE; use IEEE.std_logic_1164.all; use IEEE.std_logic_arith.all; entity TuneCoef is generic ( COEF_WIDTH: integer:=3; K: integer:=7 ); 170 port ( COEF_IN: in UNSIGNED ( COEF_WIDTH-1 downto 0 ); COEF_OUT: out UNSIGNED ( COEF_WIDTH-1 downto 0 ); FRM_IN: in STD_LOGIC; FRM_OUT: out STD_LOGIC; SIGN_IN: in STD_LOGIC; SIGN_OUT: out STD_LOGIC; CLK: in STD_LOGIC; RESET: in STD_LOGIC ); end TuneCoef; architecture TuneCoef_Arch of TuneCoef is signal sum : UNSIGNED ( COEF_WIDTH-1 downto 0 ); signal diff: UNSIGNED ( COEF_WIDTH-1 downto 0 ); signal frm: std_logic; signal sign: std_logic; begin main: process begin reset_loop:loop wait until clk'event and clk='1'; if ( reset='1') then exit reset_loop; end if; main_loop:loop diff<=CONV_UNSIGNED(K, COEF_WIDTH ) - COEF_IN; if ( FRM_IN='1' ) then sum<=CONV_UNSIGNED(0, COEF_WIDTH ); else sum<=diff; end if; COEF_OUT<=diff-sum; FRM<=FRM_IN; FRM_OUT<=FRM; SIGN<=SIGN_IN; SIGN_OUT<=SIGN; wait until clk'event and clk='1'; if ( reset='1') then exit reset_loop; end if; end loop main_loop; end loop reset_loop; end process main; end TuneCoef_Arch; Dodatek 6.3 Blok MNOZ --- File: scaledata.vhd -library IEEE; use IEEE.std_logic_1164.all; use IEEE.std_logic_arith.all; 171 entity scaledata is generic ( DATA_WIDTH: integer:=8; K_VAL_LOG2: integer:=4; MODULE_WIDTH: integer:=10 ); port ( COEFFIN: UNSIGNED ( K_VAL_LOG2-1 downto 0); FRMIN: in STD_LOGIC; MODULE: in UNSIGNED ( MODULE_WIDTH-1 downto 0); SIGNIN: in STD_LOGIC; CLK: in STD_LOGIC; RESET: in STD_LOGIC; DATAOUT: out UNSIGNED(DATA_WIDTH+K_VAL_LOG2-2 downto 0); SIGNOUT: out STD_LOGIC; FRMOUT: out STD_LOGIC ); end scaledata; architecture scaledata_arch of scaledata is type muxregtype is array (MODULE_WIDTH-1 downto 0) of UNSIGNED (K_VAL_LOG2+MODULE_WIDTH-1 downto 0); type modregtype is array (MODULE_WIDTH-1 downto 0) of UNSIGNED (MODULE_WIDTH-1 downto 0); type datregtype is array (MODULE_WIDTH-1 downto 0) of UNSIGNED (K_VAL_LOG2-1 downto 0); signal signreg: STD_LOGIC_VECTOR( MODULE_WIDTH-1 downto 0); signal framereg: STD_LOGIC_VECTOR( MODULE_WIDTH-1 downto 0); signal muxreg: muxregtype; signal modreg: modregtype; signal datreg: datregtype; begin main: process begin reset_loop:loop wait until clk'event and clk='1'; if ( reset='1') then exit reset_loop; end if; main_loop:loop modreg(0)<=module; datreg(0)<=coeffin; if ( module(0)='0' ) then muxreg(0)<=CONV_UNSIGNED(0,K_VAL_LOG2+MODULE_WIDTH ); else muxreg(0)(K_VAL_LOG2-1 downto 0 )<=coeffin(K_VAL_LOG2-1 downto 0 ); muxreg(0)(K_VAL_LOG2+MODULE_WIDTH-1 downto K_VAL_LOG2)<=CONV_UNSIGNED(0,MODULE_WIDTH); end if; mux_loop: for i in 0 to MODULE_WIDTH-2 loop if ( modreg(i)(i+1)='0' ) then muxreg(i+1)<=muxreg(i); else muxreg(i+1)(i downto 0)<=muxreg(i)(i downto 0); muxreg(i+1)(K_VAL_LOG2+MODULE_WIDTH-1 downto i+1) <=muxreg(i)(K_VAL_LOG2+MODULE_WIDTH-1 downto i+1)+datreg(i); 172 end if; datreg(i+1)<=datreg(i); modreg(i+1)<=modreg(i); end loop mux_loop; dataout<=muxreg( MODULE_WIDTH-1 )(DATA_WIDTH+K_VAL_LOG2-2 downto 0); wait until clk'event and clk='1'; if ( reset='1') then exit reset_loop; end if; end loop main_loop; end loop reset_loop; end process main; shift: process begin reset_loop:loop wait until clk'event and clk='1'; if ( reset='1') then exit reset_loop; end if; main_loop:loop signreg(0)<=signin; framereg(0)<=frmin; shift_reg_loop:for i in 0 to MODULE_WIDTH-2 loop signreg(i+1)<=signreg(i); framereg(i+1)<=framereg(i); end loop; signout<=signreg(MODULE_WIDTH-1); frmout<=framereg(MODULE_WIDTH-1); wait until clk'event and clk='1'; if ( reset='1') then exit reset_loop; end if; end loop main_loop; end loop reset_loop; end process shift; end scaledata_arch; Dodatek 6.4 Blok DZIEL --File: scale.vhd --Author: pr --Date: 10.04.2001 --Modified: 11.06.2001 --Plik implementujacy przeskalowanie wspolczynnikow wejsciowych --na powierzchnie piramidy o promieniu K=256. Mnozy przez 256 --i dzieli przez dana SCALEFACTOR. Dzielenie zajmuje 8 taktów --zegara ( w wyniku dzielenia otrzymujemy 8 bitiwa wartosc ). Mnozenie ~1 takt. --Wyniki pojawiaja sie na wyjsciu z opoznieniem 25 taktow zegara. --Dzielenie oparte na metodzie "pen and paper" patrz div2.vhd library IEEE; use IEEE.std_logic_1164.all; use IEEE.std_logic_arith.all; entity cvaldiv is generic ( 173 DATA_WIDTH: integer:=45; DIV_VALUE: integer:=3; DIV_LOG2: integer:=2 ); port ( DATAIN: in UNSIGNED (DATA_WIDTH-1 downto 0); FRM: in STD_LOGIC; SIGNIN: in STD_LOGIC; CLK: in STD_LOGIC; RESET: in STD_LOGIC; DATAOUT: out UNSIGNED (DATA_WIDTH-DIV_LOG2 downto 0); FRMOUT: out STD_LOGIC; --lamanie danych na wektory SIGNOUT: out STD_LOGIC ); end cvaldiv; architecture cvaldiv_arch of cvaldiv is type quonientregistertype is array ( DATA_WIDTH-DIV_LOG2 downto 0 ) of unsigned ( DATA_WIDTH-DIV_LOG2 downto 0 ); type reminderregistertype is array ( DATA_WIDTH-DIV_LOG2 downto 0 ) of unsigned ( DATA_WIDTH-1 downto 0 ); signal remainders : reminderregistertype; signal quonients : quonientregistertype; signal framereg: STD_LOGIC_VECTOR( DATA_WIDTH-DIV_LOG2 downto 0 ); --sygnal ramki opozniamy signal signreg: STD_LOGIC_VECTOR( DATA_WIDTH-DIV_LOG2 downto 0 ); --sygnal znaku opozniamy begin --architecture main: process variable muldiv: UNSIGNED(DATA_WIDTH-1 downto 0); begin --process reset_loop: loop zeroing_variables: for l in 0 to DATA_WIDTH-DIV_LOG2 loop quonients(l)<=(others=>'0'); remainders(l)<=(others=>'0'); end loop zeroing_variables; wait until clk'event and clk='1'; if ( reset='1' ) then exit reset_loop; end if; main_loop: loop div_for_loop: for i in 0 to DATA_WIDTH-DIV_LOG2 loop muldiv( DATA_WIDTH-1 downto 0 ):=CONV_UNSIGNED(0,DATA_WIDTH); muldiv( DATA_WIDTH-1-i downto DATA_WIDTH-DIV_LOG2-i ) :=CONV_UNSIGNED(DIV_VALUE,DIV_LOG2); if ( i=0 ) then quonients(i)(DATA_WIDTH-DIV_LOG2 downto 0 ) <=CONV_UNSIGNED(0,DATA_WIDTH-DIV_LOG2+1); if ( muldiv<=datain ) then quonients(i)(DATA_WIDTH-DIV_LOG2-i)<='1'; remainders(i)<=datain-muldiv; else quonients(i)(DATA_WIDTH-DIV_LOG2-i)<='0'; remainders(i)<=datain; end if; end if; 174 -if ( NOT ( i=0 ) ) then quonients(i)(DATA_WIDTH-DIV_LOG2 downto 0 )<=quonients(i-1) (DATA_WIDTH-DIV_LOG2 downto 0 ); if ( muldiv<=remainders(i-1)) then quonients(i)(DATA_WIDTH-DIV_LOG2-i)<='1'; remainders(i)<=remainders(i-1)-muldiv; else quonients(i)(DATA_WIDTH-DIV_LOG2-i)<='0'; remainders(i)<=remainders(i-1); end if; end if; end loop div_for_loop; dataout<=quonients( DATA_WIDTH-DIV_LOG2); wait until clk'event and clk='1'; if ( reset='1' ) then exit reset_loop; end if; end loop main_loop; end loop reset_loop; end process main; shift: process begin reset_loop:loop wait until clk'event and clk='1'; if ( reset='1') then exit reset_loop; end if; main_loop:loop framereg(0)<=frm; signreg(0)<=signin; shift_reg_loop:for i in 0 to DATA_WIDTH-DIV_LOG2-1 loop framereg(i+1)<=framereg(i); signreg(i+1)<=signreg(i); end loop; frmout<=framereg(DATA_WIDTH-DIV_LOG2); signout<=signreg(DATA_WIDTH-DIV_LOG2); wait until clk'event and clk='1'; if ( reset='1') then exit reset_loop; end if; end loop main_loop; end loop reset_loop; end process shift; end cvaldiv_arch; 175 Dodatek 7. Zawartość płyty CD Katalog C_Software Programy środowiska C++ Builder wykorzystane do tworzenia projektu i symulacji algorytmu kompresji Katalog CodeROMGen Pliki projektu tworzącego kody żródłowe pamięci kodera PVQ. Program zakłada stała szerokość magistrali danych, tak więc program przydatny przy tworzeniu pamięci kodera poza strukturą FPGA. Katalog CodeROMGenII Pliki projektu tworzącego kody źródłowe pamięci kodera PVQ. Program zakłada dynamiczną szerokość magistrali danych, tak więc program przydatny przy tworzeniu pamięci kodera w strukturze FPGA. Katalog DecodeROMGen Pliki projektu tworzacego pliki źródłowe modułów pamięciowych dekodera PVQ Katalog MapBlockRAM Pliki projektu programu klasyfikującego moduły RAM do implemantacji w BSR lub w LUT Katalog PVQ_CLB_Calculator Pliki projektowe programu pomocnego przy obliczaniu koniecznych zasobów CLB dla zadanych parametrów L,K Katalog PVQSimulation Projekty programowe służące do symulacji toru kompresji/dekompresji Katalog DecompSeq Projekt programu służącego do dekompozycji falkowej sekwencji wejściowej Katalog MotEstim Pliki zawierające kody źródłowe z procedurami estymacji ruchu Katalog PVQ Pliki zawierające deklarację i definicję klas służacych do kwantyzacji PVQ danych z dowolnego pliku Katalog PVQBitAlloc Pliki źródłowe zawierające procedury alokacji bitów Katalog PVQQuantize Projekt programu uruchomieniowego całego toru kompreji/dekompresji Katalog RAWSequence Projekt programu pomocniczego do zamiany formatu danych obrazowych „.ppm” na format „.raw” Katalog Variance Projekt programu pomocniczego obliczającego wariancję dla danych z podanego pliku. Katalog PVQDecodeGen Pliki projektu programu generującego kod źródłowy VHDL struktury dekodera dla zadanych parametrów L.K. Katalog Wavelet_Tool Programy pomocnicze dekompozycji falkowej. Katalog VHDL_Hardware Projekty środowiska ActiveHDL zawierające opisy części składowych architektury VHDL Katalog coder Projekt ActiveHDL bloku kodera PVQ Katalog decoder Projekt ActiveHDL bloku dekodera PVQ Katalog quantizer Projekt ActiveHDL bloku kwantyzatora PVQ Katalog dequantizer Projekt ActiveHDL bloku dekwantyzatora PVQ 176