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 X1 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ć y1. Jeżeli y1=K to wektor y jest poszukiwanym wektorem Y.
3. Jeżeli y1<K to należy do K-y1współrzędnych, dla których błąd zaokrąglenia w dół
był największy dodać jeden.
4. Jeżeli y1>K to należy od y1-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 X1, 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 (y1<K i y1>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ć y1. Jeżeli y1=K to wektor y jest poszukiwanym wektorem Y.
3. Jeżeli y1<K to należy do K-y1współ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

Podobne dokumenty