Mjukvarurealiserad bildtelefoni - Umeå universitet
Mjukvarurealiserad bildtelefoni - Umeå universitet
Mjukvarurealiserad bildtelefoni - Umeå universitet
You also want an ePaper? Increase the reach of your titles
YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.
<strong>Mjukvarurealiserad</strong> <strong>bildtelefoni</strong><br />
Examensarbete 20p, <strong>Umeå</strong> Universitet<br />
P-O Östberg
Abstract<br />
With the ever–increasing popularity of the Internet a staggering increase in the number of<br />
computer users has followed the last five years. The daily lives and communication patterns of<br />
ordinary people have been forever altered by the presence of computers in the home as well as in<br />
the workplace. Today there are few people in the developed world who have not heard of the<br />
Internet or used it, the question is no longer if the internet will change the way we communicate –<br />
but how it has changed it and how it in the future will change it.<br />
This thesis, which has been produced at <strong>Umeå</strong> University, attempts to provide a glimpse of the<br />
theories and techniques used in construction of image based communication tools for use on the<br />
Internet. The focus has been directed toward image based telephony systems and how these can be<br />
produced without the support of dedicated hardware.<br />
The thesis consists of three main parts: it starts off with a short introduction to the field of image<br />
based telephony, continues with a theoretical overview of (image) compression and cryptography<br />
respectively, and concludes with a model for a software realised image based telephony system.<br />
Hopefully it will serve as a comprehensive introduction to the field for the interested reader.<br />
2
Innehållsförteckning<br />
Abstract 2<br />
Innehållsförteckning 3<br />
Inledning 4<br />
Bildtelefoni 6<br />
Komprimering och kryptering som företeelser 8<br />
Kryptering 9<br />
Symmetrisk kryptering 12<br />
Asymmetrisk kryptering 15<br />
Komprimering 21<br />
Redundans 23<br />
Förlustfri komprimering 24<br />
Dataförstörande komprimering 26<br />
Frekvensdomänanalys 30<br />
Transformbaserad komprimering 33<br />
Transformbaserad bildkompression med DCT 36<br />
Trunkering av transformkoefficienter 39<br />
Kvantifiering av transformkoefficienter 43<br />
Modellbaserad komprimering 44<br />
Spektral redundans 46<br />
Temporal redundans 48<br />
Ett <strong>bildtelefoni</strong>system 51<br />
Bildkälla 53<br />
Komprimeringsmodul 57<br />
Krypteringssystem 62<br />
Kommunikationsstack 64<br />
Implementation 66<br />
Slutsatser 70<br />
Ordlista 73<br />
Källhänvisningar 75<br />
Appendix A – Systembeskrivning kompressionsmodul 77<br />
Appendix B – Interaktiva demonstrationer 86<br />
Pad Demo 87<br />
Block Demo 88<br />
DCT Demo 89<br />
Quantization Demo 90<br />
Frame Compression Demo 91<br />
Stream Compression Demo 93<br />
Animated Stream Compression Demo 94<br />
3
Inledning<br />
Detta examensarbete har utförts som en del av civilingenjörsutbildningen Teknisk Datavetenskap<br />
180p vid <strong>Umeå</strong> Universitet och omfattar 20 högskolepoäng, motsvarandes en termins heltidsstudier.<br />
Ämnesområdet har valts av författaren själv, efter personligt intresse för de involverade<br />
teknikerna och inte på uppdrag av någon extern organisation eller intressegrupp.<br />
Mål<br />
Detta arbete studerar i första hand de olika delar som ingår i mjukvarurealiserade applikationer för<br />
<strong>bildtelefoni</strong>, med fördjupning mot ämnesområdena bildbehandling (framförallt bildkompression)<br />
samt säkerhet. Målet med detta arbete har varit att studera och öka studentens förståelse för några<br />
av de metoder och komponenter som vanligen ingår i dagens system för visuell kommunikation.<br />
Arbetets fokus har medvetet förlagts mot studier av teorierna snarare än produktionen av en prototyp<br />
för ett sådant system.<br />
Metod<br />
I tidsdispositionen för detta arbete har en stor del av arbetstiden förlagts gentemot studier av<br />
teorier och implementationsdetaljer hos bildkomprimeringsalgoritmer och symmetriska<br />
krypteringsalgoritmer. Detta speglas inte alltid på ett rättvist sätt i redovisningen av detta arbete<br />
men motiveras av att dessa två områden är oerhört komplexa och beräkningsintensiva. Dessa<br />
måste sålunda implementeras på ett så effektivt sätt som möjligt för att kunna användas i rena<br />
mjukvarulösningar. Den naturliga (eller snarare industriella) ansatsen av detta problem är att<br />
realisera dessa delar i dedikerad hårdvara eftersom detta dels kommer att avlasta systemet och dels<br />
kommer att resultera i en fysisk produkt som är lättare att föra ekonomiskt. Undvikandet av detta<br />
har varit ett medvetet val – en av grundstenarna i detta examensarbete har hela tiden varit att<br />
undersöka vad som går att göra med endast de resurser som gemene datoranvändare har till sitt<br />
förfogande.<br />
Den praktiska delen av det här arbetet har bestått i att utveckla en modell för ett <strong>bildtelefoni</strong>system<br />
samt att implementera delar av denna modell. Huvudsakligen har det gällt kompressionsdelarna,<br />
men även en symmetrisk krypteringsalgoritm (DES) samt en klient för bildanskaffning via<br />
TWAIN har implementerats. Andra implementationsdelar som studerats i detta arbete har varit<br />
alternativa metoder för bildanskaffning, överföring av bilddata på paketbaserade nät samt utbytesförhållanden<br />
mellan olika samverkande delar av arbetets mer komplicerade algoritmer.<br />
Det finns ett flertal naturliga förlängningar av detta arbete, exempelvis hur audiell information<br />
skulle inkorporeras i systemet eller hur systemet skulle kunna realiseras på en viss plattform. De<br />
verktyg som utvecklats i detta examensarbete har gjorts så i pedagogiskt syfte och står naturligtvis<br />
till andra studenter av ämnesområdets förfogande.<br />
Översikt<br />
Det här arbetet består huvudsakligen av tre delar, det inleds med en kortare introduktion till<br />
applikationsområdet <strong>bildtelefoni</strong>, där inledande definitioner och frågeställningar ställs upp. Efter<br />
detta följer en teoretisk genomgång av fälten kryptering och komprimering, var för sig och ur<br />
applikationsområdets synvinkel. Som tredje del finns sedan en diskussion av en modell för ett<br />
mjukvarurealiserat <strong>bildtelefoni</strong>system, där vissa utbytesförhållanden demonstreras med hjälp av<br />
4
programvara som tagits fram för pedagogisk effekt. Avslutningsvis finns en sammanfattning där<br />
arbetets mest påtagliga slutsatser och resultat redovisas.<br />
Arbetets upplägg har varit att skriva översiktligt för en målgrupp med teknisk bakgrund och med<br />
detaljdjup för läsaren med intresse för <strong>bildtelefoni</strong>. Förhoppningen är att materialet skall kunna<br />
fungera som en introduktion till ämnesområdet för den intresserade.<br />
5
Bildtelefoni<br />
Kommunikation människor emellan handlar mycket om information som oftast är svår att<br />
förmedla med begränsade media. Exempelvis tillför det visuella elementet mycket i mänsklig<br />
kommunikation, det underlättar processen att ta till sig information och tolka densamma.<br />
Människor lär sig redan under sin uppväxt att tolka andra människors ansiktsuttryck för att extrapolera<br />
ytterligare information utöver vad som ligger i det sagda ordet. En icke föraktlig del av<br />
information överförs också via förmågan att avläsa dolda meningar eller undertoner förmedlade<br />
med kroppsspråk och gester.<br />
Forskning inom fältet Människa – Dator Interaktion konstaterar att en av de mest önskvärda<br />
egenskaper för kommunikationssystem är förmågan att förmedla en känsla av närvaro för de<br />
kommunicerande parterna. Det är viktigt att definiera kommunikation i termer av upplevelse<br />
snarare än i termer av de media som används. Tyvärr finns det dock kraftiga begränsningar i de<br />
tekniska möjligheter som står till hand för att implementera kommunikation och det är framförallt<br />
samtidens lösningar på dessa som detta arbete fokuserar på. Dagens bästa kompromisser (vilka<br />
givetvis utgörs av datorbaserade system) använder sig av kameror, mikrofoner och datornätverk<br />
för att förmedla olika former av koordinerade hypermedia (såsom data, audiell och videoinformation),<br />
oftast med ansatsen att erbjuda så fri och ohämmad kommunikation som möjligt. I<br />
detta arbete har den audiella biten medvetet valts bort, detta för att kunna bortse från svårigheterna<br />
involverade i att upprätthålla synkronisering av den presenterade informationen (vilket främst är<br />
en utmaning mellan audio och video). Givetvis ignoreras inte detta viktiga media, telefonen är<br />
förmodligen det mest utbredda distanskommunikationsverktyget i historien – här antas dock helt<br />
enkelt att den audiella informationen överförs via en icke här definierad separat kanal vars bruk<br />
inte inverkar på de komponenter som tas upp i detta arbete.<br />
Vad är <strong>bildtelefoni</strong>?<br />
Bildtelefoni är med lite välvilja i sig en gammal tanke som omnämnts i litteratur sedan åtminstone<br />
första halvan av 1800–talet och demonstrerades praktiskt av Bell Telephone Laboratories redan i<br />
början på 1930–talet. Det som diskuterades då var telefoni med en visuell komponent, d.v.s. att det<br />
utöver en audiell tvåvägskommunikation även fanns en visuell presentation av sin motpart. Den<br />
definition av <strong>bildtelefoni</strong> som används i det här arbetet har av praktiska skäl utöver detta även lagt<br />
till en del detaljer såsom att kameran är fixt monterad, att det är begränsad rörlighet i bilden samt<br />
att slutanvändaren är mänsklig. Denna utökning gör området <strong>bildtelefoni</strong> till ett förhållandevis<br />
tacksamt område att arbeta med eftersom detta gör det möjligt att anta en hel del om hur bilderna<br />
genereras och vad de innehåller. Detta innebär i praktiken betydligt mer effektiv kompression än<br />
då en godtycklig videosignal skall bearbetas.<br />
Omfattande forskning har utförts på detta område då det naturligt finner ett mycket brett spektra av<br />
användningsområden kring mänsklig kommunikation över avstånd, inte minst bland de hörselskadade<br />
vilka inte kan förlita sig på enbart audiell information för kommunikation. Verktygen<br />
inom detta fält finner också användningar bland närbesläktade områden såsom automatisering,<br />
övervakning och underhållning.<br />
6
Vad är ett <strong>bildtelefoni</strong>system?<br />
Centralt i <strong>bildtelefoni</strong>system är kommunikationsklienten, vilken utöver audiell och visuell<br />
information även också ofta erbjuder möjlighet att utbyta filer, textmeddelanden och att dela ett<br />
gemensamt ritblock. Ofta finns det även en eller flera former av katalogtjänster där användare av<br />
systemet kan presenteras sig själv, se vilka användare som använder systemet för tillfället samt gå<br />
med i diskussionskanaler orienterade efter ämnen. Vanligtvis fungerar kommunikationsklienten<br />
fristående från katalogtjänsters infrastruktur och går att använda fullt ut utan denna, men i en<br />
ständigt växande kommunikationsvärld är ofta dessa eller något motsvarande nödvändigt för att<br />
smidigt lokalisera ens kommunikationspart.<br />
Vad är säkerhet?<br />
Definitionen av säkerhet varierar stort från person till person, organisation till organisation samt<br />
(inte minst) från applikation till applikation. Det brukar sägas att säkerhet inte är en lösning utan<br />
ett pågående arbete, där hotbilder mot ens verksamhet kontinuerligt får identifieras och uppdateras.<br />
Viktigt är även att identifiera vilken nivå av säkerhet som är önskvärd – i en värld där ledningar<br />
kan kapas, radiovågor avlyssnas och krypteringar knäckas är absolut säkerhet en utopi. Vad som<br />
istället bör eftersträvas är att etablera den nivå av säkerhet som är rimlig för den kostnad som kan<br />
accepteras.<br />
Idiomet ”Det finns inget system som är idiotsäkert så länge det är människor som använder det”<br />
håller sant. Hur genialiskt ett system än är designat finns det alltid brister i det – ofta faller system<br />
genom att det oavsiktligt används på fel sätt eller helt enkelt medvetet korrumperas av dess<br />
användare.<br />
Det är viktigt att vara medveten om behovet av flera olika lager av säkerhet – ett företags virtuella<br />
privata nät (som krypterar kommunikationen mellan företagets kontor) skyddar exempelvis inte<br />
dess anställda mot arbetsgivarens egna försök att avlyssna dem. Varje enskild applikation bör<br />
utveckla sitt egna och självständiga säkerhetssystem då robust säkerhet eftersträvas.<br />
Vad är säkerhet inom <strong>bildtelefoni</strong>?<br />
Som i alla kommunikationssystem kan den information som överförs i <strong>bildtelefoni</strong> vara av privat<br />
eller i övrigt hemlig natur och bör skyddas mot de hot som finns vid överföring över Internet av<br />
idag. Exempel på dessa är avlyssning, identitetsförfalskning, sessionsövertagande med mycket<br />
mera. Det idag enda praktiska alternativet som erbjuder en lösning för de flesta av dessa problem<br />
består av en kombination av olika former av kryptering – asymmetrisk kryptering för autenticering,<br />
signering och utväxling av sessionssnycklar samt symmetrisk kryptering för skydd av<br />
kommunikationskanalen. Kryptering bör i ett <strong>bildtelefoni</strong>system implementeras så transparent för<br />
slutanvändaren som möjligt – kommunikationsparternas identiteter är det enda som slutanvändaren<br />
behöver veta något om säkerhetsmässigt sätt.<br />
För de som har möjligheten och behovet av att göra så är det naturligtvis även möjligt att dra egna<br />
ledningar och skydda dessa mot dylika hot, men eftersom detta är en oerhört kostsam lösning så<br />
brukar detta endast göras då även bandbreddsbehoven kräver detta. Det är betydligt billigare att<br />
använda virtuella privata nät och andra krypteringslösningar för att undvika farorna med publika<br />
nät. Dras egna ledningar för att undvika avlyssning är för övrigt fiberledningar att föredra eftersom<br />
dessa är avsevärt svårare att avlyssna jämfört med vanliga kopparledningar (där ledningens<br />
inducerande magnetfält kan användas för avlyssning utan att störa datatrafiken eller på annat vis<br />
röja avlyssnaren).<br />
7
Komprimering och kryptering som företeelser<br />
Även om de vid första anblicken verkar vara två vitt skilda områden, så har komprimering och<br />
kryptering en hel del gemensamt. Båda är beräkningsintensiva, arbetar ofta på stora datamängder<br />
och strävar efter att reducera redundans i de datamängder de opererar på – dock för skilda syften.<br />
En komprimering strävar efter att identifiera strukturer hos data i syfte att kunna beskära eller<br />
representera detsamma på ett mer effektivt vis och därigenom minska storleken hos representationen.<br />
En kryptering strävar efter att eliminera redundans hos datamängden i syftet att obfuscera<br />
data till oigenkännlighet, oftast utan att förändra storleken på det producerade resultatet.<br />
Ifall båda dessa komponenter existerar i ett system så bör alltid kompressionen appliceras före<br />
krypteringen! Motivationen för detta ligger i att komprimeringsprocessen är beroende av den inneboende<br />
dataredundansens struktur för att kunna erbjuda någon effektiv kompression, men noteras<br />
bör även att säkerheten i ett krypteringssystem kan öka genom att applicera en komprimering på<br />
data före krypteringen. Detta eftersom komprimering i sig en reducerar redundansen, vilket<br />
försvårar en av de första metoderna för en attack mot systemet baserat på kryptoanalys – att<br />
försöka gissa sig till eller tolka innehållet i det skyddade materialet baserat på dess struktur.<br />
Som processer betraktat kan komprimering och kryptering båda ses som transformationer som<br />
översätter data mellan olika värdedomäner, men det ligger en viktig skillnad mellan de två även<br />
här. En kryptering måste per definition vara fullständigt reversibel 1 , d.v.s. med inga andra verktyg<br />
än dekrypteringsalgoritmen (och dess eventuella parametrar) skall det vara möjligt att återskapa<br />
ursprungsdata utan avvikelser. Detsamma gäller inte för komprimering då det finns klasser av<br />
komprimeringsalgoritmer som arbetar enligt hypotesen att det i data finns irrelevanta portioner<br />
som kan beskäras utan att introducera alltför stora fel i återskapat data. Dessa inriktar sig istället på<br />
att resultera i en, för den aktuella applikationen, acceptabel approximation av ursprungsdata.<br />
Kompressionsalgoritmer brukar på detta vis klassificeras i de två undergrupperna förlustfria och<br />
dataförstörande kompressionsalgoritmer, där de förstnämnda är reversibla och de övriga inte.<br />
Relationsmässigt kan detta ses som att förlustfri komprimering har en 1–1 relation mellan<br />
ursprungsdata och komprimerat data, medan dataförstörande algortimer har en n–1 relation (flera<br />
datauppsättningar kan resultera i samma komprimerade data givet samma algoritm). Krypteringar<br />
har med samma resonemang också en 1–1 relation mellan indata och utdata.<br />
1 Det finns en klass av krypteringsalgoritmer som kallas envägskrypteringar som inte är reversibla.<br />
Dessa är dock ämnade att användas som hashfunktioner och därför inte menade att kunna<br />
dekrypteras.<br />
8
Kryptering<br />
Motiv för kryptering<br />
Dagens kommunikationsnätverk går mer och mer mot användandet av paketbaserade nät, där slutanvändaren<br />
inte har någon kontroll över (eller sällan ens information om) vilken väg paketen tar.<br />
Det naturliga exemplet på detta är Internet, vilket till majoriteten består av IP–baserade nät, där<br />
avlyssning i olika former inte längre är en möjlighet utan snarare en realitet. Introduktionen av<br />
kryptering ger inte här enbart ett skydd mot avlyssning utan skapar även en hel rad andra<br />
funktioner såsom innehållsverifikation, användarautenticering och meddelandesignering. Dessa<br />
tekniska grundstenar möjliggör i sin tur förflyttandet av många av vardagliga mänskliga aktiviteter<br />
till det elektroniska mediet. Exempel på detta är kommunikation, handel, demokratiska val med<br />
mycket mer. De krypteringsmetoder som är allmänt tillgängliga idag erbjuder om än inte ett<br />
absolut skydd så väl garantin att den information som krypteras kommer att vara skyddad länge<br />
nog för att den skall hinna bli inaktuell innan någon knäcker din kryptering. Detta dessutom<br />
föresatt att den som vill knäcka en kryptering är intresserad nog av detta att lägga ner mycket<br />
pengar, tid och resurser på detta – oftast utan någon slags garanti att lyckas. Naturligtvis förutsätter<br />
alla dessa resonemang att kryptering används på ett korrekt vis, något som tyvärr har visat sig vara<br />
eftersatt i många stora applikationer av idag.<br />
För en utförligare överblick över kryptering och dess användning se [15], [19], [21], [22] och [23].<br />
[13] och [14] erbjuder en god introduktion till det praktiska användandet av kryptering (sett ur<br />
Java–programmerarens perspektiv).<br />
Vad är en krypteringsalgoritm?<br />
Den definition av en krypteringsalgoritm som tidigare nämndes var en reversibel funktion som<br />
efter ett förbestämt mönster obfuscerade data och eliminerade redundans. Denna definition är dock<br />
på intet vis absolut och varierar ofta med tillämpningens krav på krypteringsalgoritmen.<br />
Några klassiska exempel på krypteringalgoritmer är Spartanernas scytales och romarnas Caesar–<br />
skiffer, vilka användes i antiken av militärer för att kryptera meddelanden som skulle överföras<br />
med kurir.<br />
Spartanernas scytale var en träkäpp vilken konstruerades till identiska dimensioner i två exemplar<br />
– en för avsändare och en för mottagare. Krypterade meddelanden skapades genom att en remsa<br />
lindades upp på käppen och meddelandet skrevs i käppens längdriktning (d.v.s. vinkelrätt mot<br />
remsans lindningsriktning med ett tecken per lindningsvarv och rad). När remsan sedan lindades<br />
av käppen så tedde den sig som en remsa med godtyckliga tecken och var oläslig utan mottagarens<br />
käpp. Scytalen är ett exempel på ett transpositionsschiffer, där tecknen i meddelandet ordnas om<br />
efter en i förväg given metod. Transpositionsschiffrens svaghet är att om metoden för hur meddelandet<br />
ordnats om röjs så röjs även meddelandet.<br />
Ett exempel på en liknande metod som kallas substitutionschiffer är romarnas Casear–skiffer. Ett<br />
substitutioneschiffer obfuscerar ett meddelande genom att varje tecken bytes mot ett annat efter en<br />
i förväg uppgjord mall. Caesar–skiffren skapade denna mall genom att cykliskt förskjuta bokstäverna<br />
i alfabetet ett visst antal steg. Exempelvis var Caesar +3 en kod som försköt dem tre steg – a<br />
byttes ut mot d, b mot e osv. Svagheten hos substitutionsschiffer är att det inte är en oöverkommelig<br />
svårighet att gissa sig fram till vilket tecken som byts ut mot vilket. En metod för att<br />
göra detta baserar sig på att studera tecknens relativa förekomst i meddelandets språk, vilken<br />
bevaras även om tecknen i sig bytes ut. Även tecknens grupperingar i meddelandet kan ge led-<br />
9
trådar till innehållets natur, exempelvis är ett tecken som förekommer två gånger efter varandra i<br />
det svenska språket med hög sannolikhet en konsonant.<br />
En lite mer modern ansats för att kryptera meddelanden som uppstod i slutet av första världskriget<br />
kallas engångsblock (One–Time Pads), vilket får sitt namn från att ett block av samma storlek som<br />
meddelandet och innehållande en sträng av godtyckliga tecken tas fram och används för att kryptera<br />
varje meddelande. Detta schiffer baseras på Vignere–schiffret (även känt som Le Chiffre Indechiffrable)<br />
och fungerar så att varje tecken i meddelandet bytes ut mot ett tecken som slås upp i en<br />
tabell med blocktecknets plats i alfabetet som tabellindex. Denna metod benämns ibland som den<br />
ideala krypteringen och är teoretiskt hållbar förbehållet att engångsblocken tagits fram fullständigt<br />
slumpmässigt! Detta (fullständig slumpmässighet) visar sig dock vara ett praktiskt problem eftersom<br />
det idag saknas matematiska metoder för att generera äkta slumptal – idag används istället<br />
matematiska talserier för att generera s.k. pseudoslumptal. Det stora praktiska problemet med<br />
denna ansats är dock distributionen av de i förväg konstruerade engångsblocken, vilka måste vara<br />
minst lika stora som meddelandet (vars storlek kanske inte är känd i förväg).<br />
Kryptering och kryptoanalys<br />
Historiskt sett har det förekommit många metoder för kryptering och minst lika många metoder för<br />
kryptoanalys, d.v.s. knäckande av kryptering. Klassisk kryptoanalys var en mycket tidsödande<br />
verksamhet där alla genvägar som gick att ta utforskades – en klassisk kryptoanalytiker studerade<br />
meddelandets avsändare, struktur, språk och krypteringsmetod för att få ledtrådar till meddelandets<br />
innehåll. Av denna och många andra anledningar använder sig därför dagens krypteringssystem av<br />
numeriska representationerna i det binära talsystemet av meddelanden, vilka krypteras på bitnivå<br />
istället för på teckennivå. Dessa metoder baserar sin säkerhet på matematiska egenskaper hos<br />
krypteringsalgoritmen snarare än försök att hemlighålla hur meddelandet framställts eller vad det<br />
innehåller. Kryptoanalys av idag består av försök att finna matematiska genvägar till dekryptering,<br />
vilket bedrivs som legitim akademisk och industriell forskning efter principen ”bevis genom avsaknaden<br />
av motbevis”, samt av (massivt parallella) försök att testa samtliga möjliga permutationer<br />
av krypteringsnyckeln för dekryptering. Denna senare metod kallas exhaustive key search eller<br />
brute force och förenklas stort ifall en del av meddelandet är känt. Den är dock även möjlig att<br />
använda om så inte är fallet genom att undersöka dekrypterat data och se om det är av något format<br />
som kan förväntas likna det som krypterats.<br />
Krypteringsstyrka<br />
Det antal olika krypteringsnycklar som maximalt måste testas i en brute force attack av en kryptering<br />
är 2 n , där n är antalet bitar i den binära representationen av krypteringsnyckeln. Matematiska<br />
krypteringars styrka brukar av denna anledning mätas i antal bitar i krypteringsnyckeln. Här bör<br />
noteras att krypteringens styrka beror på utbytesförhållandet mellan algoritmens exekveringshastighet<br />
(vilken förändras över tid med teknisk utveckling) och antal bitar i nyckeln, varför antal<br />
bitar i sig inte generellt kan användas som ett mått på önskad krypteringsstyrka. 256 bitars XOR<br />
kryptering kommer att vara mycket svagare än 256 bitars AES kryptering ända till dess AES kan<br />
beräknas lika snabbt som XOR. I vissa fall kan även matematiska svagheter i krypteringsalgoritmen<br />
användas för att reducera det antal permutationer som behövs testas i en brute force<br />
attack. Detta sägs då sänka krypteringens styrka.<br />
Noterbart för den tidigare nämnda metoden med engångsblock är att även om den har en mycket<br />
låg beräkningsintensitet (en XOR operation per byte) så är en brute force attack värdelös här – att<br />
testa varje möjlig permutation av krypteringsnyckel kommer att generera varje möjlig permutation<br />
av utdata eftersom nyckeln är fullständigt slumpmässig och lika lång som indata.<br />
10
Egenskaper hos en krypteringsalgoritm<br />
En mycket önskvärd egenskap hos en krypteringsalgoritm är förmågan att kunna använda nycklar<br />
av olika storlek – genom att förändra krypteringsnyckelns storlek kan en krypterings styrka<br />
anpassas för att förlänga dess livstid. Detta resonemang förutsätter dock att även algoritmens<br />
beräkningskomplexitet (läs exekveringshastighet) kan anpassas efter den hårdvara som finns tillgänglig<br />
när den skall användas. Beräkningsintensiteten hos en krypteringsalgoritm bör med andra<br />
ord (tillsammans med nyckelstorleken) vara anpassad sådan att den dels är så snabb att den går att<br />
använda transparent och dels ändå är så långsam att den tar opraktiskt lång tid att attackera med en<br />
brute force metod. På grund av detta (och andra matematiska anledningar) brukar krypteringsalgoritmer<br />
ibland designas till att vara mycket komplexa eftersom detta försvårar konstruktionen<br />
av specialiserad hårdvara som utför krypteringsoperationer i mycket hög hastighet (och därmed<br />
kan användas för attacker av algoritmen).<br />
I design av asymmetriska krypteringsalgoritmer kan ett liknande resonemang användas för att<br />
belysa ett annat utbytesförhållande. Där gäller att om krypteringsprocessen är (mycket) snabbare<br />
än dekrypteringsprocessen så ökas livslängden för algoritmen avsevärt av samma anledning.<br />
Viktigt att komma ihåg i de här resonemangen är att målet med en kryptering inte är att uppnå<br />
absolut säkerhet utan bara att fördröja när meddelandet blir känt tills dess det inte längre är av<br />
intresse för någon.<br />
En annan och mer matematisk egenskap som är önskvärd hos en krypteringsalgoritm är att den<br />
skall ha en hög lavineffekt. Med detta avses att förändring av ett litet antal bitar i indata skall ge en<br />
förändring av ett stort antal bitar i utdata för samma krypteringsnyckel. Idealiskt skall hälften av<br />
bitarna i utdata förändras när en av bitarna i indata ändras – matematiskt uttryckt maximerar detta<br />
variansen för utdata (eller minimerar redundansen i indata).<br />
Grundantagandet för en matematisk krypteringsalgoritm är att det är den enda (eller åtminstone<br />
den enklaste eller snabbaste) algoritm som givet indata och krypteringsnyckel genererar utdata.<br />
11
Symmetrisk kryptering<br />
Symmetrisk kryptering får sitt namn från att kryptering och dekryptering är symmetriska processer<br />
– dekryptering är ofta inversen av kryptering och samma nyckel används i båda fall. Symmetrisk<br />
kryptering kallas även av denna anledning för hemlig nyckel kryptering eftersom den använda<br />
nyckeln hålls hemlig av de parter som delar den.<br />
De flesta av dagens symmetriska krypteringsalgoritmer består av komplexa blockschiffer som<br />
opererar på binärt data och itererar flera operationer designade att göra det så svårt som möjligt att<br />
(utan krypteringsnyckel) återskapa indata från utdata.<br />
Blockskiffer<br />
Ett blockskiffer är en krypteringsfunktion som översätter ett givet indatablock till ett krypterat<br />
utdatablock av samma storlek. Storleken på dessa datablock är oftast fix för algoritmen och därför<br />
brukar större datablock delas upp i flera mindre block av den rätta storleken. Krypteras ett datablock<br />
som är mindre än algoritmens blockstorlek brukar något slags paddningschema användas för<br />
att se till att få ett jämt antal bitar i blocket. Vid dekryption av blocket så antas detta paddningsschema<br />
vara känt och dessa extra bitar tas bort vid återskapande av ursprungsmeddelandet.<br />
Typiska storlekar på datablock för dagens blockskiffer är 64 eller 128 bitar.<br />
Symmetrisk kryptering med blockskiffer illustreras med<br />
där<br />
C = E(K, M)<br />
M = D(K, C)<br />
E står för encryption eller kryptering<br />
D står för decryption eller dekryptering<br />
C är ciphertext eller krypterat data<br />
M är meddelande eller okrypterat data<br />
K står för key eller krypteringsnyckel<br />
För att ytterligare höja säkerheten i blockskiffer kan även olika former av kedjekodning användas<br />
för att försvåra attacker på individuella block i meddelandet. Om exempelvis alla block logiskt<br />
kombineras (via XOR) med föregående blocks krypterade motsvarighet (och det första blocket<br />
kombineras med ett i förväg bestämt block kalla initialiseringsvektor) innan kryptering, så skapas<br />
en blockkedja av meddelandet. I denna blockkedja är alla block beroende av tidigare block. För att<br />
läsa den första meningen i detta meddelande måste därför alla block i meddelandet dekrypteras<br />
(samt initialiseringsvektorn vara känd), från sista till första. Vore de inte kedjade så skulle det<br />
räcka med att dekryptera det första blocket för att läsa den första meningen i meddelandet. Denna<br />
specifika metod av kedjning kallas Cipher Block Chaining mode (CBC) och används ofta tillsammans<br />
med exempelvis DES kryptering. Kryptering av block utan kedjning kallas Electronic<br />
Code Book mode (ECB).<br />
Det går även att till viss del att höja säkerheten i ett krypteringssystem genom att upprepa kryptering<br />
av samma block flera gånger med olika nycklar. Detta ger dock inte säkerhetsmässigt samma<br />
resultat som att använda samma algoritm med en tre gånger så lång nyckel och kan resultera i<br />
svagare kryptering om en s.k. svag nyckelkombination används. Det är heller inte alla blockskiffer<br />
som går att använda på detta vis. Ett exempel på denna ansats är trippel DES (eller 3DES), vilken<br />
använder tre stycken nycklar för att kryptera, dekryptera och sedan återigen kryptera samma block.<br />
12
På samma vis illustreras detta med<br />
C = E(K3, D(K2, E(K1,M)))<br />
M = D(K1, E(K2, D(K3,C)))<br />
Där K1, K2 och K3 är de tre krypteringsnycklar som används<br />
Strömskiffer<br />
Ett strömskiffer är ett skiffer som designats till att vara mycket snabbt och arbeta på små datamängder<br />
(grupper av bitar) åt gången som extraherats ur dataströmmar. Till skillnad från blockskiffer<br />
där samma datablock alltid krypteras till samma kryptoblock för en given nyckel så är<br />
strömskiffers krypterade data även beroende av när i dataströmmen det krypterats. Strömskiffer<br />
krypterar vanligen genom att generera en nyckelström och sedan logiskt kombinera denna med<br />
dataströmmen med XOR eller någon liknande (snabb) funktion.<br />
Strömskiffer illustreras på samma vis som blockskiffer<br />
C = E(KS, M)<br />
M = D(KS, C)<br />
Med skillnaden att KS betecknar den nyckelström som används för kryptering istället för en fast<br />
nyckel.<br />
Engångsblock i strömskifferform erbjuder teoretiskt ideal kryptering men används sällan eftersom<br />
den är omständlig att använda i praktiken – nyckelströmmen skall genereras fullständigt slumpmässigt,<br />
vara lika lång som dataströmmen, användas endast en gång samt distribueras till alla<br />
mottagare fullständigt säkert. Dagens vanligaste strömskiffer är RC4 vilken erbjuder en mer praktisk<br />
lösning på dessa problem men samtidigt då tvingas göra avkall på säkerheten.<br />
Det finns även ett kedjekodningsschema kallat Cipher Feedback mode (CFB) vilket låter i stort<br />
vilket blockskiffer som helst att fungera som en nyckelgenerator för strömskiffer. Detta dock oftast<br />
utan den efterfrågade hastigheten i krypteringen.<br />
Data Encryption Standard (DES)<br />
ANSI standard nummer X9.32 (även känd som Federal Information Processing Standard (FIPS)<br />
46–3) definierar en algoritm som vanligen benämns the Data Encryption Standard, eller DES.<br />
Detta är en av världens mest kända och använda krypteringsalgoritmer som finns representerad i<br />
ett flertal standarder. DES tillkom när amerikanska myndighetsorgan i början av 1970–talet vidareutvecklade<br />
en algoritm från IBM som hette Lucifer.<br />
DES är ett blockskiffer som använder sig av 64 bitars datablock och 56 bitars nyckel (egentligen<br />
64 bitar där nyckelns paritetsbitar tagits bort). Innan kryptering påbörjas permuterar DES nyckeln<br />
till ett längre nyckelschema efter en algoritm bestående av rotationer och substitutionsboxar (vilka<br />
i dagligt tal kallas S–boxar). Eftersom en cyklisk rotation går att uttrycka som en substitution går<br />
denna algoritm att förenkla till kombinationen av nyckeln och en enda S–box per instans i nyckelschemat.<br />
Själva krypteringen i DES består av en initial permutation följd av 16 stycken iterationer av algoritmen<br />
nedan och avslutas sedan med en sista permutation (vilken är inversen av den initiala).<br />
13
1) dela det 64 bitar långa datablocket i två lika stora delar<br />
2) expandera den högra halvan av datablocket till 48 bitar<br />
3) kombinera dessa 48 bitar med en del av nyckelschemat (via XOR)<br />
4) dela in de 48 bitarna i 8 lika stora delar och applicera DES S–boxarna på dem<br />
5) konkatenera resultaten från S–boxarna till en 32 bitars sträng<br />
6) permutera dessa 32 bitar enligt ett givet schema<br />
7) kombinera de resulterande 32 bitarna slutligen med den vänstra halvan från 1)<br />
8) byt plats på högra och vänstra halvan av datablocket inför nästa permutation<br />
Dekryptering i DES går till på samma sätt som kryptering, med skillnaden att de 16 iterationerna<br />
utförs med nyckelschemat i omvänd ordning.<br />
DES säkerhet har under hela dess livstid debatterats och det har visats att DES är känslig för olika<br />
typer av matematiska attacker. Under januari 1999 bröts en generell DES–baserad kryptering på<br />
22 timmar med hjälp av exhaustive key search och DES betraktas nu som mer eller mindre<br />
föråldrad.<br />
För mer information om DES se [8], [19] och [22].<br />
Advanced Encryption Standard (AES)<br />
1997 utlyste ett amerikanskt myndighetsorgan kallat the National Institute of Standards and Technology<br />
(NIST) något som kallades the AES initiative. Detta var en form av tävling, där forskare<br />
och privatpersoner världen över inbjöds till att konstruera en krypteringsalgoritm designad för att<br />
ersätta DES. Kriterierna var (förenklat) att tävlingsbidragen skulle gå att använda på samma vis<br />
som DES, kryptera med 128, 192 respektive 256 bitars nycklar samt operera på 128 bitars datablock.<br />
Under 2000 utsågs algoritmen Rijndael (dubbad så efter dess belgiska skapare Joan Daemen<br />
och Vincent Rijmen) som vinnare och har sedan dess etablerats som en standard för blockskiffer.<br />
AES består av ett linjärt substitutionsnätverk vilket itereras 10, 12 eller 14 gånger beroende på<br />
nyckelns storlek. AES arbetar på 128 bitars datablock och kan använda nycklar av storlek 128, 192<br />
eller 256 bitar. Ett datablock som skall krypteras med AES delas upp i byte–baserade matriser<br />
vilka sedan behandlas parallellt. Den interna del av AES som itereras består av fyra lager – en 8 · 8<br />
S–box, två lager där matrisens rader skiftas och kolumnerna blandas (genom en multiplikation<br />
med en konstantmatris) samt slutligen ett lager där matrisens element logiskt kombineras (via<br />
XOR) med cykliskt nyckeldata. Kolumnblandningen utförs ej under den sista iterationen.<br />
AES erbjuder för närvarande mycket god säkerhet med sina variabla nyckelstorlekar, är (ännu)<br />
inte känsliga för några matematiska attacker och är designad på ett vis som gör den lämplig för ett<br />
brett spektra av applikationer (vilka sträcker sig från generell datorbaserad kryptering till implementation<br />
på smartcards). AES kan använda, men är inte beroende av, alla DES operation modes.<br />
För mer information om AES se [7] och [19].<br />
14
Asymmetrisk kryptering<br />
Asymmetrisk kryptering får sitt namn från att kryptering och dekryptering är asymmetriska processer<br />
– kryptering och dekryptering är matematiska funktioner och är inte besläktade annat än<br />
genom att dess resultat är varandras inverser. Man talar även om asymmetriska nycklar eller<br />
nyckelpar eftersom det inte är samma nyckel som används för dekryptering som för kryptering.<br />
Dessa nycklar benämns som publika / privata nyckelpar och krypteringen även därför som publik<br />
nyckel kryptering.<br />
Diffie–Hellman<br />
1976 lade Diffie och Hellman fram idén om att till skillnad från tidigare då en hemlig nyckel (som<br />
användes för både kryptering och dekryptering) istället ha en publik nyckel som sprids och en<br />
privat nyckel som hålls hemlig. Tanken var att båda nycklar skulle behövas i systemet, en för<br />
kryptering och den andra för dekryptering. Vad den här tankegången tillförde var två nya funktioner.<br />
Dels blev det nu möjligt att kryptera ett meddelande så att endast den tänkta mottagaren kunde<br />
läsa det och dels tillhandahölls en metod för att autenticera avsändaren genom att signera meddelandet!<br />
För att kryptera ett meddelande som endast mottagaren kan läsa så krypteras det med mottagarens<br />
publika nyckel. Endast mottagaren antas ha tillgång till sin privata nyckel och är därför ensam om<br />
att kunna dekryptera meddelandet. För att signera ett meddelande som endast kan ha skickats av<br />
avsändaren krypteras meddelandet med avsändarens privata nyckel. Meddelandet blir då endast<br />
läsbart om det dekrypteras med avsändarens publika nyckel, vilken alla mottagare antas ha tillgång<br />
till. För att verifiera en signatur behövs både meddelandets signatur och meddelandet själv – detta<br />
sker genom att dekryptera signaturen och se att resultatet (verifikatet) överensstämmer med det<br />
ursprungliga meddelandet.<br />
Asymmetrisk kryptering illustreras med<br />
Där<br />
C = E(KP, M)<br />
M = D(KS, C)<br />
S = E(KS, M)<br />
V = D(KP, S)<br />
E står för encryption eller kryptering<br />
D står för decryption eller dekryptering<br />
C är ciphertext eller krypterat data<br />
M är meddelande eller okrypterat data<br />
S är signaturen för meddelandet M<br />
V är verifikatet av S, V = M om M är oförändrat<br />
KP står för public key eller publik krypteringsnyckel<br />
KS står för secret key eller hemlig krypteringsnyckel<br />
(KS, KP) utgör tillsammans ett asymmetriskt nyckelpar<br />
Det är även möjligt att kombinera dessa funktioner för att skapa meddelanden som är både<br />
signerade och krypterade. Detta illustreras på motsvarande vis med<br />
C = E(KPB, E(KSA, M))<br />
M = D(KSB, D(KPA, C))<br />
15
där<br />
KPA är part As publika krypteringsnyckel<br />
KSA är part As hemliga krypteringsnyckel<br />
KPB är part Bs publika krypteringsnyckel<br />
KSB är part Bs hemliga krypteringsnyckel<br />
Notera att om en signatur skall användas för att verifiera att ett meddelande inte har förändrats så<br />
bör meddelandet även översändas tillsammans med signaturen. Alternativt kan en kryptologisk<br />
checksumma användas för detta.<br />
För mer information om RSA se [18], [21] och [22].<br />
Hybridsystem<br />
Viktigt att notera är att symmetrisk och asymmetrisk kryptering är menade att komplettera, inte<br />
ersätta varandra. Asymmetrisk kryptering tillför många praktiska funktioner till krypteringssystem<br />
men är också svåra att implementera effektivt nog att använda i många applikationer. Symmetrisk<br />
kryptering är dock jämförelsevis oftast mycket snabb och av denna anledning brukar dessa båda<br />
användas i kombination i hybridsystem.<br />
Det stora problemet med symmetrisk kryptering är att både avsändare och mottagare av hemliga<br />
meddelanden i förväg måste enas om den nyckel som krypteringen skall använda, något som är<br />
känt som nyckelspridningsproblemet. Med asymmetrisk kryptering kan denna problematik övervinnas<br />
eftersom både sändare och mottagare kan utnyttja asymmetriskt krypterade och signerade<br />
meddelanden för att utväxla en temporär sessionsnyckel att använda för symmetrisk kryptering av<br />
en kommunikationskanal.<br />
Man in the middle<br />
Nyckelspridningsproblemet är dock inte fullständigt löst med asymmetrisk kryptering – det finns<br />
fortfarande risken att någon ställer sig mellan sändare och mottagare och inför båda utger sig att<br />
vara den andre. Detta kallas en man in the middle– eller en proxy–attack och är möjligt om avsändaren<br />
(som antas initiera kommunikationen) inte redan har mottagarens publika nyckel utan måste<br />
slå upp den i en publik katalog. Angriparen ser till att avsändaren då får angriparens publika<br />
nyckel istället för mottagarens och utger sig därefter för att vara mottagaren inför avsändaren. På<br />
samma vis, efter att ha dekrypterat, läst (möjligen ändrat) och krypterat om avsändarens meddelande,<br />
utger han sig sedan inför mottagaren att vara avsändaren. Eftersom angriparen har fullständig<br />
kontroll över kommunikationskanalen kan denna inte användas till att verifiera<br />
kommunikationspartens identitet. Man in the middle–attacker kan användas till avlyssning,<br />
sessionsövertagande, förfalskade meddelanden och i förlängningen även till att utföra fler liknande<br />
attacker mot andra (där angriparen förfalskar ett intyg från avsändaren eller mottagaren att han är<br />
någon annan).<br />
Avsändare Angripare Mottagare<br />
Figur 1. Man in the middle–attack<br />
16
Certifieringssystem<br />
Den mest spridda lösningen på den här problematiken är att använda certifieringssystem som<br />
består av pålitliga enheter kallade certifieringsenheter (Certificate Authority eller CA).<br />
Certifieringsenheter utfärdar certifikat som garanterar att en viss publik nyckel verkligen hör till en<br />
viss identitet. Dessa certifikat innehåller en kedja av publika nycklar, där varje nyckel är signerad<br />
av den föregående och den första i kedjan är certifieringsenhetens egna publika nyckel signerad av<br />
sig själv. Certifieringsenhetens publika nyckel antas vara känd av alla och i distribueras i praktiken<br />
med webläsare och andra programvarupaket för kommunikation. Denna lösning kräver dock att<br />
alla mottagare av sessionsinitieringar är kända hos någon certifieringsenhet, något som i praktiken<br />
ännu endast håller för större websiter och företag. Alternativa lösningar för spridning av publika<br />
nycklar som är populära hos privatpersoner inkluderar via signaturer i email, publicering på websidor<br />
samt via elektroniska visitkort.<br />
Implementation av asymmetrisk kryptering<br />
När Diffie och Hellman lade fram idén och designade grundläggande protokoll för asymmetrisk<br />
kryptering så specificerade de bara systemet i det abstrakta – de hade ingen färdig metod att implementera<br />
ett sådant system. System för asymmetrisk kryptering baserar sig på matematiska problem<br />
som är beräkningsmässigt svåra att lösa och har vissa specifika karaktäristika. Envägsfunktioner<br />
(one–way functions) är funktioner som är lätta att lösa åt ena hållet men avsevärt mycket svårare<br />
att lösa åt det andra är önskvärda. En underklass till dessa funktioner är lönndörrsfunktioner (trapdoor<br />
one–way functions), där det existerar en genväg (lönndörr) för lösningen från det svåra hållet<br />
– givet viss information om problemet går det enkelt att lösa även från det svåra hållet. Dagens<br />
system för asymmetrisk kryptering baserar sig på sådana lönndörrsfunktioner, där själva lönndörren<br />
utgör den privata nyckeln. Kryptering och signaturverifikation använder sig av den publika<br />
nyckeln medan dekryptering och signaturgeneration använder sig av den privata nyckeln, och<br />
därmed är mycket svårt att utföra utan lönndörren.<br />
Värt att notera är att de system som idag används för asymmetrisk kryptering baserar sig på<br />
problem som antas vara mycket svåra att lösa utan tillgång till lönndörr, avsaknaden av en<br />
”generell lönndörr” har dock vare sig bevisats eller motbevisats för dessa problem. Skulle en sådan<br />
upptäckas för ett specifikt problem (d.v.s. om ett sätt att lösa problemet utan lönndörr skulle upptäckas)<br />
skulle de system som baseras på det problemet omedelbart bli värdelösa för krypteringsapplikationer.<br />
RSA<br />
Rivest, Shamir och Adleman skapade och gav 1977 namn åt RSA, vilket idag är i det närmaste en<br />
de facto standard när det gäller val av algoritm för asymmetrisk kryptering. Det svåra problem de<br />
använde i algoritmen var primtalsfaktorisering, d.v.s. att givet produkten av två stora primtal finna<br />
dessa primtal.<br />
Nyckelgeneration i RSA fungerar enligt följande<br />
Välj två stora primtal, p och q, och beräkna deras produkt n = p · q.<br />
Välj sedan ett tal e som är mindre än n och relativt primt till (p – 1) · (q – 1),<br />
(d.v.s. att gcd (e, (p – 1) · (q – 1)) = 1).<br />
Finn nu ytterligare ett tal d så att (e · d) – 1 är jämnt delbart med (p – 1) · (q – 1).<br />
Den publika nyckeln är nu talparet (n, e) och den privata nyckeln är talparet (n, d).<br />
När sedan en nyckel är genererad så används den för av systemet enligt följande modell<br />
17
Kryptering: c = m e mod n<br />
Dekryptering: m = c d mod n<br />
Signering: s = m d mod n<br />
Verifiering av signatur: v = s e mod n<br />
Där m är ursprungsmeddelandet, c det krypterade meddelandet, s signaturen för meddelandet, v<br />
verifikatet för signaturen s samt mod och gcd de matematiska funktionerna modulo respektive<br />
största gemensamma nämnare. Givetvis i det signerade fallet måste avsändaren skicka både<br />
meddelandet och signaturen för meddelandet för att mottagaren skall kunna verifiera att signaturen<br />
stämmer (d.v.s. att meddelandet är oförändrat och verkligen kommer från avsändaren).<br />
Eftersom RSA använder sig av väldigt stora primtal (man brukar rekommendera primtal på<br />
åtminstone 512 bitar för p och q) så kan nyckelgeneration vara tidsödande. För att simulera en<br />
sannare slumpmässighet i denna process är det även brukligt att interaktivt låta användaren få<br />
bidra med ett fysiskt element, exempelvis genom att mäta rörelser och fördröjningar för datorns<br />
mus och använda dessa som initialvärden till slumpgeneratorn, för att assistera vid valet av dessa<br />
tal.<br />
Värt att nämna om RSA är också att det har rått viss debatt om huruvida speciell klass av primtal<br />
som kallas ”starka primtal” exklusivt bör användas för nycklar. Dessa starka primtal är primtal<br />
som matematiskt är svårare att faktorisera än andra, men den rådande uppfattningen i litteraturen<br />
brukar vara att det är viktigare att använda en tillräckligt stor nyckel än att bekymra sig för detta.<br />
Det har även tidigare funnits en del kritik mot RSAs säkerhet eftersom det varit svårt att avgöra<br />
om de stora talen p och q verkligen är primtal men på senare tid har det framkommit nya metoder<br />
för detta.<br />
För mer information om RSA se [19], [22] och [23].<br />
Elliptiska kurvor<br />
Det finns även en del andra ansatser till asymmetrisk kryptering än RSA såsom ElGamal, Merkl–<br />
Hellman knapsack och LUC. De mest intressanta alternativen kallas dock elliptiska kurv–system,<br />
efter den geometriska problemklass de använder sig av för krypteringsfunktionen. System för<br />
asymmetrisk kryptering baserade på elliptiska kurvor delas vanligen in i två kategorier efter de<br />
problemklasser de använder sig av, primtalsfaktorisering och diskreta logaritm problemet för<br />
elliptiska kurvor. Den förstnämnda av dessa använde sig av samma typ av problem som RSA och<br />
har i stort därför jämförbar prestanda med densamma. Den senare av dessa två baserar sig på<br />
diskreta logaritm problemet för elliptiska kurvor som formuleras som givet två punkter X och Y på<br />
en elliptisk kurva, finn k sådant att Y = k · X.<br />
Dessa varianter har rönt mer och mer uppmärksamhet de senaste åren och framförallt då den andra<br />
kategorin eftersom den erbjuder samma nivå av säkerhet som likvärdiga system för asymmetrisk<br />
kryptering (läs RSA) för kortare nycklar. Det finns heller inte (ännu) någon mer effektiv attack på<br />
dessa system än brute force. System baserade på elliptiska kurvor är relativt nya och ännu inte lika<br />
etablerade som RSA.<br />
Kryptologiska funktioner<br />
Krypteringssystem av idag erbjuder betydligt mer än bara kryptering och dekryptering av data.<br />
18
Idag talas det om autenticering, certifiering och signering som naturliga delar av asymmetriska<br />
krypteringssystem eftersom dessa funktioner erbjuder systemets användare mycket mer än bara<br />
avlyssningsskydd.<br />
När man talar autenticering så talar man om möjligheten för användare av systemet att säkert<br />
kunna identifiera sig själva och andra kommunicerande parter. Involveras certifiering så innebär<br />
det att låta en (redan autenticerad) tredje part garantera identiteten för en annan användare. Signering<br />
innebär att en användare låter placera en digital signatur på en uppsättning data som visar att<br />
meddelandet verkligen kommer från den användaren och inte har förändrats.<br />
Dessa funktioner kan kombineras för att generera meddelanden som verkligen kommer från en<br />
viss avsändare, inte har förändrats och dessutom endast kan läsas av den tilltänkta mottagaren,<br />
samt givetvis att både avsändare och mottagare autenticerats av pålitliga tredje parter. Alla dessa<br />
funktioner skapar tillsammans en plattform för asymmetrisk kryptering som möjliggör en mängd<br />
tjänster för användare av systemet. Dessa tjänster är inte alltid beroende av en kring dem existerade<br />
infrastruktur, men de brukar storligen underlättas av det. Denna infrastruktur, som då består<br />
av servrar för certifierings– och autenticeringssystem brukar generellt benämnas Public Key Infrastructure<br />
(PKI). Huvuduppgiften för denna infrastruktur är då att på ett säkert vis distribuera<br />
publika nycklar. En PKI sätts ofta upp av egna företag och organisationer och kan betraktas topologiskt<br />
på samma vis som dagens nätverk är uppbyggda – som samverkande självständiga<br />
segment.<br />
Hashfunktioner<br />
Kryptologiska hashfunktioner (även kallade message digests) är funktioner som från en datamängd<br />
beräknar ett hashvärde vilket har egenskaperna att det är enkelt att beräkna, (betydligt) mindre än<br />
datamängden, är unikt för den speciella datauppsättningen samt att det inte går att återskapa den<br />
ursprungliga datamängden från hashvärdet. Inom kryptering brukar hashfunktioner ofta användas<br />
för signering av data eftersom det går mycket snabbare att beräkna en hashfunktion för en datamängd<br />
och signera hashvärdet än att istället signera hela datamängden. Vanligen använda exempel<br />
på kryptologiska hashfunktioner är MD5 och SHA1.<br />
En underklass till kryptologiska hashfunktioner är envägskrypteringar (one–way encryption),<br />
vilket är en typ av kryptering som är icke reversibel, d.v.s. inte går att dekryptera. Dessa funktioner<br />
är istället tänkta att användas i situationer där det (exempelvis för verifikation) är nödvändigt att<br />
lagra känsligt data i en opålitlig miljö. Exempel på detta är lösenord i UNIX, vilka lagras<br />
krypterade med en envägskryptering som kort och gott kallas crypt. När en användare skall autenticeras<br />
så krypteras det av användaren tillhandahållna lösenordet med samma envägs kryptering<br />
och jämförs med det lagrade för verifiering.<br />
Message Authentication Codes (MACS)<br />
En Message Authentication Code (MAC) är en checksumma associerad med en krypteringsnyckel.<br />
Det finns fyra typer av MACs – absolut säkra, hashfunktions baserade, strömskiffer baserade och<br />
blockskiffer baserade – där namnen antyder hur checksumman är anskaffad 2 . Eftersom checksumman<br />
i MACen är konstruerad med hjälp av den associerade krypteringsnyckeln så är det<br />
endast de som har tillgång till den nyckeln som kan skapa eller verifiera den, vilket erbjuder skydd<br />
mot att någon skulle förändra ett meddelande innan det når mottagaren. Ett exempel på en<br />
Message Authentication Code är DES–CBC MAC vilken beräknar en kedjekodad DES kryptering<br />
på meddelandet med den associerade krypteringsnyckeln och spar det sista krypterade blocket i<br />
2<br />
Absolut säkra MACs använder engångsblock eller asymmetriska engångsnycklar för att generera<br />
checksummor<br />
19
kedjan som checksumma. På samma vis kan för övrigt de flesta blockskiffer (inklusive AES)<br />
användas för att beräkna MACs.<br />
Lager av säkerhet<br />
Även om ett skyddande yttre lager av kryptering används för att omsluta protokolltrafik är det inte<br />
alltid önskvärt att i klartext översända autenticeringsdata (såsom par av användarnamn och<br />
lösenord eller fingeravtrycksavläsningar) över nätverk. Skulle en eventuell angripare lyckas<br />
kringgå, exempelvis genom att scanna av internminnet på måldatorn eller lyssna av nätverkstrafiken<br />
innanför ett virtuellt privat nätverk (VPN), knäcka eller på annat vis forcera det yttre<br />
krypteringslagret så skulle denna person då ha direkt tillgång till all information som krävs för att<br />
skaffa sig tillträde till systemet. Även om det är svårt att uppnå i vissa fall bör ett robust säkerhetssystem<br />
inte vara designat på ett vis som gör att systemet sammantagna säkerhet fullständigt<br />
kollapsar om en del av det gör så. Detta brukar benämnas av varandra oberoende lager av säkerhet<br />
och visualiseras ofta som lager av skal på en lök. Eftersom de antal olika attacker som finns är<br />
minst lika många som de olika former av säkerhetsscenarios som implementerats är det viktigt att i<br />
sammanhanget komma ihåg att olika lager skyddar mot olika saker och behöver kombineras för att<br />
uppnå högsta möjliga säkerhet.<br />
Challenge–Response<br />
Ett sätt att skydda delat data består av att använda envägskrypteringar för känslig information.<br />
Detta innebär i lagringsfallet att data är oläsbart för en utomstående betraktare, men i överföringsfallet<br />
erbjuder en sådan lösning möjligheter för repetitionsattacker (där attacken består av att<br />
repetera tidigare inspelad information i syfte att återetablera en session). Ett bättre vis att skydda<br />
känsligt data vid autenticeringar över nätverk är då att implementera ett Challenge–Response<br />
scenario i protokollet. Detta antar att systemet är uppbyggd så att användare av systemet<br />
autenticeras av en hemlig kod (lösenord, fingeravtrycksavläsning eller liknande) som kombineras<br />
med en användaridentitet för access till systemet. Scenariot initieras genom att klienten kontaktar<br />
servern och översänder data som unikt identifierar användaridentiteten (vanligen ett användarnamn)<br />
som skall användas. Servern svarar med en slumpmässigt framtagen datamängd (kallad<br />
challenge eller utmaning) vilken klienten konkatenerar med den hemliga koden och beräknar en<br />
kryptologisk hashsumma på (kallad response eller svar). När klienten överför denna hashsumma<br />
till servern så utför servern samma beräkning på den hemliga kod som den har lagrad. När de två<br />
hashsummorna sedan jämförs kan användaren autenticeras eller refuseras – överensstämmer hashsummorna<br />
så har klienten och servern samma hemliga kod associerad med det angivna användarnamnet.<br />
Eftersom den kryptologiska hashfunktionen per definition är unik och inte går att<br />
reversera för att ta fram ursprungsdata så har användaren autenticerats utan att känslig information<br />
överförts över nätverket. Det är även vanligt att på något vis kombinera en tidstämpel med<br />
utmaningen eller svaret för att på så vis ytterligare undvika upprepningsattacker, detta är dock i<br />
teorin onödigt ifall utmaningen är framtagen slumpmässigt.<br />
Sammanfattningsvis om kryptering<br />
Sammanfattningsvis om kryptering kan sägas att det största motivet för bruket av kryptering idag<br />
är att det är det flexibla alternativet för säkerhet. Bruket av kryptering är sällan beroende av någon<br />
speciell infrastruktur eller specialiserad hårdvara (även om sådana ofta används för att minska<br />
svarstider och höja säkerhet), kryptering kan implementeras som transparenta lager i de flesta<br />
system och krypteringens styrka kan skalas efter behov hos applikationer. Idag bör säkerhet i form<br />
av kryptering alltid vara en naturlig del vid design av en ny applikation eller ett nytt protokoll för<br />
kommunikation.<br />
20
Komprimering<br />
Komprimering syftar till att reducera storleken på en representation av en datamängd, oftast för att<br />
spara in på utrymme vid lagring eller bandbredd vid överföring av data. Sättet detta utföres på är<br />
genom att eliminera datamängdens inneboende redundans, d.v.s. genom att försöka finna den mest<br />
effektiva representationen av data. Observera att denna definition inte på något vis begränsar<br />
problemområdet till att söka och ersätta upprepningar, många av de mest effektiva<br />
kompressionerna uppnås genom att omformulera vilken information som skall lagras samt hur och<br />
till vilken noggrannhet ursprungsinformationen skall kunna återskapas.<br />
För information om generell komprimering se [5] och [20], om specifikt bildkompression se även<br />
[6], [9] och [10].<br />
Motiv för komprimering<br />
Givet takten som dagens överförings– och lagringsmedia utvecklas i, borde inte då komprimering<br />
vara ett historiskt begrepp vid det här laget? Svaret är med besked nej – tillämpningarna och<br />
antalet användare växer med betydligt större hastighet. Ett populärt exempel vid motivation av<br />
bruket av kompression är överföring av en videosignal. Dagens digitala videoöverföringar sänder<br />
ett flertal stillbilder som sammansatta snabbare än vad det mänskliga ögat klarar av att uppfatta<br />
och simulerar därmed ett jämnt bildflöde. Om bilderna i systemet är av upplösningen 640 · 480<br />
pixlar, individuellt har 24 bitars färgdjup, så kommer en enda bild att uppta 7372800 bitar.<br />
640 ⋅ 480⋅<br />
24 = 7372800<br />
Vidare skulle då en videosignal som sänds med 50 bildrutor per sekund (vilket ungefärligen motsvarar<br />
vanlig television och ligger något bortom den gräns som det mänskliga ögat klarar av att<br />
uppfatta enskilda stilbilder) så kommer en minut av icke komprimerad video att motsvara<br />
22118400000 bitar, eller lite drygt 20 gigabits.<br />
( 640⋅<br />
480⋅<br />
24)<br />
⋅50⋅<br />
60 =<br />
21<br />
22118400000<br />
Skulle denna videosekvens lagras på en hårddisk skulle alltså denna minut av video kräva lite<br />
drygt 2,5 gigabyte av lagringsutrymme.<br />
( 640⋅<br />
480⋅<br />
24)<br />
⋅50⋅<br />
60<br />
= 2,<br />
574920654296875<br />
8⋅1024⋅1024⋅1024<br />
Vid överföring över nätverk (där ideala protokoll, d.v.s. protokoll helt utan overhead eller<br />
bandbreddskrav från protokollets sida, förutsätts) krävs det av kommunikationskanalen att den<br />
klarar av att felfritt upprätthålla en kommunikationsbandbredd med ett minimum på 368 megabit<br />
per sekund.<br />
( 640⋅<br />
480⋅<br />
24)<br />
⋅50<br />
=<br />
1000⋅1000<br />
368,<br />
64<br />
I ljuset av detta och många liknande exempel ses snabbt värdet av effektiv komprimering – dagens<br />
videobaserade tillämpningar producerar i rask takt mer data än vad som omedelbart kan behandlas.
Komprimering finner sina naturliga tillämpningar inom framförallt två områden – lagring<br />
respektive överföring av data. Vid första anblicken kan det te sig naturligt att tro att dessa två<br />
tillämpningsområden skulle vara närbesläktade men olika tillämpningar av framförallt överföringar<br />
implicerar att detta inte är fallet.<br />
Kompression för lagring<br />
Lite grovt kan kompression för lagring kategoriseras som kompression av data som utförs utan<br />
specifika krav på svarstid. Här finns det ofta tid till att fullt ut analysera ursprungsdata och den<br />
mest effektiva metoden att applicera för kompressionen väljas. Den triviala ansatsen att prova flera<br />
olika algoritmer och välja den som minimerar storleken på resultatet kan vara användbar här.<br />
Kompression för lagring har också oftast andra typer av krav på sig än kompression för överföring<br />
– i överföringstillämpningar kan exempelvis systemet ibland ta stöd av användaren (i interaktiva<br />
tillämpningar) eller sända ofullständiga representationer av det efterfrågade data för verifikation<br />
(progressiva överföringar, något som ofta används för navigation i stora datamängder). Två vanligt<br />
förekommande epitet för kompression för lagring är generalitet och förlustfrihet. Med generalitet<br />
brukar antydas att algoritmen kan appliceras på de flesta typer av datamängder med liknande<br />
resultat. Förlustfrihet å sin sida betyder att ursprungsdata går att återskapa exakt, utan förluster i<br />
datakvalitet eller mängd. Eftersom de data som skall lagras per definition skall analyseras eller<br />
behandlas vid ett (inte nödvändigtvis specificerat) senare tillfälle så är det heller inte säkert att den<br />
tidpunktens krav på databeständighet är kända. Av denna anledning ter det sig påkallat att spara<br />
allt data.<br />
Kompression för överföring<br />
I fortsättningen av detta arbete har fokus legat på kompression för överföring (hädanefter refererat<br />
till endast som kompression eller komprimering) eftersom problemställningarna för detta arbete<br />
klart sorterat härunder. Överföringskompression är ett, om än inte bredare är kompression för<br />
lagring, område fyllt med svåra kravställningar och utmaningar. Det främsta problemet inom detta<br />
område följer av de bristfälligheter som dagens överföringsmetoder uppvisar – bandbredden är<br />
oftast starkt begränsad i förhållande till efterfrågad datamängd och sällan eller aldrig felfri. Paketbaserad<br />
datatrafik har upplevt en stark renässans de senaste åren på grund av dess dynamiska natur<br />
– den tillgängliga bandbredden kan omfördelas på ett mycket mer effektivt sätt än hos alternativen<br />
(diverse typer av virtuellt kretskopplade nät). Detta har funnit nya applikationsområden inom<br />
mobila nät utöver dess naturliga dominans på Internet. Inom många applikationsområden (där<br />
ibland video– och ljudöverföringar) är det dock önskvärt med vissa karaktäristika som uppvisas<br />
endast av kretskopplade nät, exempelvis garanterad bandbredd och ökad feltolerans. Paketbaserade<br />
nät har även (i större utsträckning) problem med bortfall av paket, vilket löses med omsändningar<br />
eller genom att ignorera det saknade data. Båda dessa ansatser orsakar svårigheter för vissa typer<br />
av komprimeringsmodeller.<br />
I försök att uppnå högre grad av komprimering så specialiserar sig ofta algoritmer inom området<br />
kompression för överföring till smala områden, där en viss typ av data eller en viss typ applikation<br />
förutsätts. Dock så är då (naturligtvis) de specialiserade algoritmerna endast effektiva inom sitt<br />
eget område, vilket medför antagandet att informationen som skall överföras kan klassificeras eller<br />
är av känd typ.<br />
22
Redundans<br />
Den generella definition av komprimering som tidigare nämndes var reduktion av redundans, men<br />
vad exakt är redundans och var finns den? Den definition som används i detta arbete definierar<br />
redundans som information som finns representerad i data upprepade gånger. Viktigt att observera<br />
är att denna definition inte begränsar redundans till att vara upprepningar av data (exempelvis då<br />
samma teckensekvens återfinns ett flertal gånger i en text), utan kan även återfinnas i ineffektiva<br />
datarepresentationer eller i icke utnyttjad kunskap om datakällan. Redundans är överflödig<br />
information helt enkelt.<br />
Redundans kan naturligtvis manifestera sig på flera sätt och oftast krävs det ett flertal angreppssätt<br />
och kompromisser som samverkar för att kunna uppnå den kompressionsgrad som applikationen<br />
finner acceptabel. Majoriteten av arbetet i designen av ett kompressionssystem ligger i att<br />
identifiera var redundans finns och skapa en datarepresentation som eliminerar denna. Detta består<br />
ofta i att studera systemets alla komponenter både för sig och som delar av helheten. Datakällan<br />
och slutanvändaren är viktiga komponenter i detta arbete som inte får ignoreras då deras begränsningar<br />
och egenskaper ofta är källor till stora möjligheter för kompression!<br />
Komprimering är ett oerhört stort och expansivt område, de metoder och ansatser som nämns här<br />
är på inget vis en komplett förteckning över de metoder som finns tillgängliga och ämnar heller<br />
inte till att vara detta. Denna förteckning finns med mer som en orientering för den till ämnet icke<br />
introducerade läsaren och beskriver en (väldigt) liten del av det arbete som gjorts inom fältet det<br />
senaste halvseklet.<br />
23
Förlustfri komprimering<br />
De flesta typer av förlustfri komprimering (lossless compression) baserar sig på ansatsen att finna<br />
ett mer effektivt sätt att representera informationen (till skillnad mot dataförstörande som väljer<br />
bort information efter en given strategi). Den maximala kompressionsnivån som kan uppnås av en<br />
förlustfri komprimering definieras av datamängdens inneboende entropi (energiinnehåll), vilken i<br />
runda ordalag definierar hur mycket information det egentligen finns i en datamängd och ger därigenom<br />
även indirekt ett mått på den mest effektiva representationens storlek. Vi skall här översiktligt<br />
gå igenom ett antal exempel på förlustfri kompression, vilka alla har förenklats en smula<br />
för läsarens intuitiva förståelses skull. De finns med här för att erbjuda läsaren en introduktion till<br />
komprimering och en bättre bild av hur olika tekniker för komprimering är uppbyggda.<br />
Run–Length Encoding<br />
Run–Length Encoding (hädanefter kallad RLE) är en av de enklaste varianterna av komprimering<br />
och baserar sig på antagandet att det i data finns återkommande sekvenser av samma värde (så<br />
kallade run–lengths). Dessa sekvenser kodas efter identifierandet i termer av tecken bestående av<br />
värdet och längden på sekvensen. RLE kan (och görs ofta) även med fördel appliceras på tvådimensionella<br />
datastrukturer och uppnår oftast sin högsta effektivitet på datamängder med enkel<br />
struktur. Ett vanligt förekommande exempel på sådana datamängder är text eller bilder med lågt<br />
färgdjup (lågt antal distinkta färger i bilden), varför RLE återfinns inom ett flertal standarder för<br />
telefax och liknande tillämpningar.<br />
Predictive coding<br />
Predictive coding kan ses som en utökning av RLE då denna variant fokuserar på att identifiera<br />
strukturer av vanligt förekommande data och kodar sedan informationen i termer av avvikelser<br />
från denna förutsägelse. Härledningsmässigt gäller dock inte detta släktskap då predictive coding<br />
egentligen baseras på statistiska analyser av tillämpningsmässigt data. Predictive coding finner<br />
sina tillämpningar främst inom överföringstillämpningar där det finns utförlig kunskap om vanligt<br />
förekommande datastrukturer i data, snarare än möjlighet att analysera det data som genereras i sin<br />
helhet.<br />
Dictionary based coding<br />
En till Predictive coding närbesläktad ansats är Dictionary based coding, vilken liksom den förstnämnda<br />
baseras på statistisk analys av data. Här fokuseras dock på att identifiera strukturer i data<br />
vilka lagras i speciella uppslagstabeller. Informationen kodas sedan om i termer av index in i dessa<br />
tabeller istället för som tidigare i termer av sekvensstorlekar. Rent generellt lämpar sig dessa algoritmer<br />
bättre för lagringstillämpningar snarare än överföringstillämpningar eftersom ett effektivt<br />
identifierande och uppbyggande av dessa tabeller baserar sig på en överblick över den fullständiga<br />
datamängden. Detta ställer i sin tur krav på tillgängligheten av data som inte alltid uppfylls av<br />
överföringstillämpningar, vilka oftast börjar överföra data innan allt data är genererat. Naturligt<br />
följer effekten att dessa algoritmer tenderar att ignorera kunskap om datakällan och istället fokusera<br />
på de strukturer som finns i tillgängligt data. Därmed har dessa algoritmer en generalitet som<br />
gör att de kan appliceras på godtyckligt data och de återfinns därför ofta i tillämpningar för kompression<br />
av godtyckliga datafiler (såsom verktygen pkzip och UNIX compress). Värt att notera är<br />
även att dessa algoritmer når en hög effektivitet vid kompression av homogena bilder (vilka exempelvis<br />
kan ha mycket bakgrund i sig) och därför även återfinns i många komprimeringsbaserade<br />
filformat för grafik, såsom GIF (Graphics Interchange Format).<br />
24
Huffman kodning<br />
Huffman kodning är (trots sin gedigna ålder) en av de absolut vanligast förekommande algoritmerna<br />
av idag och baseras även den på statistiska antaganden om data. Huffman kodning finns<br />
(av implementeringsmässiga skäl) i en hel del varianter som alla utnyttjar sin egen variant av<br />
representation av kompressionsinformationen. Den gemensamma och definierande idén är att på<br />
teckennivå representera informationen i koder vars storlek baseras på hur vanligen förekommande<br />
just det tecknet är. På grund av flexibiliteten i denna ansats kan detta användas både tillsammans<br />
med statistiska antaganden om en viss datakällas generella utdata och tillsammans med statistik<br />
om en viss datasekvens (utan information om datakällan). Den sista och otroligt användbara<br />
aspekten av denna ansats är att på grund av dess tidigare nämnda generalitet så kan den ofta<br />
använda tillsammans med andra godtyckligt valda kompressionsansatser, ofta då dataförstörande<br />
sådana. Detta möjliggör att i en slutfas erbjuda en lämplig bitkodning av data och då eliminera den<br />
eventuella redundans som introducerats som en bieffekt av de tidigare kompressionerna. Det är ju<br />
till sist och syvende så att det oftast är ett kombinerat system av olika kompressionsansatser som<br />
tillsammans genererar de bästa kompressionseffekterna – i ljuset av detta synes värdet av en algoritm<br />
som är generellt applicerbar tillsammans med andra algoritmer klart. Skulle utdata från en<br />
tidigare komponent i detta system inte passa en Huffman kodning så går det ofta att utan alltför<br />
stora beräkningsmässiga straff att anpassa dessa för att bättre för Huffmankodningen, en process<br />
som i kompressionslitteratur ibland brukar benämnas normalisering. Ett exempel på en applikation<br />
som utnyttjar exakt detta är JPEG standarden för kompression av stillbilder.<br />
Värt att notera är även att Huffman kodnings användande är skalbart i storleksavseende – den går<br />
lika bra att applicera på en högre generell objektnivå som nere på en lägre teckennivå, utan att<br />
påverka dess goda prestanda. Huffman kodning återfinnes ofta idag (just på grund av dess generalitet<br />
och goda prestanda) som ett sista steg i de flesta typer av tillämpningar som inkorporerar<br />
någon typ av kompression, inklusive bildkodningar, överföring av realtidsdata, textkompression<br />
med mera.<br />
Ett illustrativt om än något historiskt exempel på kompression av Huffman typ är Morse kod, som<br />
ursprungligen skapades för bruk på de manuella telegraferna. I Morse kod så representeras bokstäver<br />
av sekvenser av signaler (korta och långa) och för att minimera antalet nedslag telegrafisten<br />
behövdes göra för att sända ett meddelande (och därmed antalet signaler samt överföringstid för en<br />
genomsnittlig text) så gav Morse de mer vanligt förekommande tecknet i det engelska språket<br />
kortare representationer än de mindre vanlig förekommande.<br />
25
Dataförstörande komprimering<br />
Förlustfri komprimering har en stor teoretisk begränsning (vilken ofta är praktiskt kännbar) i det<br />
att den maximala kompressionsgraden som går att uppnå begränsas av datamängdens entropi. Av<br />
denna anledning används denna typ av algoritmer nästan uteslutande i de applikationer där dataförluster<br />
inte är acceptabla. Dataförstörande komprimering (lossy compression) finner sin<br />
motivering i det faktum att det existerar många fall där förlustfri komprimering inte räcker till för<br />
att tillfredsställa de krav som ställs på applikationen, ofta genom att det blir det för mycket beräkningar.<br />
Många förlustfria kompressioner inriktar sig på en utförlig analys av indata, något som är<br />
beräkningsintensivt och heller inte alltid är genomförbart i överföringsfallet. Det finns även flera<br />
situationer där det helt enkelt inte går att uppnå den sökta kompressionsgraden utan att göra avkall<br />
på datakvaliteten. Även om det initialt ligger nära till hands så skall dock inte dataförstörande<br />
komprimering ses som en kompromiss utan snarare som ett intelligent val som görs med begränsningar<br />
hos systemets slutanvändares uppfattningsförmåga i åtanke. Det är främst den information<br />
som bedöms vara överflödig för slutanvändarens behandling av data som förkastas i kompressionen.<br />
Dataförstörande algoritmer kan ofta uppnå väldigt höga grader av kompression utan att slutanvändaren<br />
ser en skymt av dem.<br />
Felmått<br />
När förlustfri komprimering diskuteras så är de intressanta kvalitetsmåtten kompressionsgrad och<br />
(i överföringstillämpningar) beräkningskomplexitet. När dataförstörande kompression diskuteras<br />
så introduceras en annan aspekt på ett naturligt sätt – distortion. Distortionen är måttet på hur<br />
mycket rekonstruktionen av det komprimerat data avviker från originaldata, med andra ord ett mått<br />
på hur stort det av systemet introducerade felet är. Tidigare nämndes att det för kompressionssystem<br />
är lyckosamt att människan är konstruerad med relativt svaga syn– och hörselorgan och<br />
istället kompenserar för detta med en stark signalbehandling. Nu dyker dock den andra sidan av<br />
det myntet upp. Eftersom vår uppfattning av syn– och hörselintryck till stor del styrs av hur vi<br />
individuellt behandlar dessa sinnesintryck är det oerhört svårt att skapa generella kvantitativa<br />
felmått för system där människan är slutanvändare. Eftersom olika personer uppfattar en viss färgnyans<br />
på olika sätt (både i termer av färgupplevelse och i termer av viktning – hur viktig den<br />
komponenten är för helhetsbilden) så kommer ett fel i den färgnyansen att upplevas som olika<br />
störande, detsamma gäller givetvis för kontraster, extremvärden med mycket mera. Till viss del<br />
kan detta modelleras matematiskt (exempelvis kan få människor höra ljud under 20Hz), men den<br />
effektivaste metoden för subjektiv felmodellering är fortfarande att låta slutanvändaren själv få<br />
avgöra hur störande olika fel är och vilka fel som är acceptabla eller ej. Ett exempel på detta är<br />
taligenkänningsapplikationer som måste kalibreras för varje enskild användare för att uppnå<br />
maximal prestanda.<br />
I de flesta tillämpningar som präglas av begränsad interaktivitet så är dock denna ansats inte<br />
möjlig och då satsas det istället på att genomföra denna process med en referensgrupp som är<br />
statistiskt representativ för slutanvändaren. Med denna metod nås naturligtvis inte samma resultat<br />
som om varje slutanvändare själv fick vikta felen men givet ett tillräckligt statistiskt underlag kan<br />
ofta generella slutsatser kring den genomsnittslige slutanvändaren dras. Ett exempel på sådana<br />
arbeten är när the Joint Photographers Expert Group (JPEG) tog fram bildstandarden JPEGs dataförstörande<br />
del. Då anlitades en stor statistisk urvalsgrupp för att rangordna hur störande de fann<br />
olika typer av fel i bilder. Denna kunskap användes senare för att konstruera viktningsmatriser<br />
vilka reducerar förekomsten av blockningsartefakter i komprimerade fotografier med naturliga<br />
motiv.<br />
Nackdelarna med denna ansats är uppenbara, även om denna process skulle generera ett felmått<br />
som är universellt acceptabelt så är det en dyr och tidskrävande metod som sällan är användbar för<br />
varje tillämpning. Det är även ofta svårt att teoretisera kring de feluppskattningar som fås från<br />
26
statistiska urval, oftast brukar arbetet pragmatiseras till att försöka identifiera och modellera de<br />
fysiska delarna av användaren snarare än de psykiska. De fysiska delarna av vår varelse har utvecklats<br />
evolutionsmässigt och skiljer sig betydligt mindre från individ till individ än vad de<br />
psykiska delarna (vilka snarare är ett resultat av anpassning gentemot våra individuella förutsättningar<br />
i kombination med vår miljö) gör.<br />
Alternativa metoder för feluppskattning (d.v.s. metoder som inte baserar sig på statistiskt urval) är<br />
av mer matematisk natur, exempelvis medelabsolutfel (Root Mean Square Error eller RMSE) eller<br />
medelkvadratsfel (Mean Square Error eller MSE). MSE mäter felet genom att ta medelvärdet av<br />
kvadraten på skillnaden mellan enskilda pixlar (var färgkanal för sig, före och efter kompressionen).<br />
MSE har fördelen att belysa stora fel (eftersom de kvadreras), vilket är lämpligt inom bildbehandling<br />
eftersom det (till viss del) motsvarar det mänskliga ögats konstruktion som gör det<br />
enklare för användare att detektera skarpa kontraster i bilder. RMSE mäter medelvärdet av den<br />
absoluta skillnaden mellan enskilda pixlar. Matematisk uttrycks detta som summan av absolutbeloppet<br />
på skillnaden mellan enskilda pixelvärden, men detta benämns RMSE eftersom detta<br />
även uttrycker kvadratroten av MSE för enskilda pixlar. RMSE är användbart eftersom det<br />
uttrycker den absoluta skillnaden i pixelvärden mellan två bilder. Dessa metoder uppnår inte<br />
samma grad av noggrannhet som statistiska metoder, men har istället fördelarna att de är billiga<br />
och snabba att använda, har ofta en stark teoretisk koppling till metoderna de modellerar och framförallt<br />
är de enkla att applicera på uppmätt data. Ett tredje mått som används ibland är absolutfel<br />
(Absolute Error eller AE). Detta är ett mått som summerar absolutbeloppen för skillnader mellan<br />
enskilda pixlar och ger en uppfattning om hur mycket en bild förändrats totalt.<br />
Med god kunskap om de fel som dyker upp i systemet kombinerat med kunskap om systemets<br />
användare kan det även ibland går att utnyttja de brister som existerar till sin fördel. Ett exempel<br />
på detta är en teori som benämns maskningsteoremet, vilket belyser möjligheten att välja in<br />
störning där defekter i mottagarsystemet ignorerar delar av informationsurvalet. Människans hörsel<br />
täcker exempelvis ett stort spann av ljudfrekvenser och kan snabbt ställa om sig från att uppfatta<br />
ljud i den ena änden av spektrat till ljud i den andra, men vi saknar möjligheten att höra dem båda<br />
samtidigt. Givet denna information om slutanvändaren kan då förutsägas att en hög ton som följs<br />
av en låg ton då kommer att maskera den efterföljande tonen (därav namnet maskningsteoremet)<br />
ifall de kommer i så snabb takt att örat inte hinner ställa om sig. I det fallet kan den andra tonen<br />
förkastas utan att påverka slutanvändarens upplevelse av signalen, något som besparar systemet<br />
både beräkningar och bandbredd.<br />
Dimensionering av distortion<br />
Hur mäts då prestanda för en dataförstörande kompressionsalgoritm? Vad är lämpliga förhållanden<br />
mellan det introducerade felet och resulterande bit rate (ett mått på kompressionsgrad)? Eftersom<br />
det i kompressionsdiskussioner handlar om mycket komplexa algoritmer är det är svårt att förutsäga<br />
hur en viss algoritm kommer att uppföra sig under vissa betingelser. I ett komplext system<br />
med flera integrerade kompressionskomponenter kan det snabbt bli oöverskådligt att se hur en<br />
enkel variation i bandbredd eller indata kommer att motsvaras i utdata. Betydligt enklare är det då<br />
att först identifiera vilka krav applikationsmiljön ställer på kompressionssystemet och sedan välja<br />
en passade algoritm på förkastningsbasis som håller sig inom dessa ramar.<br />
Ett lämpligt förfarande är med andra ord att se på applikationen, identifiera systemets krav för<br />
datakvalitet, bandbredd och beräkningskomplexitet, välja absoluta gränser för dessa och sedan<br />
försöka passa in de tekniker som finns tillgängliga inom dessa.<br />
Kraven på datakvalitet varierar stort från system till system och framförallt mellan olika<br />
applikationsområden. För övervakningskameror kan det vara viktigt att bildupplösningen är hög<br />
nog att kunna identifiera individer och för målsökningssystem kan det vara viktigare att ha en hög<br />
frame rate (bildfrekvens, mäts i fps eller bildrutor per sekund) för att kunna följa ett visst objekt<br />
27
när det väl identifierats. För interaktiva system kan det vara viktigt att låta användarens subjektiva<br />
bedömningar ligga till grund för hur datakvalitetsparametrarna skall sättas för systemet. Speciellt i<br />
fallet med <strong>bildtelefoni</strong> över Internet, där omständigheter bortom användarens kontroll (läs<br />
bristande bandbredd) sätter påtagliga begränsningar för datakvaliteten, kan möjligheten att själv få<br />
balansera bildstorlek, bildfrekvens och bildkvalitet göra mycket för användarens acceptans av<br />
systemet.<br />
När det talas om bandbredd inom <strong>bildtelefoni</strong> brukar maximal bandbredd och bibehållen bandbredd<br />
särskiljas. Maximal bandbredd betraktas som en övre gräns vilken inte skall överskridas ens<br />
om det innebär att (temporärt) sänka datakvaliteten. När bibehållen bandbredd nämns så avses<br />
storleken på en kontinuerlig dataström som skall bibehållas utan avbrott. Som bekant är detta endast<br />
möjligt för kretskopplade när och för paketbaserade (publika) nät så brukar systemen istället<br />
byggas så att de inte är beroende av en kontinuerlig dataström utan till och med inte berörs av att<br />
data saknas på grund av paketbortfall eller sådana fördröjningar att data blir irrelevant. Ofta väljs<br />
över paketbaserade nät en lösning där bildkvalitet och bandbreddkrav har ett tydligt utbytesförhållande<br />
så användaren själv kan styra sitt system till att använda en bildkvalitet som är lämplig<br />
för den tillgängliga bandbredden. Det märks tydligt för användaren genom drastiska sänkningar i<br />
datakvaliteten när han nått taket för bandbredden.<br />
Beräkningskomplexiteten brukar ofta begränsa datakvaliteten på ett liknande vis som bandbredden<br />
gör – när bandbredden begränsar hur mycket data som kan överföras så begränsar beräkningskomplexiteten<br />
hur mycket data som kan behandlas. Kompression är ofta en mycket beräkningsintensiv<br />
process och <strong>bildtelefoni</strong> genererar mycket data snabbt vilket gör <strong>bildtelefoni</strong> till ett av de<br />
tydligaste exemplen på när dedikerad hårdvara brukar användas idag. I avsaknad av sådan får dock<br />
andra utvägar sökas och oftast brukar då detta ske genom att göra avkall på kompressionskvaliteten<br />
i designfasen.<br />
Under systemets körning kan det även gå att använda matematiska mått för att finna en balans<br />
mellan kompressionsnivå och datakvalitet, lämpligen då RMSE och MSE. Målet brukar här då<br />
vara att finna en högsta möjliga kompressionsnivå för en viss nivå av störning (distortion), vilket<br />
med andra ord ger maximalt med data för det tillåtna felet.<br />
För utförligare information om matematiska felmått se [2] och [17] och dess användning se [9] och<br />
[18].<br />
Hybridsystem<br />
När felmått diskuteras följer det smidigt att nämna en vanligt förekommande ansats som i stor<br />
utsträckning lever i gränslandet mellan dataförstörande och förlustfri komprimering – hybridsystem.<br />
Dessa utnyttjar felmått som ett sätt att styra kompressionen. Hybridsystem är system som<br />
implementerar flera av de komprimeringsansatser som här tas upp och gör sedan intelligenta val av<br />
vilka algoritmer som bäst passar det aktuella data. Givetvis utnyttjar majoriteten av dagens applikationer<br />
kombinationer av de tillgängliga typerna av kompressionsalgoritmer, det som skiljer<br />
hybridsystem från mängden är att strategin för valet av dessa är mer uttalat och kriterierna för detta<br />
urval mer raffinerade. En vanlig ansats när det gäller hybridsystem är att implementera ett flertal<br />
närbesläktade algoritmer (ofta helt enkelt genom att utnyttja samma algoritm med olika<br />
parametrar) och sedan välja den algoritm som minimerar felet för det data som systemet arbetar på<br />
för tillfället. Denna urvalsprocess kan med fördel skötas interaktivt av användaren (eftersom olika<br />
typer av fel upplevs olika störande) men går även att göra med automatiskt med kvantifierande<br />
metoder. MPEG4 kompressorer är exempel på interaktiva applikationer och the JPEG baseline<br />
algorithm är ett exempel på en kvantifierande anpassning. Observera att denna urvalsprocess (valet<br />
av vilken algoritm som skall användas) inte nödvändigtvis är permanent utan detta kan upprepas<br />
flera gånger under komprimeringens gång.<br />
28
Subband Coding<br />
En annan komprimeringsansats som ligger i gränslandet mellan förlustfri och dataförstörande<br />
komprimering är Subband Coding. Detta är som namnet antyder en ansats som ansätter<br />
komprimeringsproblematiken med antagandet att olika delar av insignalen uppvisar olika karaktäristika<br />
och därför kan, eller snarare bör, behandlas som flera separata och parallella insignaler.<br />
Signalen delas med andra ord upp i underband baserat på frekvens. Vikten lägges här vid att<br />
partitionera insignalen efter signalens karaktäristika på ett intelligent vis och ämnar därmed att<br />
reducera den sammanlagda komprimeringsproblematiken till ett flertal mindre och mer triviala<br />
komprimeringsproblem. De specifika metoderna för att partitionera signalen bestäms vanligen<br />
efter statistiska studier av representativt data, men det finns även metoder för att göra detta vid<br />
tillfället för behandlingen av den aktuella signalen – exempelvis system baserade på neurala nät<br />
för artificiell intelligens. Här bör även observeras att denna partitionering eller filtrering inte<br />
endast ger oss en partitionerad datamängd anpassad efter modellerna av (förväntat) data, utan även<br />
en hel del information om dess innehåll. Exempel på detta är hur väl förutsägelser kring detta datas<br />
natur stämmer samt vilka komprimeringsalgoritmer som senare bör prioriteras. Idag dyker denna<br />
typ av ansats vanligen upp i kombination med hybridsystem eller transformbaserade system, och<br />
ofta då i realtidssystem då denna ansats är relativt enkel och billig att realisera i elektronik. Detta<br />
arbetssätt kan dock givetvis med fördel även användas både inom förlustfri och dataförstörande<br />
komprimering.<br />
Det enklaste exemplet av subband coding är ett analogt insignalsfilter som tar bort frekvenser som<br />
ofta ger upphov till kraftiga störningar i en senare komprimeringsprocess. Mer avancerade system<br />
finns givetvis, exempelvis kan de använda sig av betydligt fler filter eller återkopplingsslingor som<br />
ger systemet information om hur framgångsrik partitioneringen är och konfigurerar om systemet<br />
för att uppnå en högre effektivitetsgrad.<br />
Avslutningsvis kan nämnas att det finns fall då bruket av subband coding är direkt olämpligt.<br />
Detta främst då någon annan form av komprimering senare förutsätter saker om eller försöker<br />
tolka insignalen.<br />
29
Frekvensdomänanalys<br />
Eftersom inte alla läsare av denna rapport förmodas vara familjära med frekvensdomänanalys ges<br />
här en kort definition av en del begrepp (sett ur det datavetenskapliga perspektivet).<br />
En (matematisk) funktion är en uppsättning beräkningar som tar ett antal parametrar och returnerar<br />
ett värde utifrån dessa, d.v.s. i det reella fallet mappar ett värde från R n till R 1 (där R är de reella<br />
talens värderum och n är antal parametrar som ges funktionen samt rummets dimension). Inom<br />
signalbehandling kallas (endimensionella) signaler ofta för funktioner och i detta arbete används<br />
uttrycken utbytbart.<br />
En transform är en uppsättning beräkningar som tar ett antal parametrar och mappar dessa till en<br />
ny värdemängd, d.v.s. för det reella fallet mappar alltså en transform från R n till R m (där m och n<br />
betecknar antal dimensioner för de reella värderummen). En transform kan även sägas vara reell<br />
eller komplex samt diskret eller kontinuerlig och då är det naturligtvis de värderum de arbetar på<br />
som avses i beskrivningen.<br />
Frekvensdomänen<br />
Fouriertransformens (liksom de flesta övriga transformer nämns här) värdemängd kallas frekvensdomänen,<br />
detta på grund av att den delar upp periodiska funktioner i sinusoida komponenter baserat<br />
på dessa signalers inneboende frekvenser (d.v.s. hur data förändras inom signalen). De värden<br />
som fås i transformkoefficienterna av en dylik transform uttrycker information om hur mycket den<br />
aktuella sinusoiden skall viktas i det givna avsnittet för att tillsammans med de andra koefficienterna<br />
approximera ursprungsfunktionen. Detta uttrycker även den komponentens relativa förekomst<br />
i funktionen och kan även användas som ett mått på förändring inom en signal. Frekvensdomänanalys<br />
är det samlingsnamn som används för att beteckna de metodiker som utnyttjar<br />
transformer av periodiska funktioner och arbetar på de resulterande transformkoefficienterna.<br />
Två egenskaper som kanske inte kommer läsaren intuitivt till sinnet men som är nödvändiga hos<br />
de transformer som används är att de dels är reversibla och dels (oftast) är separabla.<br />
Med reversibla menas att de i sig inte är dataförstörande – den ursprungliga signalen kan rekonstrueras<br />
till fullo från de resulterande transformkoefficienterna med hjälp av inversen av transformen.<br />
Mer matematiskt uttryckt så sägs dessa transformer vara ortonormala, vilket innebär att<br />
transformmatrisens invers är detsamma som transponatet av transformmatrisen. Eftersom transponatet<br />
av en matris alltid existerar och är enkel att beräkna så är det enkelt ta fram inversen för<br />
transformen från dess transformmatris. Skall en transform användas på en flerdimensionell signal<br />
kommer den andra nämnda egenskapen in i spel, med separabel menas att den flerdimensionella<br />
transformen kan beräknas utifrån den endimensionella transformen genom upprepade beräkningar<br />
(av den endimensionella transformen) på den givna signalen.<br />
Transformteori används mycket inom signalbehandling eftersom transformer erbjuder ett smidigt<br />
matematiskt verktyg för att beskriva en signals sammansättning på en specificerad detaljnivå.<br />
Försöks exempelvis vissa frekvenser i en ljudsignal isoleras till en viss upplösning kan detta göras<br />
genom att lokalisera dess motsvarande sinusoider i signalens transformrepresentation (för den<br />
sökta upplösningen), extrahera dessa och sedan beräkna inversen av transformen på dessa<br />
koefficienter. På motsvarande vis kan även färger i bilder bearbetas eller störningars i en signal<br />
motverkas. Dessa metoder finner med andra ord många naturliga tillämpningar hos filtrering,<br />
komprimering, signalrekonstruktion, med mycket mera. Subband coding och frekvensdomänanalys<br />
är inom kompression närbesläktade men har den skillnaden att Subband coding<br />
arbetar på (spatiella) frekvensband i ursprungssignalen medan frekvensdomänanalys delar upp den<br />
ursprungliga signalen i (viktade) frekvenskomponenter efter signalens förändringar.<br />
30
För utförligare introduktion till transformteori, matematiken däri och dess användning inom kompression<br />
och bildkodning se [2], [9], [17], [18] och [20].<br />
Wavelets och Rum–Frekvensdomänen<br />
Något som inte tas upp mer än i det här arbetet men ändå för tydlighetens skull bör nämnas i det<br />
här sammanhanget är wavelets. Wavelets är en typ av transformer som ger en signalrepresentation<br />
i rum–frekvensdomänen, och ger utöver frekvensdomänens information (om hur signalen är<br />
sammansatt) även spatiell information om dessa signalkomponenter (i runda ordalag var de rumsligt<br />
befinner sig i signalen). Som ett förtydligande exempel inom bildbehandling (där en bild alltså<br />
betraktas som en tvådimensionell signal) skulle en Fourierrepresentation av bilden ge information<br />
om vilken typ av information som finns i bilden. Exempelvis skulle många höga frekvenskomponenter<br />
tala om att det finns snabba förändringar i bilden. En väldigt stark frekvenskomponent<br />
skulle då t.ex. kunna indikera ett periodiskt återkommande mönster i bilden. En<br />
wavelet representation av samma bild skulle då även utöver detta även kunna ge information om<br />
var någonstans i bilden som dessa snabba förändringar eller detta periodiska mönster befinner sig.<br />
Denna information uppnås genom att wavelets använder sig av en filterbank som anpassar den<br />
rumsliga storleken i representationen efter frekvensen för komponenten. Detta ter sig naturligt då<br />
förändringar som sker hastigt (och därmed har högre frekvens) ofta har låg rumslig utbredning till<br />
skillnad från förändringar som sker långsamt (och därmed har lägre frekvens) ofta har större<br />
rumslig utbredning. Wavelets är en relativt ny gren av matematiken (de skapades under andra<br />
halvan av föregående sekel) men kan för pedagogiska syften ses som en föregångare till frekvensdomänanalys.<br />
Fourierserier och Fouriertransformen<br />
För omkring 200 år sedan formulerade den franske ingenjören och matematikern Jean Baptiste<br />
Joseph Fourier (1768–1830) teorin om vad som idag är känt som Fourierserier. I sitt arbete med<br />
serier och transformer postulerade Fourier ett teorem som sade att en periodisk funktion (med<br />
period T) kan uttryckas som en serie av viktade sinusoider (d.v.s. periodiska funktioner som går att<br />
uttrycka som parameteriserade sinusvågor) på följande vis:<br />
a0<br />
f ( t)<br />
= +<br />
2<br />
∞<br />
∑<br />
n=<br />
1<br />
2π<br />
nt<br />
an<br />
cos +<br />
T<br />
där vikterna (koefficienterna) an och bn fås genom<br />
a<br />
b<br />
n<br />
n<br />
1<br />
=<br />
T<br />
1<br />
=<br />
T<br />
T<br />
∫<br />
0<br />
T<br />
∫<br />
0<br />
31<br />
∞<br />
∑<br />
n<br />
n=<br />
1<br />
2π<br />
nt<br />
f ( t)<br />
cos dt<br />
T<br />
2π<br />
nt<br />
f ( t)<br />
sin dt<br />
T<br />
2π<br />
nt<br />
b cos<br />
T<br />
En mycket användbar egenskap hos fourierserier är att det i förväg kan bestämmas till vilken noggrannhet<br />
som beräkningen skall utföras. Istället för att låta summorna i ovanstående ekvation gå<br />
från n=1 till oändligheten får de gå från n=1 till ett givet iterationstak x, och på det viset fås då en<br />
approximation av funktionen vars noggrannhet direkt korrelerar mot storleken på iterationstaket x.<br />
Skulle exempelvis en insignal ha en felfaktor av känd storlek så ter det ju sig onödigt att<br />
representera funktionen med fler sinusoider än så många som behövs för att representera
funktionen till den implicit givna noggrannheten. Med andra ord kan fourierserier i sin enklaste<br />
form erbjuda ett visst mått av kompression i sig.<br />
Fourierserier har även en komplex representation där funktioner uttrycks som en summa av komplexa<br />
exponenter på följande vis:<br />
= t f ( )<br />
∑ ∞ nt<br />
i<br />
T<br />
n<br />
n=<br />
−∞<br />
e c<br />
2π<br />
där i = −1<br />
och koefficienterna cn är komplexa tal som fås genom<br />
c<br />
n<br />
1<br />
=<br />
T<br />
T<br />
∫<br />
0<br />
f ( t)<br />
e<br />
32<br />
−2π<br />
nt<br />
i<br />
T<br />
Icke periodiska funktioner kan ges en periodisk representation genom<br />
∑ ∞<br />
k = −∞<br />
dt<br />
f ( t)<br />
= f ( t − kT)<br />
p<br />
Vilket, då perioden T går mot oändligheten, ger en Fourier representation av funktionen f(t) vilken<br />
kallas Fouriertransformen av f(t).<br />
I dagens tillämpningar behandlas dock oftast digitala (kvantifierade) signaler, varför det primära<br />
intresset är riktat mot diskreta transformer. Koefficienterna för den Diskreta Fourier Transformen<br />
(DFT) ges av<br />
c<br />
k<br />
1<br />
=<br />
N<br />
N<br />
∑ −1<br />
xn<br />
n=<br />
0<br />
e<br />
−2π<br />
nk<br />
i<br />
N<br />
där {xn} är en diskret sekvens av en insignal av längden / perioden N (vilket även råkar vara antalet<br />
resulterande transformkoefficienter). Dess invers (beräkningen av {xn} från {ck}) fås genom<br />
x<br />
n<br />
=<br />
∑ − N 1<br />
ck<br />
k=<br />
0<br />
e<br />
2π<br />
nk<br />
i<br />
N<br />
För den oinvigde kan det vara lägligt att redan nu påpeka att Fouriertransformen för en signal kan<br />
vara mycket kostsam att beräkna. Även om den inte skulle innehålla komplexa tal så skulle det<br />
fortfarande handla om summering av exponenter utan möjlighet till utbrytning och förberäkning av<br />
komponenterna i särskilt stor utsträckning. Detta är speciellt aktuellt inom exempelvis bildbehandling<br />
och liknande områden som involverar flerdimensionella signaler, vilka olyckligtvis<br />
ofta ökar beräkningskomplexiteten med dimensionen som exponent. Till hjälp för att motverka<br />
beräkningsbelastningen finns det dock en hel del specialiserade transformer som funnit sina<br />
användningsområden efter sina egenskaper samt ett generellt verktyg i form av en algoritm som<br />
kallas the Fast Fourier Transform (FFT). FFT är en algoritm som beräknar den diskreta Fouriertransformen<br />
med hjälp av successiv dubblering och reducerar beräkningskomplexiteten för densamma<br />
så mycket att den i praktiken nästan alltid används i dagsläget. Noterbart är även att<br />
Fourier transformen ger transformationskoefficienter ordnade efter spatiell frekvens.
Transformbaserad komprimering<br />
Frekvensdomänanalys är ett mycket användbart verktyg inom komprimering eftersom det ger oss<br />
ett verktyg för att isolera och vikta signalens olika komponenter efter slutanvändarens perceptionsförmåga.<br />
Består exempelvis målgruppen för en signal av människor så vet vi dels att olika<br />
frekvenser uppfattas olika mycket de mänskliga sensorsystemen (primärt hörsel– och synorganen)<br />
men även att dessa system är konstruerade för att selektivt välja vilka frekvensområden som skall<br />
fokuseras på för tillfället. Exempel på detta är det mänskliga ögats vars mörkerseende temporärt<br />
sätts ur spel ifall det exponeras för starkt ljus eller det mänskliga örat som fokuserar på ett visst<br />
frekvensområde åt gången och därmed inte kan höra ljud ur olika ändar av det hörbara spektrumet<br />
samtidigt. Om frekvensdomänanalys av en signal kan bestämma att slutanvändaren förmodligen<br />
inte kommer att kunna uppfatta en viss del av signalen så har vi ju per definition lyckats identifiera<br />
en redundans i signalen. Frekvensdomänanalys är ett mycket användbart verktyg för signalbehandling<br />
och den kompression som kan uppnås genom kvantifiering och trunkering av<br />
transformkoefficienter brukar samlingsmässigt kallas transformbaserad komprimering.<br />
Karhunen–Loeve Transformen (KLT)<br />
Inom informationsteori används ett begrepp kallat entropi, vilket är ett mått på en signals energiinnehåll<br />
eller enklare uttryckt ett mått på hur mycket information en signal innehåller. Det kan<br />
visas att entropin för en signal är ett bra mått på en kompressionens effektivitet, här konstateras<br />
dock endast att entropin för en signal stiger när signalrepresentations varians stiger. Karhunen–<br />
Loeve Transformen (KLT) utnyttjar en datarepresentation som beror av signaldata (närmare<br />
bestämt beror baskoefficienterna i transformmatrisen av sagda signaldata) och maximerar med på<br />
detta sätt variansen i representationen av insignalen. Detta medför att informationen kompakteras<br />
till den för bildkompression optimala representationen. KLT kallas även av historiska skäl för the<br />
Hotelling Transform.<br />
Tyvärr medför denna representation att transformens baskoefficienter varierar med signalen när<br />
den förändras över tiden. Detta är ett problem framförallt inom kompression för överföring<br />
eftersom mottagaren inte har tillgång till signaldata som behövs för att konstruera transformmatrisen<br />
(med andra ord behöver mottagaren signalen för att konstruera transformmatrisen för att<br />
avkoda den nya representationen av signalen – moment 22). Detta resulterar även i ett annat<br />
problem som i praktiken också visar sig i oöverstigligt – att beräkna baskoefficienterna för<br />
transformen är en mycket beräkningsintensiv process som helt enkelt inte kan upprepas varje gång<br />
signalen förändrar sig. Dessa nackdelar gör att KLT i praktiken sällan eller aldrig används för<br />
bildkompressionen, men KLT utgör ändå ett mycket bra mått på den optimala prestanda som kan<br />
nås med transformbaserad kompression.<br />
Diskreta Cosinus Transformen (DCT)<br />
Den Diskreta Cosinus Transformen (DCT) är en i bildkompressionssammanhang mycket vanligt<br />
förekommande operation eftersom den väl approximerar den ideala KLTs varians utan att introducera<br />
samma typ av beräkningskomplexitet. DCTs baskoefficienter beror endast av (den<br />
kvadratiska) blockdimensionen och kan därför förberäknas när denna är känd. Blockdimensionen<br />
brukar i förväg väljas beroende på applikationen krav avseende acceptabla störningar, maximal<br />
beräkningsintensitet samt önskad grad av kompression.<br />
Geometriskt sett utgör DCT egentligen ett specialfall av DFT som fås genom att i den periodiska<br />
utökningen av DFTs insignal lägga till en spegelvänd version av serien och därigenom eliminera<br />
den diskontinuitet som annars uppstår.<br />
33
Figur 2. Periodisk utveckling av en sampling för DFT respektive DCT<br />
DCT har även (till skillnad från DFT) den beräkningsmässigt attraktiva egenskapen att den är helt<br />
reell. Faktum är att DCT av dessa anledningar idag är något av ett självklart val för de typer av<br />
tillämpningar som använder sig av (frekvensdomäns) transformbaserade kompressioner. DCT har<br />
idag representerats i ett flertal standarder (däribland standarderna för kompression av still– och<br />
rörliga bilder från JPEG och MPEG) och har implementerats i en myriad av hårdvarutillämpningar<br />
likväl som optimerats i dagens ledande processorertillverkares instruktionsuppsättningar.<br />
För den (kvadratiska) blockdimensionen N bestäms den tvådimensionella consinustransformen av<br />
C(<br />
u,<br />
v)<br />
= α ( u)<br />
α ( v)<br />
och har då motsvarande invers<br />
med<br />
Funktionen<br />
DFT<br />
DCT<br />
f ( x,<br />
y)<br />
=<br />
f b<br />
− N 1 N −1<br />
∑∑<br />
u=<br />
0 v=<br />
0<br />
− N 1 N −1<br />
∑∑<br />
x=<br />
0 y=<br />
0<br />
( 2x<br />
+ 1)<br />
uπ<br />
( 2y<br />
+ 1)<br />
vπ<br />
f ( x,<br />
y)<br />
cos cos<br />
2N<br />
2N<br />
( 2x<br />
+ 1)<br />
uπ<br />
( 2y<br />
+ 1)<br />
vπ<br />
α ( u)<br />
α(<br />
v)<br />
C(<br />
u,<br />
v)<br />
cos cos<br />
2N<br />
2N<br />
⎧<br />
⎪<br />
α ( u)<br />
= ⎨<br />
⎪<br />
⎪<br />
⎩<br />
1<br />
N<br />
2<br />
N<br />
för u = 0<br />
för u = 1,<br />
2 ... N −1<br />
( 2x<br />
+ 1)<br />
uπ<br />
( 2y<br />
+ 1)<br />
vπ<br />
( u,<br />
v,<br />
x,<br />
y)<br />
= α(<br />
u)<br />
α ( v)<br />
cos cos<br />
2N<br />
2N<br />
benämns en basfunktion för DCT och dess värde en baskoefficient för DCT. Inspektion ger att<br />
förberäkning av denna baskoefficient är möjlig eftersom dess värde endast beror av de diskreta<br />
iterationsvärdena u, v, x och y samt konstanten N.<br />
Med en i förväg känd blockdimension och förberäknade baskoefficienter reduceras med andra ord<br />
beräkningskomplexiteten för DCT till<br />
34
med motsvarande invers<br />
Beräkningen<br />
C ( u,<br />
v)<br />
=<br />
f ( x,<br />
y)<br />
=<br />
− N 1 N −1<br />
∑∑<br />
x=<br />
0 y=<br />
0<br />
− N 1 N −1<br />
∑∑<br />
u=<br />
0 v=<br />
0<br />
f b<br />
f ( x,<br />
y)<br />
f ( u,<br />
v,<br />
x,<br />
y)<br />
35<br />
b<br />
C(<br />
u,<br />
v)<br />
f ( u,<br />
v,<br />
x,<br />
y)<br />
( x,<br />
y)<br />
f ( u,<br />
v,<br />
x,<br />
y)<br />
benämns en DCT–operation (eller ett s.k. multiply–add par, efter de (flyttals)instruktionerna som<br />
en kompilator skulle generera för operationen). På detta vis kommer beräknandet av DCT (eller<br />
inversen av DCT) med andra ord att reduceras till cirka N 2 DCT–operationer. På samma vis<br />
kommer de förberäknade baskoefficienterna att kräva lagring av N 4 flyttal.<br />
Blockdimension<br />
b<br />
Antal DCT– Lagringsutrymme för<br />
operationer baskoefficienter (kB)<br />
4 16 2<br />
8 64 32<br />
12 144 162<br />
16 256 512<br />
20 400 1250<br />
24 576 2592<br />
28 784 4802<br />
32 1024 8192<br />
Figur 3. Antal DCT–operationer och lagringsutrymme som funktion av vanliga blockdimensioner<br />
(lagringsutrymme uttryckt i kilobytes (kB) för 8 bytes flyttal)<br />
Diskreta Sinus Transformen (DST)<br />
Den Diskreta Sinus Transformen (DST) använder sig som namnet antyder av sinustermer på<br />
liknande vis som DCT använder sig av cosinustermer. Då DCT erbjuder prestanda som ligger nära<br />
den optimala KLT för datamängder med hög korrelationskoefficient så erbjuder DST på samma<br />
vis motsvarande prestanda för datamängder med låg korrelationskoefficient. Av detta skäl används<br />
DST ibland som en kompletterande komponent till DCT vid bild– och ljudkompression. Naturliga<br />
avbildningar (d.v.s. avbildningar av den reella världen såsom fotografier) har dock ofta en mycket<br />
hög korrelationskoefficient eftersom närliggande pixlar i högupplösta bilder ofta avbildar samma<br />
objekt och därmed har närliggande värden, varför DCT är betydligt vanligare förekommande än<br />
DST i komprimeringssystem.
Transformbaserad bildkompression med DCT<br />
Indelning av bilder i block<br />
Transformbaserad kompression med DCT bygger på att det finns en stark korrelation i färgintensitetsvärdena<br />
mellan närliggande pixlar och för att dra större nytta av denna så delas bilden in<br />
i små kvadratiska block. Dessa block av pixlar extraheras sedan ur bilden varefter den tvådimensionella<br />
DCT beräknas på dem och slutligen komprimeras desamma genom att förkasta de<br />
transformkoefficienter som erbjuder minst relevant data för återrekonstruktionen av blocket. När<br />
fler och fler transformkoefficienter förkastas tenderar pixelvärden i det återskapade blocket att gå<br />
mot medelvärdet av alla pixlar i ursprungsblocket, vilket introducerar s.k. blockningsartefakter i<br />
den bild som sätts samman av de återskapade blocken. Dessa blockningsartefakter formar i den<br />
återskapade bilden skarpa kanter i gränserna mellan block och det visuella intrycket av pixelering,<br />
d.v.s. att bildens upplösning sjunker och större pixlar skapas. För att minimera dessa effekter<br />
brukar blockdimensionen väljas till att vara kvadratisk eftersom detta då minimerar avstånden<br />
mellan de pixlar som påverkas av DCTn. Detta är förövrigt något som även medför beräkningsmässiga<br />
fördelar i implementation av systemet. Blockningsartefakter kan även till viss del<br />
utjämnas i efterbehandling av bilden med riktade medelvärdesfilter, som då utjämnar dessa skarpa<br />
kanter. Eftersom indelningen av bilder i block sker efter samma mönster i bildruta efter bildruta så<br />
erbjuder detta möjligheter till prestandavinster genom parallell behandling av blocken. På multiprocessormaskiner<br />
kan detta exempelvis uppnås transparent genom trådning av kompressionssystemet.<br />
Original<br />
36<br />
Blockningsartefakter
Original,<br />
förstoringsfaktor 10<br />
Blockutjämning för bilder av udda storlek<br />
Figur 4. Blockningsartefakter<br />
37<br />
Blockningsartefakter,<br />
förstoringsfaktor 10<br />
En frågeställning som uppstår tidigt är hur kanterna i de bilder där bilddimensionerna inte är jämnt<br />
delbara med blockdimensionen skall behandlas. De vanligaste ansatserna här är att i förbehandling<br />
av bilden antingen klippa bort de överskjutande pixlarna eller att använda ett paddningsschema för<br />
att fylla ut de berörda kantblocken med pixlar. I det senare fallet är det lämpligt att då använda<br />
närliggande pixlar till detta eftersom DCT–kompressionens framgång beror på korrelationen<br />
mellan pixlarna inom blocken. Ett exempel på ett paddningschema som gör så är mirror–edge,<br />
vilket liksom namnet antyder speglar pixlar runt kanterna av bilden. Mirror–edge kan smidigt<br />
implementeras genom att använda indextabeller när blockens pixlar extraheras ur bilden.<br />
33<br />
2<br />
9<br />
− 6<br />
− 4<br />
1<br />
3<br />
4<br />
− 9<br />
− 7<br />
2<br />
−1<br />
6<br />
2<br />
1<br />
5<br />
⇒<br />
33<br />
2<br />
9<br />
− 6<br />
− 6<br />
9<br />
−4<br />
1<br />
3<br />
4<br />
4<br />
3<br />
−9<br />
− 7<br />
2<br />
−1<br />
−1<br />
2<br />
6<br />
2<br />
1<br />
5<br />
5<br />
1<br />
6<br />
2<br />
1<br />
5<br />
5<br />
1<br />
−9<br />
− 7<br />
2<br />
−1<br />
−1<br />
2<br />
Figur 5. Mirror–edge pad av en godtycklig 4 · 4 matris,<br />
blockdimension 3, resulterande i en 6 · 6 matris<br />
Transformkärnan och transformkoefficienterna<br />
Implementationen av transformkärnan är viktig att optimera eftersom den är central för bildkompressionen<br />
och beräkningsintensiv. Metoder för att optimera denna går ut på att föreberäkna<br />
transformtermerna (vilka endast beror på blockdimensionen) samt att rulla ut den tvådimensionella
transformen till att beräknas som en sekvens av beräkningar av den endimensionella transformen<br />
(vilken i sig går att rulla ut, alternativt optimeras hårdvarunära). De transformkoefficienter som<br />
DCT resulterar i är spatiellt ordnade i ett tvådimensionellt block, med låga frekvenser centrerade<br />
mot det övre vänstra hörnet och de höga mot det nedre högra hörnet av transformspektrat. Den<br />
första (översta vänstra) transformkoefficienten har oftast ett större värde än de övriga och kallas av<br />
den anledningen ibland likströmskomponenten efter hur växelströmmar representeras på oscilloskop.<br />
De övriga transformkoefficienterna har positiva eller negativa värden vilket motsvarar att<br />
dess motsvarande sinusoid skall adderas till eller dras från den första.<br />
Normalisering av transformkoefficienterna<br />
Vid kompression av bilder genom trunkering av transformkoefficienter dyker det upp ett svårt val<br />
mellan motstridiga intressen. För kvalitetens skull är det önskvärt att behålla så många transformkoefficienter<br />
som möjligt men samtidigt för kompressionsgradens skull för bör så många som<br />
möjligt förkastas. Den lämpliga kompromissen här är att behålla de som är viktigast för slutanvändarens<br />
uppfattning av bilden, varför det är lämpligt att börja i den änden – genom att<br />
bestämma vilka de är samt hur de skall lokaliseras. Är slutanvändaren en industrirobot som inte<br />
klarar av att uppfatta förändringar över en viss frekvens görs detta enkelt men då slutanvändaren är<br />
en människa blir uppgiften betydligt svårare. I avsaknaden av matematiska formler eller uttryck<br />
som med tillförlitlighet kan avgöra till vilken noggrannhet en människa kan uppfatta specifika<br />
delar av en signal (vilket även är något som varierar stort från individ till individ) så är det bästa<br />
tillgängliga verktyget statistiska studier av slutanvändargruppen. En vanlig metod för att få data<br />
om hur olika bilder uppfattas av människor är att ta en referensgrupp människor (som är jämnt<br />
fördelad över kön, ålder och andra fysiska faktorer) och visa dem ett urval av bilder där olika typer<br />
av störningar av olika storlek introducerats och låta dem själva avgöra vilken bild som de uppfattar<br />
som tydligast. På detta vis kan exempelvis en uppfattning om huruvida suddighet uppfattas mer<br />
störande än grynighet i en bild bildas. Nackdelen med att använda statistiska metoder som denna<br />
är att det är tidsödande samt att resultaten kan vara mycket svårtolkade. Ett känt exempel på dylikt<br />
arbete som genomförts är de normaliseringsmatriser som JPEG konsortiet tagit fram inom JPEG<br />
standarden för kompression av stillbilder.<br />
När väl en uppfattning om vilken typ av fel som finns i systemet bildats är det möjligt att vikta de<br />
beräknade transformkoefficienterna före de trunkeras efter de egenskaper de förväntas ha. Denna<br />
process kallas normalisering och kan användas utan att introducera en alltför hög beräkningskomplexitet<br />
(eller implementationskomplexitet för den delen). Exempelvis är det möjligt att skala<br />
ner transformkoefficienter som bedöms generellt oviktiga för bildkvalitet så att de sällan tar sig<br />
genom trunkeringen. En annan möjlighet är att skala ner koefficienter som ofta har höga värden så<br />
att de är värdemässigt bättre anpassade för den kommande kvantifieringen för huffmankodning,<br />
detta då för att reducera storleken på huffmankodningens uppslagstabell.<br />
Detta steg implementeras enklast genom att multiplicera koefficientblocket med en viktningsmatris<br />
innan trunkeringen och på motsvarande vis multiplicerar med inversen av den matrisen i<br />
slutet av dekomprimeringsfasen. Notera att en stor del av blocket i dekomprimeringsfasen kommer<br />
att innehålla nollor varför en optimeringsvinst går att göra i implementationen genom hårdkodning<br />
och utrullning av den matrismultiplikationen. Om variansmetoden använts i trunkeringen gäller<br />
detta även i komprimeringsfasens skede.<br />
38
Trunkering av transformkoefficienter<br />
Det finns många ansatser och varianter på hur val av transformkoefficienter för förkastning skall<br />
göras, även hur mycket var och en av de kvarvarande skall användas är en viktig punkt här.<br />
Normalt sett brukar en enda del av systemet ha hand om både valet av vilka som skall förkastas<br />
och hur mycket de kvarvarande skall användas – här delas dessa val dock upp i två delar och<br />
benämns trunkering respektive kvantifiering av transformkoefficienter.<br />
Eftersom dessa, just valet och behandlingen av transformkoefficienter, är den största källan till<br />
kompression i transformbaserade kompressionssystem så anpassas oftast resten av systemet efter<br />
just dessa. Grundparametrarna för systemet (krav på kompressionsgrad, maximal beräknings<br />
intesitet och liknande) kan ju vara oföränderliga, men inom ramen för dessa är förändras gärna för<br />
att öka prestanda.<br />
Som en förtydligande fotnot kan påpekas att ofta används endast en kvantifieringsansats gentemot<br />
transformkoefficienterna och inte någon trunkering, detta eftersom en kvantifiering i kombination<br />
med en bitallokeringskodning i sig kan erbjuda tillräcklig trunkering. Trunkering är dock fristående<br />
medan kvantifiering ofta sker i samverkan med bitallokeringsprocessen.<br />
Trunkering efter magnitud<br />
Vid trunkering efter magnitud (även kallad n’th percent coding) så trunkeras transformkoefficienterna<br />
efter en viss önskad kompressionsgrad eller beräkningsintensitet. Som namnet<br />
antyder skall n procent bildinformation sparas och för varje block behålles de transformkoefficienter<br />
som har högst magnitud (och därmed innehåller mest information). Observera att<br />
eftersom transformkoefficienter kan vara negativa (vilket motsvarar att den sinusoiden skall<br />
subtraheras från totalsignalen istället för adderas) så används magnituden på koefficienten, d.v.s.<br />
storleken (i praktiken absolutbeloppet) och inte det aktuella värdet. Detta motsvaras geometriskt av<br />
att välja de sinusoider som kommer att påverka den rekonstruerade funktionen mest. Den uppenbara<br />
nackdelen med trunkering efter magnitud är att samtliga transformkoefficienter måste beräknas<br />
för att kunna avgöra vilka som är störst. Både detta och att lokalisera de n största är<br />
beräkningsintensiva operationer, varför denna ansats sällan används i praktiken. Denna ansats ger<br />
dock ett ganska bra mått på hur en viss generell kompressionsgrad kommer att påverka en bild,<br />
samt ger givetvis även möjligheten att se var det mesta av bildinformationen finns.<br />
33<br />
2<br />
9<br />
− 6<br />
−4<br />
1<br />
3<br />
4<br />
−9<br />
− 7<br />
2<br />
−1<br />
6<br />
2<br />
1<br />
5<br />
⇒<br />
39<br />
33<br />
0<br />
9<br />
0<br />
0<br />
0<br />
0<br />
0<br />
−9<br />
− 7<br />
Figur 6. Trunkering efter magnitud av en godtycklig 4 · 4 matris,<br />
25 procent (4 av 16) transformkoefficienter sparas<br />
0<br />
0<br />
0<br />
0<br />
0<br />
0
Trunkering efter varians<br />
Trunkering efter varians (som även kallas zonal coding) innebär att ett fixt antal transformkoefficienter<br />
väljs för användning och övriga förkastas. Det som skiljer variansmetoden från<br />
magnitudmetoden är att här väljes vilka som skall sparas efter förväntade värden (signalens<br />
varians) och inte efter de faktiska värdena på transformkoefficienterna. Med denna ansats ges stora<br />
möjligheter till optimeringar – är det i förväg känt vilka koefficienter som kommer att användas så<br />
behöver ju endast dessa beräknas! Detta möjliggörs av att transformkoefficienterna endast är<br />
beroende av indata samt parametrar och inte av varandra. I den tvådimensionella transformen<br />
kommer de låga frekvenserna (vilka motsvarar långsamma förändringar i bilden vilka människor<br />
lättare kan uppfatta) att samlas mot den övre vänstra halvan i transformsspektrat. På grund av detta<br />
väljs vanligen väljs den zon av koefficienter i blocket som skall beräknas efter ett zick–zack<br />
mönster som går från den övre vänstra delen av transformspektrat mot det nedre högra. På samma<br />
vis samlas de höga frekvenserna (vilka motsvarar snabba förändringar i bilden) i transformspektrat<br />
mot det nedre högra hörnet. Som kuriosa kan även nämnas att vissa typer av fel och störningar i<br />
bilder, t.ex. extremvärdesfel orsakade av hårdvaruproblem eller fysiska störningar i överföring av<br />
signaler, ofta representeras av mycket höga frekvenser i frekvensspektrat och då dessa väljs bort i<br />
trunkeringen så agerar kompressionensystemet som ett lågpassfilter som tar bort dessa störningar.<br />
Det optimala viset för att konstruera zonfiltret (som skall avgöra vilka koefficienter som skall<br />
beräknas och sparas) är som tidigare statistiska studier av målgruppen och representativt indata.<br />
33 −4<br />
−9<br />
6 33 −4<br />
2<br />
9<br />
− 6<br />
1<br />
3<br />
4<br />
− 7<br />
2<br />
−1<br />
2<br />
1<br />
5<br />
⇒<br />
Figur 7. Trunkering efter varians av en godtycklig 4 · 4 matris,<br />
25 procent (4 av 16) transformkoefficienter sparas<br />
Ett populärt argument för varianstrunkering är att människans ögon är konstruerade för att bättre<br />
uppfatta bilder med långsamma förändringar, varför det mesta av bildinformationen vi kan<br />
tillgodogöra oss kommer att representeras av transformkoefficienter med låga frekvenser. Snabba<br />
förändringar inom bilder (speciellt rörliga sådana) kan vara viktiga men också upplevas störande,<br />
speciellt då de utgörs av bildfel. Nackdelen med varianstrunkering är uppenbar – det är på inga vis<br />
garanterat att de transformkoefficienter som innehåller de för bildupplevelsen viktigaste bilddata<br />
kommer att beräknas. Vanliga fel som uppstår är att skarpa konturer och kontraster inom block<br />
”suddas ut” och blir ofokuserade eftersom den bildinformation som innehåller dem (transformkoefficienterna<br />
för de höga frekvenserna) förkastats. Förlusten av kontraster i bilden är extra<br />
kännbar eftersom dessa kan motverka upplevelsen av de tidigare nämna blockningsartefakterna.<br />
Trunkering efter varians största förtjänst ligger dock i dess optimeringsmöjligheter – är det i<br />
förväg känt vilka transformkoefficienter som kommer att förkastas behöver dessa inte beräknas!<br />
Genom att kombinera trunkering efter varians med trunkering efter magnitud är det även möjligt<br />
att få ett system som ger en avvägning mellan beräkningsintensitet och kvalitet.<br />
Tröskeltrunkering<br />
I Tröskeltrunkering (threshold coding) görs en avvägning som erbjuder en större grad av<br />
noggrannhet än variansmetoden men ändå inte introducerar riktigt lika mycket beräkningar som<br />
40<br />
2<br />
9<br />
0<br />
0<br />
0<br />
0<br />
0<br />
0<br />
0<br />
0<br />
0<br />
0<br />
0<br />
0
magnitudmetoden. I Tröskeltrunkering beräknas samtliga transformkoefficienter men det är endast<br />
de över ett visst tröskelvärde som behålls. Med andra ord besparas systemet sorterings–sök<br />
komplexiteten i att lokalisera de n största. Den stora nackdelen med denna ansats är att någon<br />
absolut kompressionsgrad inte kan bestämmas i förväg eftersom indata kan variera mycket från<br />
bild till bild. I lösningar med fix bandbredd kan detta resultera i att hela bildrutor måste förkastas<br />
för att kompensera för detta. En annan nackdel är att det kan vara svårt att finna ett lämpligt<br />
tröskelvärde som gallrar bort de mindre intressanta koefficienterna men ändå behåller de mer intressanta.<br />
Denna anpassning kan dock göras adaptivt (genom att studera insignalen och anpassa<br />
tröskelvärdet), med eller utan assistans av slutanvändaren. Denna process kan även underlättas<br />
genom att anpassa en viktningsmatris till att producera värden som är enklare att tröskla. Den stora<br />
fördelen med denna ansats är dock att anpassningen mot kvalitet kan vara mycket god eftersom de<br />
block som innehåller mer bildinformation också kan få fler transformkoefficienter sparade. Detta<br />
kan göra mycket för att motverka blockningsartefakter och öka helhetsintrycket.<br />
33<br />
2<br />
9<br />
− 6<br />
−4<br />
1<br />
3<br />
4<br />
−9<br />
− 7<br />
2<br />
−1<br />
6<br />
2<br />
1<br />
5<br />
⇒<br />
41<br />
33<br />
0<br />
9<br />
− 6<br />
0<br />
0<br />
0<br />
0<br />
−9<br />
− 7<br />
Figur 8. Tröskeltrunkering av en godtycklig 4 · 4 matris,<br />
tröskelvärde 5<br />
Det finns även ansatser som använder sig av än mer adaptiva system, där antalet koefficienter som<br />
sparas allokeras från block till block. Dessa uppnår naturligtvis en högre bildkvalitet för en given<br />
kompressionsgrad (speciellt för naturliga bilder såsom fotografier, vilka ofta innehåller många<br />
färger samt geometriskt oregelbundna former och texturer), men har ofta betydligt mer komplexa<br />
algoritmer. Detta är inte endast negativt vid implementation utan kan även påverka det övriga<br />
systemet när någon del skall bytas ut. När dessa mer adaptiva ansatser används interaktivt (i konjunktion<br />
med en slutanvändare som själv får välja vilka områden av bilden mer lagringsutrymme<br />
skall allokeras för) uppnås de subjektivt högsta grader av kompression som transformbaserade<br />
kompressionsystem kan uppnå. Inom <strong>bildtelefoni</strong> är dock automatiserade system mer intressanta<br />
eftersom kalibreringen av systemet kan störa kommunikationen.<br />
0<br />
0<br />
6<br />
0<br />
0<br />
5
Original<br />
Trunkering efter varians, RMSE = 20.84<br />
Figur 9. Jämförelse av olika former av trunkering,<br />
kompressionsgrad 90 procent<br />
42<br />
Trunkering efter magnitud, RMSE =15.26<br />
Tröskeltrunkering, RMSE = 11.94
Kvantifiering av transformkoefficienter<br />
Det finns ett antal olika sätt att göra valet av vilka transformkoefficienter som skall sparas och<br />
vilka som skall förkastas vid transformbaserad komprimering. Stor vikt bör läggas vid det här<br />
skedet av designen av kompressionssystem eftersom det här introduceras ett stort dataförstörande<br />
element.<br />
När de ointressanta delarna av bilden väl förkastats av trunkeringen följer processen att kvantifiera<br />
de kvarvarande transformkoefficienterna. Detta är givetvis även det en dataförstörande process<br />
men finner sin motivering i att detta storligen underlättar bitallokeringsfasen. Här kvantifieras de<br />
kvarvarande transformkoefficienterna till dem närliggande värden som är bättre representerade i<br />
det följande stegets komprimering. Detta är en process som vanligen är implementationmässigt<br />
nära förknippad med (eller rent ut en del av) den bitallokeringsalgoritm som valts för systemet, då<br />
värdena från kvantifieringen är direkt knutna till dess effektivitet.<br />
Huffmankodning, vilket är ett vanligt val för bitallokeringalgoritm, använder sig som tidigare<br />
nämnts av en slags uppslagstabell där mer vanligt förekommande värden ges en kortare bitrepresentation.<br />
Eftersom transformkoefficienterna till sin natur är flyttal så brukar kvantifieringen<br />
även involvera avrundning till en viss noggrannhet samt ofta (av effektivitetsskäl) en omvandling<br />
till heltal via heltalsförskjutning eller fixpunktsnotation.<br />
Bitallokering av transformkoefficienterna<br />
För att Huffmankodningen av transformkoefficienterna skall bli så effektiv som möjligt används<br />
lämpligen här återigen de statistiska metoder som tidigare nämnts, nämligen att för olika intressanta<br />
bildtyper gå igenom de olika värden på (nu kvantifierade) transformkoefficienter som kan<br />
uppstå och se vilka som är vanligast. Eftersom det i denna process innehas god uppfattning om<br />
vilka typer av värden som uppstår och även här finns möjlighet (genom kvantifiering) att anpassa<br />
de värden som skall lagras kan oftast en mycket god kompressionsgrad uppnås även för Huffmankodningen<br />
av den nya bildrepresentationen.<br />
Eftersom den första transformkoefficienten i varje block (den s.k. likströmskoefficienten) ofta har<br />
ett värde som är signifikant större än de övriga (som geometriskt adderas eller dras från denna för<br />
att anpassas mot ursprungsfunktionen) bör en separat Huffmantabell användas för att koda denna.<br />
Här bör noteras att det är trunkeringen (förkastandet av transformkoefficienter) samt kvantifieringen<br />
(behandlingen av kvarvarande transformkoefficienter) som introducerar dataförstörelse.<br />
Sparas samtliga transformkoefficienter utan kvantifiering så kan givetvis ursprungsbilden återskapas<br />
oberoende av både Huffmankodning och transformen. Detta är sant åtminstone teoretiskt, i<br />
praktiken introduceras en mängd kumulativa små räknefel genom dagens hårdvaras begränsade<br />
noggrannhet i flyttalsrepresentationer och cosinusutvecklingar. Dessa små räknefel är dock enkla<br />
att korrigera för (och försvinner i regel automatiskt när de värden man får av signaltransformens<br />
invers omvandlas tillbaka till diskreta färgvärden för pixlar igen).<br />
Avslutningsvis om trunkering och kvantifiering av transformkoefficienter kan nämnas att de flesta<br />
kompressionssystem använder sig av ett flertal kvantifierare som de växlar mellan. Detta sker<br />
vanligen efter ett till subband coding närbesläktat vis för att uppnå en god kompressionsgrad.<br />
43
Modellbaserad komprimering<br />
Modellbaserad komprimering kan ses som en utökning av den tidigare nämnda predictive coding,<br />
där tanken förts ett steg längre och en modell av datakällan (och ibland även slutanvändaren)<br />
skapats. Istället för att fokusera på statistisk analys av det data som genereras av datakällan kodas<br />
istället informationen som avvikelser från parametrarna för datakällans modell. Detta släktskap<br />
åsido så kan modellbaserad komprimering dimensioneras till att vara förlustfri (vanligen då med<br />
olika scheman som kompenserar för förlorad information parallellt med den vanliga datakanalen).<br />
Oftast är modellbaserad komprimering kraftigt dataförstörande och används då tillgänglig bandbredd<br />
är vida understigande mängden rådata som produceras av datakällan, som vid videokonferenser<br />
över telefonlinjer.<br />
Ett exempel på denna ansats, som även om den är av något krystad natur kan ses som en god bild<br />
av det ideala modellbaserade systemet, är många av dagens grafikintensiva 3D–datorspel.<br />
Vissa grafiskt intensiva datorspel genererar en grafisk vy över handlingen (till stor del i realtid)<br />
från en geometriskt uppbyggd modell av en virtuell värld. De flesta detaljer i denna virtuella värld<br />
är i förväg definierade ner på polygonnivå, lämnandes endast generationen av den grafiska vyn till<br />
realtidsberäkningarna. Detta ger möjligheten att när flera spelare skall spela tillsammans (och är<br />
sammanslutna av ett nätverk med begränsad bandbredd) överföra dem emellan de exakta data från<br />
världen som behövs för att själva generera grafiska vyer av sina mot/medspelare. Att göra detta,<br />
istället för att överföra de faktiska grafiska vyer som olika spelare erfar, sparar in enorma mängder<br />
överföringskapacitet. Skulle denna värld inte vara detaljerad och i förväg analyserad i den utsträckning<br />
den är så skulle informationsmängden som behöver överföras växa sig ohanterligt stor<br />
nästan omedelbart.<br />
Ett annat intressant område som är värt att ta upp som exempel av modell baserad kompression är<br />
röstkodning för telefoni, ett område som rönt stor uppmärksamhet på grund av de senaste årens<br />
växande popularitet hos mobila telefonisystem. Just denna mobilitet, vilken implementeras genom<br />
radiobaserade nätverksprotokoll, introducerar en begränsad överföringskanal och ställer därmed<br />
stora krav på kompression av den information som skall överföras. Den modell som används för<br />
kompression av mänskligt tal (vilket per definition för en majoritet av den överförda informationen<br />
inom telefoni) i detta fall är en modell av den fysiska del av människokroppen som genererar talet<br />
– talapparaten. Ljud i den mänskliga talapparaten skapas grundläggande när luft pressas från lungorna<br />
genom stämbanden, vilkas modulation kan användas för att skapa ljud av olika frekvenser.<br />
Genom att de håligheter (bronker, nasalgångar och liknande vilka kan modelleras efter deras<br />
fysiska utseende som semicylindriska rör) som detta ljud sedan resonerar fram genom är individuellt<br />
anpassade för olika individer skapas sedan en omfångsrik och karaktäristisk bild av en röst.<br />
Genom studier av denna modell av den mänskliga talapparaten har statistisk information om hur<br />
ljud av mänskligt tal genereras och vilka karaktäristika det uppvisar utvunnits. Data såsom<br />
frekvensavvikelser, temporala korrelationer i modellen och hur de olika parametrarna påverkar<br />
olika delar av den totala ljudbilden är senare till stor nytta vid talsyntes, vilken kan nyttjas för<br />
kompression eftersom informationen kan kodas som avvikelser från en statistiskt framtagen förutsägelse<br />
– i detta fall talsyntesen i sig själv.<br />
Inom området <strong>bildtelefoni</strong> utförs mycket forskning inom modellbaserad komprimering, bland<br />
annat inom olika sätt att överföra rörliga bilder med hjälp av starka antaganden kring miljön där<br />
bilderna skapats. Det har utvecklats modeller för det mänskliga ansiktet som till färg, form och<br />
beteende uttrycker oerhörda detaljnivåer för hur människor uttrycker sig. Dessa modeller studerar<br />
vilka ansiktsmuskler som används för tal, uttryckande av känslor eller annan typ av kommunikation.<br />
Vanliga färger på mänsklig hud, ögon och hår, geometriska förhållanden mellan olika<br />
ansiktsdrag och mycket mera har dokumenterats för olika åldrar och etniciteter. Dessa modeller<br />
kan genom denna kunskapsbas och detaljrikedom sedan erbjuda enorma kompressionsnivåer till<br />
acceptabel kvalitet. Som i de övriga fallen av modellbaserade system överförs modellen, olika<br />
individers statiska parametrar till modellen (olika geometriska mått på individers ansikten,<br />
44
segmenterade bilder som används som texturer för ansiktsytor) samt i slutändan de dynamiska<br />
parametrarna till modellen (data som uppstår då ett faktiskt samtal uppstår, vad de olika parterna<br />
säger och gör).<br />
Figur 10. Exempel på ansiktsmodell för modellbaserad kompression<br />
(Bild från [1])<br />
Modellbaserad komprimering är den av ansatser av idag som genererar de mest effektiva komprimeringarna<br />
tillgängliga inom kompression för överföring. Det används vanligen inom tillämpningar<br />
där det går att identifiera och göra utförliga antaganden om datakällan, alternativt där det<br />
finns extrema kompressionskrav. Med mer och mer raffinerade modeller för fysisk modellering av<br />
datakällor (vilka i teorin erbjuder högre och högre grad av kompression) så ter sig modellbaserad<br />
komprimering som en metod för framtiden, åtminstone inom avgränsade applikationsområden.<br />
Nackdelen med modellbaserad komprimering är uppenbar, eftersom graden av kompression direkt<br />
beror på hur pass väl datakällan kan modelleras så erbjuder denna ansats bara kompression inom<br />
det specifika område modellen tagits fram för. Denna starkt begränsade generalitet bör ses i samband<br />
med faktumet att svårigheterna i att modellera datakällor är många och arbetet att ta fram<br />
dem tidskrävande.<br />
Som en avslutande kommentar om modellbaserad komprimering för <strong>bildtelefoni</strong> kan nämnas att<br />
detta ämnesområde egentligen förtjänar betydligt större utrymme i denna rapport men eftersom<br />
författarens personliga intressen och teoretiska bakgrund ligger mer åt det klassiska signalbehandlingshållet<br />
har detta arbete vinklats åt det hållet. För mer information om modellbaserade<br />
komprimeringsmetoder se [1], [10] och [20].<br />
45
Spektral redundans<br />
På grund av hur det mänskliga ögat (och därför även dagens bildskärmar) är konstruerat så brukar<br />
bilder vanligen representeras som matriser av pixlar med färgvärden uttryckt i RGB komponenter.<br />
Detta medför den tekniska fördelen att bildskärmarna då kan använda pixelvärdet för varje färgkanal<br />
som ett intensitetsvärde för hur starkt det skall belysa varje pixel på skärmen. Det finns dock<br />
ett flertal andra färgrymder som representerar bildinformation på andra, mer lämpliga för den<br />
aktuella tillämpningen, vis. För kompression av färgbilder (bland annat för television) har det<br />
tagits fram ett flertal standarder där alternativa färgrepresentationer som är mer lämpliga för<br />
kompressionstillämpningar har valts. Exempel på sådana färgrymder är HSL, HSI, YUV, YIQ och<br />
YCbCr. I dessa färgrymder bestäms färger i termer av ljusintensitet (svart–vit komponenten i<br />
dagens television), luminans (eller färgstyrka) och kromatisitet (eller färgdjup). Fördelen inom<br />
komprimering med detta beror på att det mänskliga ögat är betydligt bättre på att uppfatta<br />
skiftningar i ljusintensitet än skillnader i färgkomponenter (det finns ca hundra miljoner tappar mot<br />
bara ca fem miljoner stavar i mänskliga ögon), vilket kan utgöra en källa för redundans i bilddata.<br />
Speciellt är det mänskliga ögat relativt okänsligt för förändringar i färger, varför färgkomponenterna<br />
med fördel kan trunkeras med variansmetoder (vilka då filtrerar bort de högfrekventa<br />
koefficienterna). Ett vanligt schema för kodning av färgbilder brukar vara 4:1:1, d.v.s.<br />
att fyra gånger mer intensitetsinformation än färginformation sparas. Med andra ord är det möjligt<br />
att på grund av det mänskliga ögats konstruktion komprimera färgsignalerna mer än intensitetssignalen<br />
utan att den mänskliga slutanvändaren märker det. Det är även möjligt att hårdare komprimera<br />
färgkomponenten i bilder utan att orsaka alltför kraftiga matematiska fel, kraftigare<br />
kompression än 4:1:1 tenderar dock att påverka den subjektiva upplevelsen av bilden negativt.<br />
Figur 11. MSE som funktion av kompressionsgrad för olika färgkodningsscheman.<br />
Bild Lena, blockdimension 16, trunkerad efter magnitud<br />
46
Att komma åt spektral redundans innebär implementationsmässigt att bilden omvandlas till den<br />
önskade färgrymden före kompression, och därför även måste omvandlas tillbaka till den<br />
ursprungliga färgrymden efter att ha dekomprimerats. Under komprimeringen utförs DCTn på<br />
varje enskild färgdimension för sig, detta är analogt med att betrakta en bild med tre färgkanaler<br />
som tre separata gråskalebilder. När bildens transformkoefficienter beräknats trunkeras slutligen<br />
de olika blocken olika mycket, närmare bestämt fyra gånger så hårt för färgkomponenterna som<br />
för intensitetskomponenten (i 4:1:1 schemat). Denna datadestruktion maskeras sedan för den<br />
mänskliga slutanvändaren till viss del när bilden åter omvandlas till den ursprungliga färgrymden –<br />
det slutanvändaren ser är inte den hårdare trunkeringen av färginformationen utan en bättre eller<br />
sämre approximation som baseras på både intensitets– och färgdimensionerna.<br />
Notera att omvandlingar mellan dessa färgrymder är en förlustfri process – det enda beräkningsmässiga<br />
fel som introduceras beror på den begränsade noggrannheten i dagens datorers flyttalsrepresentation.<br />
En implementationsmässig vinst som finns att göra vid spektral komprimering är<br />
att istället för att komprimera färgblocken hårdare så är det möjligt att representera färgkomponenterna<br />
med mindre block. Istället för att trunkera och kvantifiera tre stycken 8 · 8 block<br />
olika hårt går det med andra ord att sampla och komprimera ett 8 · 8 block och två 4 · 4 block lika<br />
hårt. Detta påverkar inte noggrannheten nämnvärt men ger fördelen med betydligt färre transformkoefficienter<br />
att arbeta med i signaltransformen (läs DCT).<br />
För mer information om spektral redundans se [9], [16] och [20].<br />
47
Temporal redundans<br />
Hitintills har komprimering av stillbilder eller enskilda bildrutor i videosekvenser och de tekniker<br />
för detta som används diskuterats. Det finns dock stora effektivitetsvinster att göra i kompression<br />
av rörliga bilder genom att studera hur temporal redundans, d.v.s. överflödig och över tiden dåligt<br />
representerad information i bildsekvenser, kan reduceras. När det gäller kompression av videosekvenser<br />
finns det ett flertal olika format och tekniker att använda, både för lagring och för överföring<br />
av video. Vissa kan användas för båda områden men den stora skillnaden dem emellan<br />
brukar som tidigare vara att vid lagring är det möjligt att göra större antaganden om den klient som<br />
skall spela upp eller använda bildsekvensen. Inom bildtelefon avses naturligtvis överföring av<br />
bilder och noteras bör att de tekniker som används för detta ofta även kan användas för lagring<br />
även om det motsatta sällan är fallet.<br />
Ett enkelt och illustrativt exempel på temporal redundans är vid överföring av bilder – om övre<br />
halvan av en bild inte har förändrats sedan föregående bildruta så finns det ju ingen anledning att<br />
sända den delen av bilden igen, mottagaren instrueras helt enkelt istället att återanvända den övre<br />
halvan från föregående bildruta. Naturligtvis finns det en stor nackdel med denna typ av<br />
resonemang – förlitar systemet sig på att föregående bildruta verkligen nått fram till mottagaren<br />
intakta begränsas möjligheten till att återhämta sig från fel som beror på paketbortfall eller<br />
temporära förkastningar av hela bildrutor. Det senare (s.k. frame drops) är för övrigt ett vanligt<br />
problem även för användning av lokala filmsekvenser som dyker upp när den codec (kodare /<br />
avkodare) som används för att (av)koda filmsekvensen inte hinner med. Denna typ av fel, som<br />
uppstår när referenser till föregående bildrutor är ogiltiga, kan även fortplanta sig till efterföljande<br />
bildrutor i en kaskadeffekt av fel. För att motverka denna effekt är det därför brukligt att<br />
regelbundet sätta in s.k. reference frames som sänds i sin helhet och inte har några beroenden av<br />
tidigare bildrutor.<br />
Det är även viktigt att notera att det vid kompression för överföring finns stora skillnader i kraven<br />
på temporala komponenter inom systemet. Handlar det om envägskommunikation (exempelvis<br />
videoöverföring för television) så kan det i förväg läggas ner mycket tid på att identifiera temporal<br />
redundans och koda undan denna. Handlar det om tvåvägskommunikation så kommer svarstiden<br />
för kommunikationskanalen att stå för en stor del av användarnas uppfattning av systemets<br />
effektivitet. Eftersom temporal redundans kan vara mycket kostsam att identifiera men även samtidigt<br />
ge stora möjligheter till kompression så bör denna del designas noggrant.<br />
Som tidigare noterades beror den stora effektiviteten för transformbaserad kompression på den<br />
höga korrelationen mellan närliggande pixlar i naturliga bilder. Det är faktiskt även möjligt att<br />
använda en tredimensionell DCT för att komprimera en bild som förändras över tiden, d.v.s. en<br />
videosekvens. Framgången för denna metod beror då på att även korrelationen över den tredje<br />
dimensionen (tiden) för närliggande pixlar är hög. Detta är speciellt sant för bildsekvenser med<br />
hög bildfrekvens eftersom rörliga objekt i bilden då inte hinner förflytta sig lika långt i bilden som<br />
de skulle med en lägre bildfrekvens. Med andra ord tenderar rörelserna av objekt i bilden att<br />
minska när signalens bildfrekvens ökar. Detta ökar i sin tur korrelationen mellan pixlar i närliggande<br />
bildrutor. Denna observation är viktig även om metoden med tredimensionell DCT är<br />
olämplig för kompression för överföring (man skulle då behöva flera bilder innan det var möjligt<br />
att ens komprimera ett enda block i den första). Även för kompression för lagring är denna metod<br />
sällan använd, här dock eftersom det finns andra och mer effektiva metoder för elimination av<br />
temporal redundans.<br />
Det går även att öka den temporala redundansen i rörliga bilder med hjälp av förbehandling, ofta<br />
genom att modellera en fysisk störningskälla och kompensera för denna. Ett exempel på detta är de<br />
s.k. skakfilter som idag är vanliga på handhållna videokameror. Dessa är dock sällan med i <strong>bildtelefoni</strong>system<br />
eftersom dess kameror (av just den anledningen) monteras fixt. När det generellt<br />
gäller system som utnyttjar temporal redundans är det värt att notera att en bildkälla av hög kvali-<br />
48
tet kan göra mycket för systemets totala effektivitet. En lätt störning som introduceras av bildkällan<br />
kan störa kompressionparametrarna mycket. Typiska exempel på detta är de billiga webkameror<br />
som idag ofta används för bildkommunikation över Internet. På grund av bristande optik<br />
och bildsensorer finns det ofta i dessa automatiska algoritmer för bildförbättring eller ljuskompensation<br />
inbyggda i drivrutinerna. I ett system för <strong>bildtelefoni</strong> vore det bättre om dessa algoritmer<br />
användes i mottagarens ände, efter att alla kompressionselement passerats.<br />
Att identifiera temporal redundans är ett oerhört effektivt sätt att komprimera rörliga bilder och<br />
mycket arbete läggs därför ner på den delen av kompressionssystemet. Notera speciellt att detta<br />
angreppssätt erbjuder möjlighet till effektiv förlustfri komprimering. Det finns många olika sätt att<br />
angripa temporal redundans, från det allra enklaste – att jämföra pixel för pixel vilka som förändrats<br />
sedan föregående bildruta – till de mest avancerade sätt att försöka identifiera objekt i bilden<br />
och sedan förutsäga hur de kommer att röra sig i framtida bildrutor. Vissa av dessa ansatser kan<br />
vara mycket oförutsägbara och beräkningsintensiva (och därmed variera mycket i exekveringstid).<br />
Av denna anledning är de mer avancerade varianterna populärare i system riktade mot kompression<br />
för lagring.<br />
Om kompression av rörliga bilder bör även nämnas att betraktandet av rörliga bilder som sekvenser<br />
av stillbilder inte är optimalt för mänskliga slutanvändare. Det mänskliga synsystemet är konstruerat<br />
för sanna rörliga bilder och kan i rörelse lättare detektera vissa fel som är osynliga i stillbilder<br />
(något som även ibland kan fungera till systemets fördel då vissa fel förminskas i rörelse).<br />
Interlaced frames<br />
En äldre metod för reduktion av temporal redundans som tidigare var vanlig inom television var att<br />
växelvis bara ta med varannan linje i bilden för varje bildruta, s.k. interlacing. Detta är svårt för<br />
det mänskliga ögat att uppfatta och ger en enkel form av komprimering. Tyvärr påverkar denna<br />
metod samtidigt bildens kvalitet och döljer mycket av den redundans som senare delar av<br />
kompressionssystemet hoppas kunna komma åt.<br />
Pixel coding<br />
En av de enklaste metoderna för att beskära temporal redundans är att jämföra bildrutor pixel för<br />
pixel och endast koda de som förändrats. Denna metod är effektiv för enklare animeringar och kan<br />
användas tillsammans med ett adaptivt filtervärde för naturliga bildsekvenser. Den är dock svår att<br />
kombinera med andra komprimeringsansatser och används därför mer sällan för videokodning.<br />
Motion prediction<br />
Motion prediction är en vanlig metod för att komma åt temporal redundans och bygger på<br />
antagandet att det i de flesta videosekvenser finns objekt som rör sig och inte förändras mycket<br />
mellan bildrutor. Denna metod söker därför att identifiera dessa objekt och koda s.k. rörelsevektorer<br />
för dem istället för att repetitivt koda själva bildinformationen för dem. Identifieringen av<br />
dessa objekt sker genom att dela in varje bildruta i block (observera att detta sker före en eventuell<br />
kompression av bilden och att dessa block inte är samma block som diskuterats i samband med<br />
DCT) och i efterföljande bildrutor söka och försöka identifiera hur dessa objekt rört sig. Parametrarna<br />
till denna metod är dels ett mått på hur mycket blocket förändrats (oftast med RMSE) och<br />
dels ett mått på hur mycket det förflyttat sig. Ifall dessa två mått skulle understiga gränserna för<br />
parametrarna anses blocket vara identifierat och en rörelsevektor för blocket kodas, om inte så<br />
anses blocket vara förlorat och den portionen av bilden kodas med sedvanlig bildkodning. En<br />
avancerad version av denna metod utnyttjar tanken att det från tidigare rörelser går att extrapolera<br />
49
hur ett identifierat block kommer att röra sig och då konstruera bildrutor i förväg när dataströmmen<br />
halkar efter (s.k. frame prediction). När dataströmmen sedan hinner ikapp systemet så<br />
kodas avvikelser från dessa förutsägelser. En teknik som kan användas för att öka objektidentifierings<br />
effektivitet är att genom interpolation skapa en mer högupplöst bild för efterföljande<br />
bildruta och sedan däri söka efter objektet.<br />
Bidirectional prediction<br />
En term som introducerades i MPEG–standarden var s.k. bi–direction predictive frames, vilket är<br />
bildrutor som skapas genom frame prediction utgående från både föregående och efterföljande<br />
bildruta. Givetvis kan denna ansats endast användas om efterföljande bildruta finns tillgänglig<br />
vilket sällan håller i överföringsfallet. Bidirectional prediction kan dock uppnå högre grader av<br />
kompression än vanlig frame prediction och kan användas då kommunikationskanalens genomströmning<br />
temporärt sänks eller i kompression för lagring.<br />
Progressive video coding<br />
Progressive video coding är liksom namnet antyder en progressiv ansats, där signalen kodas så att<br />
dess kvalitet ökar allteftersom mer data blir tillgängligt. Signalen har här delats in i flera lager som<br />
prioriteras olika mycket. Detta förfarande är extra användbart i applikationer där den tillgängliga<br />
bandbredden kan variera mycket över tiden (och mindre viktigt data kan förkastas till förmån för<br />
viktigare data i efterföljande bildruta). Inom <strong>bildtelefoni</strong> kan exempelvis bilddata klassifieras i<br />
lager som ansiktsdata, kroppsdata och bakgrund – vilka sedan kan behandlas efter prioritet. Denna<br />
indelning kan ske interaktivt (där användaren själv får bestämma vilka delar av bilden som skall<br />
prioriteras hur) eller per automatik på ett flertal olika vis (ofta baserade på hur ofta den regionen av<br />
bilden förändras).<br />
Blockbaserad kompression av temporal redundans<br />
En beräkningsmässigt jämförelsevis billigt (och framförallt konstant) metod att identifiera temporal<br />
redundans är att för varje bildruta använda de blivande DCT–blocken och jämföra dessa med<br />
föregående bildrutor motsvarande block. Detta implementeras genom att sätta en filtertröskel och<br />
sedan jämföra pixlarna i blocken en efter en. Skulle någon pixel ha förändrats mer än tröskelvärdet<br />
så bedöms hela blocket ha förändrats och passerar filtret. Detta skeende går även att optimera<br />
genom att endast jämföra pixlarna i blockets hörn. För bilder som avbildar rörliga objekt är det<br />
troligt att om blocket förändrats på något vis så har även minst en hörnpixel förändrats, speciellt då<br />
blocken är jämförelsevis små. Alternativt kan detta betraktas som att de block som förändrats utan<br />
att förändra sina hörnpixlar förmodligen innehåller så små förändringar att slutanvändaren ändå<br />
inte skulle notera dem. När blockdimensionen minskar så ökar antal block som måste kontrolleras<br />
per bildruta men samtidigt ökar sannolikt även antalet block som kan förkastas. Eftersom kompression<br />
av block är en så pass beräkningsmässigt dyr operation tjänas dessa extra jämförelser<br />
snabbt in.<br />
Arbetar systemet på blocknivå är det även möjligt att göra medvetna val för att bibehålla datakanalernas<br />
genomströmning. Detta kan ske genom att förkasta mindre viktiga regioner av bilder<br />
till fördel för viktigare regioner. Valet av vilka regioner av bilden som bedöms viktiga kan göras<br />
interaktivt, där slutanvändaren själv kan markera vad som är bakgrund och förgrund, eller på<br />
automatisk basis genom kontroll av hur ofta ett block förändras. Förgrund är per definition mer<br />
sannolikt att förändras mellan närliggande bildrutor än bakgrund.<br />
För mer information om temporal redundans inom bildkompression se [6] och [20].<br />
50
Ett <strong>bildtelefoni</strong>system<br />
Den modell av ett mjukvarurealiserat <strong>bildtelefoni</strong>system som utvecklats i det här arbetet består av<br />
självständiga klienter och en serverbaserad infrastruktur vilka kommunicerar med varandra via<br />
TCP/IP över IP–baserade nät. Infrastrukturens servrar består av certifieringsenheter och katalogstrukturer.<br />
Katalogstrukturerna syftar till att erbjuda klienter ett sätt att söka efter vänner och andra<br />
kommunikationspartners, både baserat på personuppgifter samt orienterat efter ämnen och<br />
intressen. Certifieringsenheterna används för att via certifikat autenticera alla kommunicerande<br />
parter och alla klienter antas i förväg känna till certifieringsenheternas publika nycklar (vilka<br />
förslagsvis distribueras tillsammans med klienterna på säkert vis). Slutligen antas klienterna även<br />
(på ett för användaren transparent vis) registrera sig hos certifieringsenheterna när de ansluter sig<br />
till katalogstrukturer, detta för att garantera att alla användares publika nycklar skall vara kända av<br />
certifieringsenheterna.<br />
Klienten<br />
Klienten i systemet anses vara det centrala för användaren och innehåller en lokal adressbok för<br />
parter som den kommunicerat med tidigare. Detta så att dessa skall kunna kontaktas fler gånger<br />
utan att behöva upprepa certifieringsenhetens autenticering. Eftersom dynamiska IP–adresser blir<br />
vanligare och vanligare i takt med att adressutrymmet i för IPv4 börjar ta slut så sker vid initiering<br />
av kommunikation en uppslagning av mottagarens adress i katalogstrukturen. När väl detta har<br />
skett sköts all kommunikation av klienterna själva, utan vidare inblandning av den serverbaserade<br />
infrastrukturen.<br />
Klienten antas också erbjuda användaren mer än bara bild– och ljudbaserad kommunikation,<br />
såsom fildelning, gemensamma ritblock, guidning av webläsare med mera. Här diskuteras dock<br />
inte dessa perifera tjänster utan endast den visuella direktkommunikationen eftersom denna del är<br />
det centrala i applikationen.<br />
Utbytesförhållanden<br />
Vid design av en modell för kompression, kryptering och överföring av bilddata i en <strong>bildtelefoni</strong>klient<br />
finns det ett flertal komplexa utbytesförhållanden mellan de olika komponenterna i systemet.<br />
Det mest påtagliga av dessa är det som gäller för bildkvalitet – ju bättre kvalitet desto mer data att<br />
behandla och sända. Mängden rådata som skall behandlas stiger som en funktion av signalens<br />
upplösning (bildens pixelsrepresentation, bredd samt höjd) och bildfrekvens. Närmare bestämt är<br />
mängden rådata (i antal bits) produkten av alla dessa faktorer.<br />
Beräkningsbelastning är en avgörande faktor i helt mjukvarurealiserade system och den är även<br />
den beroende av bildkvaliteten, men även valen för typ av kompression, kompressionsgrad, typ av<br />
kryptering samt mängden data som skall krypteras spelar in. Det sistnämnda bestäms av mängden<br />
rådata från bildkällan i kombination med uppnådd kompressionsgrad.<br />
Även om ljudinformation skulle behandlas i detta system så skulle bildinformationen dominera<br />
både bandbreddskrav och beräkningsbelastning. Även för små bildstorlekar och låga bildfrekvenser<br />
kvarstår bildinformationen för majoriteten av det data som skall utbytas.<br />
En önskvärd kvalitet för den här typen av applikationer (telefoni) är att avståndet mellan de kommunicerande<br />
parterna skall vara irrelevant för kommunikationens kvalitet.<br />
Detta är något som uppnås inom vanlig rösttelefoni genom att använda kretskopplade nät, där en<br />
viss bandbredd (vilken i sin tur garanterar en viss datakvalitet) garanteras parterna emellan för hela<br />
51
samtalets längd. Kan denna bandbredd inte reserveras så kopplas samtalet helt enkelt aldrig fram.<br />
Tyvärr är detta resonemang inom <strong>bildtelefoni</strong> – att en i förväg bestämd datakvalitet är att eftersträva<br />
– orealistiskt eftersom bandsbreddskraven här är så mycket högre att infrastrukturen (dagens<br />
Internet) inte kan stödja den typen av koppling ens för kortare avstånd. Av denna anledning<br />
används paketbaserade nät (närmare bestämt IP–baserade nät), där bandbredden kan allokeras om<br />
dynamiskt under (de simulerade) uppkopplingarna för att låta fler användare använda samma överföringskanaler<br />
samtidigt.<br />
Finns det i förväg bestämda kvalitetskrav att utgå från är det är framförallt två faktorer att anpassa<br />
dessa kvalitetskrav mot – beräkningsprestanda hos klienterna samt överföringskapacitet dem<br />
emellan. Av dessa två är det oftare överföringskapaciteten som är den begränsande faktorn, vilket<br />
inte förutses ändras eftersom tillväxten på datorernas beräkningskapacitet idag stiger snabbare än<br />
den generella bandbreddstillgången över långa avstånd.<br />
I detta arbete antas slutanvändare att finna det acceptabelt att kompensera för de eventuella brister<br />
i beräkningsprestanda eller överföringskapacitet som kan dyka upp med sänkta kvalitetskrav.<br />
Klientens bildkommunikation<br />
De delar av klienten som sköter bildkommunikationen består tekniskt av bildkälla,<br />
komprimeringsmodul, krypteringssystem och kommunikationsstack. Var och en av dessa delar<br />
antas teoretiskt fungera självständigt, men i praktiken är parametrarna till dessa delar så beroende<br />
av varandra för att systemet skall fungera optimalt att de blir mycket hårt sammankopplade. De<br />
viktigaste utbytesförhållandena dem emellan är att komprimeringsmodulen måste känna till och<br />
kunna hantera bildformatet från bildkällan samt att komprimeringsmodulen måste leverera datapaket<br />
i lämplig storlek för överföring till krypteringssystemet. Det senare eftersom<br />
kommunikationsstacken inte antas kunna segmentera datapaket på lämpligt vis när de väl har<br />
komprimerats och krypterats (samt givetvis att krypteringssystemet inte antas förändra paketstorlekar<br />
väsentligt).<br />
52
Bildkälla<br />
Med klientens bildkälla avses den mjukvarukomponent som kapslar in den fysiska bildkällan<br />
(kameran) och erbjuder systemet ett sätt att anskaffa bilder. Det format som dessa bilder levereras i<br />
(bildupplösning, storlek, pixelmodell och färgrymd) antas vara i förväg bestämt och synkroniserat<br />
med komprimeringsmodulen.<br />
De flesta fysiska bildkällor har någon form av hårdvara som kan utnyttjas för att facilitera användandet<br />
av dem i <strong>bildtelefoni</strong>sammanhang, exempelvis ofta någon form av hårdvarustöd för kompression<br />
eller liknande. Här antas att bildkällan inte använder eller till och med kompenserar för<br />
sådant och att det är obehandlade individuella bildrutor som levereras till kompressionsmodulen.<br />
Med andra ord – syftet med denna komponent är att erbjuda ett enkelt vis för övriga delar av<br />
klienten att anskaffa bilder i ett uniformt format för alla de typer av kameror eller andra fysiska<br />
bildkällor klienten kan tänkas använda. Den teoretiska vinst som går att göra med ett maximalt<br />
utnyttjande av den fysiska bildkällans hårdvarurepresentation av bilden går förlorad i utvecklingskomplexitet<br />
med behovet av att anpassa en generell kompressionsmotor för varje typ av bildkälla.<br />
Att istället välja en bildkälla som har en hårdvarurepresentation av bilddata som stämmer överens<br />
med den implementerade kompressionen är att föredra.<br />
TWAIN<br />
TWAIN är en standard för bildöverföring från digitala bildkällor som utvecklats av the TWAIN<br />
Working Group, en icke vinstdrivande organisation bildad av ett flertal företag som utvecklar<br />
bildkällor (bland andra Kodak, Hewlett–Packard och Adobe). Ursprungligen skapades TWAIN<br />
standarden för scanners men den har senare utvecklats till att användas för alla typer av bildkällor,<br />
vilket har medfört att den är oerhört bred. Centralt i TWAINs begreppsmodell är begreppet TWAIN<br />
capability eller kapabilitet. Detta betecknar en specifik funktionalitet hos en bildkälla, exempelvis<br />
förmåga att kunna anskaffa bilder utan att visa ett grafiskt användargränssnitt eller att kunna anskaffa<br />
bilder i en specifik upplösning.<br />
TWAIN bygger upp ett system för bildanskaffning bestående av tre delar – Data Source, Data<br />
Source Manager och Application.<br />
En TWAIN Data Source (DS eller TWAIN–bildkälla) är en mjukvara som utvecklas och underhålls<br />
av tillverkaren av (den fysiska) bildkällan och är oftast integrerad som en del av drivrutinen<br />
för bildkällan. Denna del ämnar till att kapsla in alla hårdvaruberoende delar av koden i systemet<br />
och är det enda av bildkällan som applikationen kan se.<br />
En TWAIN Data Source Manager (DSM) är en mjukvarukomponent som utvecklas av the TWAIN<br />
Working Group och distribueras tillsammans med de flesta stora operativsystem för hemanvändare.<br />
Denna ämnar till att administrera alla lokala TWAIN–bildkällor i ett client–server scenario<br />
där applikationer kan slå upp vilka kameror och motsvarande som finns tillgängliga. Operativsystemets<br />
DSM laddar vid uppstart alla TWAIN–kompatibla drivrutiner och kapslar in dessa för<br />
användning.<br />
En TWAIN Application (eller klientapplikation) ansluter på plattformens föredragna vis (oftast via<br />
COM eller TCP) transparent till systemets DSM och kommunicerar med denna via TWAIN API.<br />
Via detta API så förhör sig applikationen om vilka bildkällor som finns kopplade till systemet, vad<br />
de har för kapabiliteter, kopplar upp sig mot dessa, ställer in inställningar för dem och hämtar<br />
bilder från dem. Applikationer kommunicerar alltid via systemets DSM och aldrig direkt med<br />
bildkällan.<br />
53
Programmering i TWAIN API sker för genom anrop till en av de två funktionerna<br />
där de olika parametrarna är<br />
DSM_Entry (pOrigin, pDest, DG, DAT, MSG, pData)<br />
DS_Entry (pOrigin, pDest, DG, DAT, MSG, pData)<br />
pOrigin origin of message, meddelandets avsändare. Denna parameter<br />
innehåller vanligen en identifierare för applikationen.<br />
pDest destination of message, meddelandets mottagare. Vanligen är<br />
denna parameter antingen tom eller innehåller en identifierare för<br />
en datakälla, i vilket fall anropet skickas vidare till denna genom<br />
ett anrop till DS_Entry() av systemets DSM.<br />
DG data group, meddelandets data grupp. Meddelandets datagrupp<br />
specificerar vilken kategori av anrop som görs – kontroll, bild<br />
eller audio.<br />
DAT data argument type, meddelandets data typ. Meddelandets data<br />
typ anger formatet på funktionens argument (vilket utpekas av<br />
pData).<br />
MSG message id, identifierare för meddelandet. Meddelandets id är<br />
antingen get eller set och specificerar i vilken riktning data skall<br />
skickas (d.v.s. ifall data skall hämtas från eller skickas till datakällan).<br />
pData pointer to data, (lokal) pekare till data som anger en datastruktur<br />
för argument till systemets DSM eller den använda datakällan.<br />
Denna används typiskt för att specificera kapabiliteter eller<br />
minnesområdet där bilddata skall lagras vid bildanskaffning.<br />
Parametrarna DG, DAT och MSG utgör tillsammans en s.k. TWAIN operation triplet och specificerar<br />
unikt det aktuella anropets funktionalitet. DSM_Entry() används exklusivt av applikationsprogrammerare<br />
och DS_Entry() används exklusivt av systemets DSM för kommunikation med<br />
datakällor. När en applikationsprogrammerar skall kommunicera med en datakälla sker detta<br />
genom anrop via DSM_Entry() där parametern pDest angivits ett värde som identifierar datakällan.<br />
Dataflödet i TWAIN är en noga definierad tillståndsmaskin där samtliga transaktioner antingen<br />
sker explicit genom anrop från applikationen eller implicit som resultat av datakällans handlande.<br />
54
Figur 12. Tillståndsmaskinen för dataflödet i TWAIN<br />
(Bild från [25])<br />
Fördelarna med TWAIN är uppenbara – för en klientapplikation ter sig alla bildkällor likadana,<br />
med endast kapabiliteter och inställningar som skillnader. Standarden är vitt spridd och stöds av de<br />
flesta av dagens bildkällor under de flesta av dagens operativsystem. Eftersom alla tre delar av<br />
TWAIN systemet exekveras på det lokala systemet och drivrutinen utvecklas av hårdvarutillverkaren<br />
kan ofta god prestanda nås. Detta är sant åtminstone så länge applikationen följer<br />
datakällans tillverkares anvisningar för hur (läs i vilka format) bilder skall anskaffas. Standarden<br />
erbjuder även möjligheter till hårdvarustöd för beräkningsintensiva operationer, exempelvis<br />
komprimering av bilder från videokällor.<br />
Nackdelarna med TWAIN är mer av det praktiska slaget – standarden är oerhört komplex och<br />
uppbyggd på ett relativt ålderdomligt vis vilket gör att implementationer av drivrutiner oftast är<br />
bristfälliga, speciellt för videobaserade bildkällor. De flesta mindre och billiga webkameror har en<br />
TWAIN drivrutin som medföljer, men detta är på inget vis en garanti för att den är användbar via<br />
TWAIN för <strong>bildtelefoni</strong>applikationer eftersom de ofta endast stödjer en väldigt liten del av den<br />
funktionalitet som är önskvärd.<br />
Av effektivitetsskäl kan det i TWAIN vara naturligt att låta bildkällan själv välja hur bilddata skall<br />
representeras, exempelvis kan kamerans hårdvara föredra en specifik upplösning, pixelrepresentation<br />
eller färgmodell. Det som går att vinna i effektivitet här går dock i regel förlorat i<br />
komplexitet senare (i kompressionsfasen), där det då blir nödvändigt att kompensera för olika<br />
55
ildkällors skillnader i datarepresentationer. Av denna anledning är det i <strong>bildtelefoni</strong>applikationer<br />
att föredra att instruera bildkällan (om möjligt) att leverera data i det efterfrågade formatet – på det<br />
viset utnyttjas eventualiteten att bildkällan har ett mer effektivt sätt att göra dessa omvandlingar än<br />
ren mjukvara.<br />
[24], [25], [26] och [27] erbjuder mer information om TWAIN.<br />
56
Komprimeringsmodul<br />
Komprimeringsmodulens uppgift i ett <strong>bildtelefoni</strong>system är tvådelad – dels skall det komprimera<br />
utgående bilddata och dels dekomprimera inkommande bilddata. Dessa uppgifter kan te sig symmetriska<br />
men är sällan så eftersom komprimeringsprocessen involverar fler parametrar och betydligt<br />
mer beräkningsarbete.<br />
En typisk ansats för implementera mjukvarurealiserade bildkompressionssystem är att utnyttja<br />
dagens processorers utökade instruktionsuppsättningar, såsom Intels MMX och SSE. Om det<br />
skulle vara önskvärt att undvika assemblerprogrammering finns det även ett flertal Software<br />
Development Kits (SDKs) som erbjuder högt optimerade APIer för utveckling av bildkompressionsapplikationer.<br />
Dessa SDKs utnyttjar oftast dessa utökade instruktionsuppsättningar<br />
transparent men hämmar naturligtvis portabiliteten för applikationer som utvecklas därpå.<br />
I detta arbete har dock utvecklingen (för att öka förståelsen av systemets utbytesförhållanden) lagts<br />
på en högre nivå och de delar som implementerats har så gjorts i Java och från teori.<br />
Komprimeringsmodulen i detta arbete är uppbyggd med komponenter modellerade efter dataflödet<br />
för att komprimera och dekomprimera bildrutor i en bildström. I designen har dessa strukturerats<br />
på ett modulärt vis som gör att varje enskild del kan bytas ut utan att påverka de övriga.<br />
Bildanskaffningen, förbehandlingen, efterbehandlingen och presentationen av bilderna arbetar på<br />
vanliga bilder bestående av RGB–pixlar. De övriga delarna i systemet arbetar på bildblock bestående<br />
av en flyttalsmatris per dimension i den använda färgrymden.<br />
Dataflöde<br />
Den modell för dataflödet inom komprimeringsmodulen som används är följande<br />
Bildanskaffning<br />
Förbehandling<br />
Blockextraktion<br />
Färgrymdsomvandling<br />
Signaltransform<br />
Normalisering<br />
Trunkering<br />
Kvantifiering<br />
Bitallokering<br />
Paketering<br />
Kryptering<br />
Sändning<br />
Presentation<br />
Figur 13. Dataflöde i kompressionsmodulen, från komprimeringsfas till dekomprimeringsfas.<br />
Fyllda delar ingår inte i kompressionmodulen, delar med namnet i kursiv stil har implementerats<br />
57<br />
Bildrekonstruktion<br />
Efterbehandling<br />
Färgrymdsomvandling<br />
Signaltransform<br />
Denormalisering<br />
Blockavkodning<br />
Dekryptering<br />
Mottagning
Vissa delar (bildanskaffning, dimensionering, kryptering och sändning av paket i komprimeringsfasen<br />
samt mottagande, dekryptering av paket och presentation av resulterande bild i<br />
dekomprimeringsfasen) hör egentligen inte till komprimeringsmodulen. Dessa delar tas dock med i<br />
denna bild för en mer pedagogisk överblick över dataflödet från avsändare till mottagare.<br />
Notera att bortsett från de delar som arbetar på hela bilder (bildanskaffning, för– och efterbehandling<br />
samt presentation av rekonstruerad bild) så lämpar sig alla delar väl för parallellisering.<br />
Detta implementeras genom att segmentera bilderna i olika regioner och behandla dessa i separata<br />
trådar. Skulle en prioritering av blocken användas för att behandla förgrundsblock före andra så<br />
skulle detta då kunna ske genom att ha denna prioritering som kriterium vid blockfördelning<br />
mellan trådarna. Detta används då i kombination med att sätta högre exekveringsprioriteter för de<br />
trådar som behandlar prioriterade block. Så länge alla trådar behandlar samma bildruta så påverkar<br />
en sådan parallellisering inte komprimeringsmodulens negativt eftersom blocken är oberoende av<br />
varandra.<br />
Komprimeringsfasen<br />
I komprimeringsfasen anskaffas en bild, dess representation omvandlas, komprimeras och delas<br />
upp i paket lämpligt stora för överföring. Dessa paket består av grupper av block och har en storlek<br />
som anpassas mot kommunikationsstackens inställningar för MTU. Då komprimeringsmodulen är<br />
den del av systemet som har intrikat kunskap om bilddata (samt skall rekonstruera de dekomprimerade<br />
bildblocken) är det naturligt att denna del i komprimeringsfasen även har hand om att<br />
segmentera bildrutor för parallell bearbetning och gruppering av datablock för överföring.<br />
1) Bildanskaffning från bildkälla<br />
Vid bildanskaffning anlitar kompressionsmodulen bildkällan för att anskaffa en bildruta i önskat<br />
format. Komprimeringsmodulen kan styra och avläsa bildkällans inställningar för bilddimensioner,<br />
färgdjup och pixeltyper. Bildströmmens aktuella bildfrekvens begränsas indirekt av hur många<br />
gånger per sekund som komprimeringsmodulen hämtar bilder från bildkällan.<br />
2) Förbehandling<br />
I förbehandlingsfasen anpassas bilden för användning av kompressionsmodulens senare delar. De<br />
mest påtagliga exemplen på förbehandling är att genom paddningsscheman anpassa bildens<br />
dimensioner till att vara jämt delbara med den använda blockdimensionen samt att med ett färgfilter<br />
kvantifiera bilder av för hög upplösning till färre antal färger.<br />
3) Blockextraktion<br />
Den tredje delen av komprimeringsmodulen identifierar vilka områden som skall användas i varje<br />
bildruta och extraherar dessa till att lagras som flyttalsbaserade block istället för som heltalsbaserade<br />
pixlar. Detta syftar till att underlätta en senare behandling av blocken men ger även den<br />
adderade bonusen (i system som exekverar utanför virtuell motorer) att reducera antalet cache–<br />
missar vid signaltransformens repetitiva användning av blockens värden.<br />
4) Färgrymdsomvandling<br />
58
Färgrymdsomvandlingen, som sker från RGB till någon vald färgrymd mer lämplig för komprimering,<br />
implementeras som multiplikationer med omvandlingsmatriser för vald färgrymd. Dessa<br />
matriser är etablerade för alla färgrymder och består av flyttal som specificerar en normaliserad<br />
översättning mellan färgrymderna för enskilda pixlar. Exempelvis skulle transformen mellan RGB<br />
och YUV ta tre block med R, G respektive B data som parameter och resultera i tre block med Y,<br />
U respektive V data.<br />
5) Signaltransform<br />
Den signaltransform som används för bildkompression är DCT, dennas goda utbytesförhållande<br />
mellan möjlighet till förberäkning och anpassning mot signalens varians gör den lämplig för bildkompression.<br />
Här förberäknas basfunktionerna för transformen när den använda blockdimensionen<br />
är känd. Dessas värden lagras sedan internt för användning i själva signaltransformen vilket kräver<br />
ett visst lagringsutrymme men också besparar systemet majoriteten av beräkningskomplexiteten<br />
för transformen.<br />
6) Normalisering (av transformkoefficienter)<br />
Normalisering av transformkoefficienterna utförs genom att vikta dem och lyfta fram de delar som<br />
påverkar mänsklig uppfattning av slutresultatet mer. Denna del är intimt förknippad med framförallt<br />
kvantifieringen och bitallokeringen, men påverkar även trunkeringens resultat. Detta utförs<br />
genom att blockens färgdimensioner multipliceras med en normaliseringsmatris.<br />
7) Trunkering (av transformkoefficienter)<br />
I trunkeringen av transformkoefficienterna avgörs vilka delar av blocket som skall användas och<br />
vilka som skall förkastas i kompressionen. Här introduceras det största dataförstörande elementet<br />
för kompression av enskilda bildrutor, men även (tillsammans med en effektiv kvantifiering och<br />
bitallokering) den största källan till kompression.<br />
8) Kvantifiering (av transformkoefficienter)<br />
I kvantifiering av transformkoefficienterna så anpassas dessas värden för en mer effektiv bitallokering.<br />
Denna process är viktig för att uppnå en god kompressionsgrad i bitallokeringen och<br />
dess detaljer baserar sig på statistiska studier av transformkoefficienterna värden.<br />
9) Bitallokering<br />
Bitallokeringen är den sista delen av transformkoefficienternas kompression. Här lagras dessa om<br />
på bitnivå med hjälp av en Huffmankodning och anses därefter färdigkomprimerade. Den här<br />
processen kallas även (tillsammans med en kvantifiering) för bitkodning.<br />
10) Paketering<br />
De färdigkomprimerade blocken av transformkoefficienter samlas nu i blockgrupper, vars storlek<br />
anpassas efter önskemål från kommunikationsstacken. Denna del måste naturligt ske före krypteringen<br />
av data (för att kunna skönja gränser mellan block) och sköts av komprimeringsmodulen<br />
eftersom denna har mycket kunskap om dessa blocks storlek och utseende.<br />
59
Den resulterande blockgruppen förses även här med ett index för den bildruta de tillhör innan de<br />
levereras till krypteringssystemet. Detta bildruteindex används senare (hos mottagaren) för att<br />
detektera block som blivit försenade så länge att det blivit obsoleta.<br />
Notera att alla färgdimensioner för ett block samlas i samma blockgrupp för översändning. Detta<br />
sker för att undvika att en del av ett block skulle försvinna och hela blocket därför skulle behöva<br />
förkastas.<br />
11) Kryptering (av paket)<br />
När blocken väl är samlade i blockgrupper krypteras dessa av krypteringssystemet (som befinner<br />
sig i en etablerad session) och levereras till kommunikationsstacken.<br />
12) Sändning (av paket)<br />
Kommunikationsstacken översänder slutligen de krypterade paketen till mottagaren.<br />
Dekomprimeringsfasen<br />
Dekomprimeringsfasen, där data dekomprimeras och presenteras, kan liknas vid att lägga ett<br />
pussel. Av (översändningens) effektivitetsanledningar delas bilden i komprimeringsfasen in i<br />
grupper av block vilka sänds var för sig. I dekomprimeringen, då dessa bitar har tagits emot och<br />
dekrypterats, så packas paketets blockgrupp upp och varje block sätts likt en pusselbit in i den<br />
slutliga bilden. Detta förutsatt att den bildruta som blocken tillhör fortfarande är aktuell hos mottagaren,<br />
i annat fall förkastas blocken.<br />
De parametrar som används i denna del av systemet är blockdimension samt trunkeringsmönster.<br />
Den senare för möjligheten att optimera signaltransformen invers (trunkeringsmönstret ger vilka<br />
transformkoefficienter som använts och därmed behöver beräknas). De algoritmer som används,<br />
d.v.s. normaliseringsmask, signaltransform samt färgrymd, antas också de vara kända.<br />
9) Mottagning (av paket)<br />
När ett nytt paket anländer till kommunikationsstacken så levererar denna det direkt till<br />
krypteringssystemet.<br />
8) Dekryptering (av paket)<br />
Krypteringssystemet dekrypterar det mottagna paketet och blockgruppen däri levereras till<br />
kompressionsmodulen.<br />
7) Blockavkodning<br />
Innan komprimeringssystemet gör något annat så kontrolleras att blocken som nu skall behandlas<br />
fortfarande är aktuella. Detta sker för att bespara systemet onödiga beräkningar och genom att<br />
blockens bildruteindex jämförs med det högsta bildruteindex som mottagits för tidigare block på<br />
motsvarande plats i bilden.<br />
60
När denna blockvalidering utförts så rekonstrueras de aktuella blocken ur blockgruppen till sina<br />
transformkoefficientsvärden från den bitkodning som de utsatts för i kompressionsfasen.<br />
6) Denormalisering (av transformkoefficienter)<br />
Innan vidare steg kan tas måste nu transformkoefficienterna denormaliseras tillbaka till de värden<br />
de hade innan normaliseringen. Detta sker genom multiplikation med inversen av den<br />
normaliseringsmatris som användes i komprimeringsfasen.<br />
5) (Invers) signaltransform<br />
Signaltransformen invers appliceras sedan på de denormaliserade transformkoefficienterna. Detta<br />
producerar ett nytt block bestående av en approximation av det ursprungliga datablocket. Är<br />
mönstret för trunkeringen av transformkoefficienterna känt kan detta användas för att optimera<br />
denna beräkning.<br />
4) (Invers) färgrymdsomvandling<br />
Slutligen omvandlas det nu dekomprimerade blocket tillbaka till RGB färgrymden. Detta sker<br />
genom multiplikation med inversen av färgrymdomvandlingens matris. När detta väl är gjort är<br />
blocket dekomprimerat och rekonstruerat så långt som är möjligt.<br />
3) Efterbehandling<br />
När blocket nu har dekomprimerats till fullo kan det medfölja en del icke önskvärda effekter från<br />
kompression och tidiga filtreringar av blocken. Här försöks dessa motverkas med en efterbehandling<br />
av blocket innan det sätts in i den resulterande bilden.<br />
2) Bildrekonstruktion<br />
Här sätts slutligen de nu färdigbehandlade blocken in i den rekonstruerade bilden. Först här återfår<br />
blockens pixlar sin ursprungliga heltalsbaserade RGB–representation (om än med andra värden)<br />
och då som en del av den resulterande bilden.<br />
Viss efterbehandlingen är möjlig att använda även här, exempelvis för att försöka dölja bildartefakter<br />
eller kanteffekter från förlorade block. Observera att detta då skulle ske på hela bilden,<br />
snarare än på ett enskilt block.<br />
1) Presentation (av bild)<br />
Närhelst ett block inkluderats i den resulterande bilden så uppdateras presentationen av denna för<br />
slutanvändaren.<br />
61
Krypteringssystem<br />
Krypteringssystemet i den modell som här används är ett hybridsystem, där asymmetrisk kryptering<br />
används för autenticering, certifiering och nyckelutväxling samt symmetrisk kryptering vilken<br />
(av effektivitetsskäl) används för sessionskryptering. De algoritmer som används är RSA respektive<br />
AES, vilka är bland dagens mest lämpliga val för asymmetrisk respektive symmetrisk kryptering.<br />
Den första delen av krypteringssystemet arbetar mot infrastrukturens servrar samt med att etablera<br />
sessioner med andra klienter. Det finns ett flertal standarder och protokoll för utväxling och<br />
utseende på certifikat, här används X.509 för certifikat och SSL 3 eller TLS 1 för<br />
kommunikationskanaler. Den adderade fördelen av att använda dessa etablerade protokoll (utöver<br />
det naturliga i att de redan är testade och säkra) är att de redan finns implementerade i de flesta<br />
existerande APIer för asymmetrisk kryptering, likväl som inkluderade i ett flera påbyggbara produkter<br />
(exempelvis webläsare och andra kommunikationsverktyg).<br />
Krypteringssystemets andra del handhar kryptering av kommunikationen klienter emellan när en<br />
session väl har etablerats. Denna del arbetar på datapaket som packats ihop av komprimeringsmodulen<br />
till lämplig storlek för överföring och krypterar dessa transparent med den tidigare överenskomna<br />
sessionsnyckeln. Eftersom komprimeringsmodulen är komplext sammansatt är<br />
krypteringssystemet designat på sådant vis att det inte inverkar på komprimeringsmodulens<br />
prestanda eller dataflöde. Denna design möjliggör även parallellism via trådning för krypteringslagret<br />
inom klienten.<br />
En alternativ ansats (till att explicit kapsla in kryptering av klienttrafik i applikationsprotokollet)<br />
som ofta används är att tunnla nätverkstrafiken genom SSL, något som avsevärt förenklar utveckling<br />
av system eftersom krypteringslagret då lägger sig transparent utanpå den övriga<br />
kommunikationsstacken. Användandet av SSL förutsätter dock att kommunikationsstacken endast<br />
använder sig av pålitliga transportprotokoll (läs TCP) varför denna ansats inte används här.<br />
Eftersom kommunikationen mot servrarna (för kataloguppslagning och certifiering) använder<br />
asymmetrisk kryptering explicit i sin funktionalitet är tunnling heller inte aktuellt där.<br />
Sessionsetablering<br />
För att ge en bild av hur krypteringssystemet är tänkt att fungera ges här en översikt av dataflödet<br />
vid etablerandet av en session mellan två klienter. De involverade parterna är C1 vilken är den<br />
klient som initierar sessionen, C2 som är den andra och passiva parten i sessionsetableringen, D<br />
som är en katalogtjänst samt CA som är en certifieringsenhet.<br />
Flöde för att C1 etablerar en session med C2<br />
1) C1 finner C2’s publika krypteringsnyckel<br />
Denna är antingen tidigare känd av C1 eller slås upp hos CA<br />
2) C1 finner C2’s IP–adress<br />
Är denna är tidigare känd provas denna, om så inte är faller eller om detta misslyckas slås denna<br />
upp hos D<br />
3) C1 kontaktar C2<br />
62
C1 kontaktar C2 och skickar C2 ett paket bestående av ett certifikat av sin egen publika nyckel<br />
samt ett förslag på (symmetrisk) krypteringsalgoritm för sessionen. Paketet är signerat med C1s<br />
privata nyckel samt krypterat med C2s publika nyckel.<br />
4) C2 verifierar C1s identitet & paketet<br />
C2 dekrypterar paketet med sin privata nyckel, verifierar certifikatet av C1s publika nyckel<br />
(antingen genom att kontrollera tidigare kända nycklar för C1 eller via uppslagning hos CA), samt<br />
verifierar paketets integritet genom att kontrollera signeringen av detsamma med C2s publika<br />
nyckel.<br />
5) C2 kvitterar sessionsinformation<br />
C2 kvitterar sedan sessionsinformationen genom att genererar och skicka C1 en sessionsnyckel för<br />
den aktuella krypteringsalgoritmen. Detta paket krypteras med C1s publika nyckel och signeras<br />
med C2s privata. Sessionsnyckeln är slumpmässigt framtagen och kan användas som en<br />
krypteringsnyckel av den indikerade (symmetriska) krypteringsalgoritmen.<br />
6) C1 initierar session<br />
C1 tar emot, dekrypterar och verifierar paketet samt initierar sedan sessionen med den aktuella<br />
sessionsnyckeln.<br />
För kommunikation mellan fler parter följes i stort sett samma schema, där den part som vill<br />
ansluta kontaktar någon av de inblandade parterna på samma vis och de inblandade parterna själva<br />
bestämmer ifall personen skall släppas in i sessionen eller ej.<br />
63
Kommunikationsstack<br />
För klientens kommunikation med infrastrukturen antas trafiken vara protokollbunden eller trivial.<br />
Den del av klientens kommunikationsstack som avses här är den del som överför bilddata mellan<br />
klienterna i etablerade sessioner. Denna del kan kanske även den betraktas som trivial eftersom<br />
data redan paketerats och krypterats innan de når hit, men det finns ett flertal avväganden att göra i<br />
designfasen av kommunikationsstacken.<br />
I alla applikationer för överföring via paketbaserade nät riskeras det fördröjningar i nätverket till<br />
följd av förstoppningar och omsändningar orsakade av förlorande (eller försenade) paket. Dessa<br />
fördröjningar kan givetvis även bero på lokala överbelastningar hos avsändande klient (i <strong>bildtelefoni</strong>fallet<br />
mest troligt beroende på de beräkningsintensiva kompressions– eller krypteringsdelarna<br />
av systemet), men eftersom dessa är enkla att åtgärda (exempelvis i <strong>bildtelefoni</strong>fallet<br />
genom att sänka bildkvaliteten) bortses från dessa anledningar här.<br />
För information om paketbaserade nät och system för datakommunikation se [3], [4] och [11].<br />
Paketfragmentering<br />
Används ett pålitligt transportprotokoll såsom TCP är det brukligt att begränsa storleken på<br />
paketen som sänds till att vara mindre än minsta Maximum Transmission Unit (MTU) för alla<br />
nätverkssegment mellan avsändare och mottagare av paketen. Detta görs för att undvika förseningar<br />
orsakade av fragmentering av paketen – MTU är den storhet som avgör om ett paket skall<br />
fragmenteras (d.v.s. delas upp flera mindre paket) av en router eller ej. När ett icke pålitligt<br />
transportprotokoll såsom UDP används är detta ännu viktigare eftersom ett UDP–paket som tappat<br />
ett fragment (eller där ett fragment blivit tillräckligt försenat) förkastas i sin helhet. Fragmentering<br />
av paket påverkar nätens genomströmning negativt och bör undvikas om så är möjligt. Observera<br />
att MTUns värde jämförs med hela paketets storlek, inte endast mot paketets kropps storlek.<br />
För att finna minsta MTU (kallad Path MTU eller PMTU) mellan två kommunicerande parter på<br />
IP–baserade nät används en teknik som kallas Path MTU Discovery (PMTU–D). PMTU–D består<br />
av att itererativt sända större och större paket tills taket för någon MTU längs vägen är nådd. Eftersom<br />
en flagga satts i paketen (i IP–paketens header för att vara exakt) vilken förbjuder fragmentering<br />
av paketen resulterar detta i att ett ICMP–meddelande skickas till avsändaren med ett felmeddelande.<br />
I vissa fall innehåller dessutom detta felmeddelande storleken på den begränsande<br />
MTUn, men annars används det senast avsända paketets storlek som en indikation på den begränsande<br />
MTUn. Tyvärr filtreras ICMP trafik ofta bort vilket kan försvåra att denna teknik. Observera<br />
också att PMTU kan förändras över tiden eftersom vägen paketen routas kan förändras.<br />
Paketering<br />
De data som översänds i <strong>bildtelefoni</strong>fallet är till den överväldigande majoriteten bilddata från<br />
bildrutor i videoströmmen från kameran. En speciell egenskap hos bilddata från videoströmmar är<br />
att pixlarna är tidsberoende – de överlappar varandra över tiden. Detta medför i praktiken att om<br />
en speciell pixel försenas så mycket att motsvarande pixel i en efterföljande bildruta anländer till<br />
mottagaren före den första, så är den förstnämnda pixeln värdelös och kan förkastas utan att<br />
behandlas. Detsamma håller sant även för de hela block av pixlar som bildrutor i denna modell har<br />
indelats i.<br />
Den största anledningen till förseningar inom TCP är omsändningar av paket som för fördröjts<br />
eller tappats bort, något som här undviks genom att använda UDP. UDP kan i praktiken vara upp<br />
mot 30 procent snabbare än TCP av denna anledning. Antaget att omsändningrelaterade förse-<br />
64
ningar i TCP är stora nog att orsaka att block förkastas när de omsändes så ter det sig självklart att<br />
då använda UDP för denna typ av trafik. Detta antagande motiveras av att TCPs omsändningar är<br />
triggade av time–outs samt att videoströmmar med rörliga bilder ofta har bildfrekvenser över 25<br />
fps. Utbytesförhållandet för antagandet blir att tiden mellan två olika bildrutor skall vara mindre än<br />
tiden för nätet att detektera och genomföra en omsändning. En separat TCP–kanal hålls öppen för<br />
synkroniseringar och uppdateringar av sessionsinformation.<br />
Notera även att eftersom bilddata indelas i av varandra oberoende paket så kan även överföringen<br />
av dessa transparent parallelliseras genom trådning.<br />
65
Implementation<br />
Bildkälla<br />
Initialt i arbetet implementerades en TWAIN–klient i C++ som bildkälla. Denna visade sig dock<br />
vara svåranvänd då drivrutinen för kameran systemet använde (Logitech Quickcam VC USB) inte<br />
stödde de kapabiliteter som krävdes. Senare byttes denna kamera ut mot en ny (Phillips ToUCam<br />
pro USB) vilken även den visade sig ha samma defekt i sin TWAIN implementation. Den<br />
kapabilitet som fattades var förmågan att kunna ta bilder utan att visa drivrutinens lokala GUI.<br />
Slutligen användes en Phillips ToUCam XS vilken stödde detta men tyvärr hade en annan defekt<br />
vilken resulterade i att applikationen var tvungen att återinitialisera kamerans tillstånd efter varje<br />
bild. Detta omöjliggjorde bildfrekvenser högre än 5 fps. Tilläggas bör att även om det senare<br />
problemet var en ren defekt så var det första snarare ett designval från tillverkarna.<br />
Efter problemen med TWAIN implementerades istället mjukvarukomponenter som simulerar<br />
bildkällor för användning i systemet. Dessa är implementerade kring färdiga bilder och<br />
videosekvenser som i förväg har inhämtats från bildkällor och ligger lagrade i lokala filer. Tanken<br />
har varit att simulera en bildkälla så väl att en fysisk bildkälla senare skall kunna sättas in och<br />
fungera med systemet utan att ändra gränssnittet.<br />
Kompressionsmodul<br />
Kompressionsmodulen har implementerats i Java med centrala ramverksklasser och gränssnitt<br />
(Java interface) som representerar de specifika delarna och dess funktionalitet. Denna design syftar<br />
till att låta varje komponent fungera självständigt och ändå vara utbytbar för att facilitera<br />
experimentation. En systembeskrivning för kompressionsmodulens implementation finns i<br />
Appendix A.<br />
Förbehandling<br />
Förbehandlingen som systemet implementerar består av två olika scheman för hur problemet med<br />
bilder med storlekar som inte är jämnt delbara med blockdimensionen skall hanteras. Dessa är<br />
mirror–edge pad respektive crop pad, vilka båda resulterar i nya bilder med jämnt delbara<br />
storlekar. Den förstnämnda förstorar om nödvändigt bilden till närmaste jämna blockmultipel och<br />
speglar därefter ut pixlar runt kanterna ut i de icke fyllda kantblocken. Det andra beskär istället<br />
bilden när detta är nödvändigt. Dessa scheman finns implementerade i det här arbetet eftersom de<br />
underlättar implementation av signaltransformen.<br />
Blockextraktion<br />
Processen att välja vilka block som skall användas baserar sig på ett filter vilket jämför varje block<br />
med motsvarande block i föregående bildruta. Ifall blocket bedöms ha förändrats mer än ett givet<br />
tröskelvärde passerar blocket filtret och extraheras. Det tröskelvärde som används specificeras i<br />
termer av pixelvärden och jämförs med varje pixel i blocket. Alternativt används för<br />
effektivitetsökning endast blockets hörnpixlar i filtreringen. Detta motiveras då av antagandet att<br />
förändringar små nog att rymmas inom ett block (och därmed inte påverka någon hörnpixel)<br />
tenderar att vara lokala fel snarare än avbildningar av reella objekt. Det är denna del (blockfiltret) i<br />
blockextraktionsfasen som står för komprimeringsmodulens temporala kompression. De block<br />
som inte passerar filtret förkastas och belastar inte systemet vidare beräkningsmässigt. Denna del<br />
kan med en god anpassning av tröskelvärdet för blockfiltreringen vara en stor källa för<br />
66
kompression men kan även resultera i visuella effekter som upplevs mycket störande.<br />
Utbytesförhållanden vid valet av tröskelvärde är motsträviga – för högt så förkastas för många<br />
block och för lågt ger låg kompressionsnivå och hög beräkningsbelastning på systemet.<br />
För att undvika kumulativa fel beroende på blockfiltret så sänds det regelbundet en reference<br />
frame, d.v.s. en bildruta vilken inte är beroende på föregående bildruta. I praktiken innebär detta<br />
en bildruta där samtliga block passerar blockfiltret. Generationen av reference frames styrs därför<br />
(via en intervallparameter) av denna del av kompressionensmodulen.<br />
I blockextraktionsfasen är de tidigare blockpaddningarna implementerade transparent med hjälp av<br />
(förgenererade) indextabeller för effektivitet. Eftersom själva blockextraktionen också är baserad<br />
på uppslagningar via indextabeller kan denna del adderas utan extra overhead. Samma<br />
indextabeller används även i dekomprimeringsfasen för att sätta in blocken i den resulterande<br />
bilden. I blockextraktionen omvandlas även pixelvärdena från heltal till flyttal eftersom detta<br />
effektiviserar efterföljande steg.<br />
Färgrymdsomvandling<br />
Fyra färgrymder är implementerade för användning med kompressionsmodulen – RGB, YUV,<br />
YIQ och YCbCr. RGB finns med för att tydligare visa på trunkeringens effekter utan<br />
färgkodningsscheman samt för att kunna behandla gråskalebilder (vilka då omvandlas till RGB–<br />
bilder med samma värde för alla tre färgkanaler). YUV, YIQ och YCbCr lämpar sig alla för<br />
kompression av färgbilder efter scheman som baserar sig på att trunkera färgkomponenterna<br />
hårdare än intensitetskomponenten.<br />
Färgrymdsomvandlingen har implementerats som en transformmotor där blocken (vilka består av<br />
tre stycken matriser av samma kvadratiska dimensioner) multipliceras med en omvandlingsmatris.<br />
För att reversera denna process multipliceras blocken i dekompressionsfasen med samma<br />
omvandlingsmatrisens invers.<br />
Signaltransform<br />
Den signaltransform som används är DCT med förberäknade basfunktioner. Denna har<br />
implementerats som en transformmotor som arbetar på godtyckliga flyttalsmatriser och sedan<br />
expanderats till att arbeta på tripletter av matriser för att användas med de block som extraherats<br />
tidigare. Samma transforms invers har naturligt implementerats tillsammans med denna.<br />
Normalisering, kvantifiering och bitallokering<br />
I det här arbetet har valts att inte implementera någon normalisering, kvantifiering eller<br />
bitallokering av blocken. Detta framförallt eftersom dessa delars effektivitet baseras på statistiska<br />
studier (vilka har bedömts vara alltför tidsödande) av blockens värden efter transformen, men även<br />
för att lämna utrymme för experimentation med olika färgrymder. Valet av färgrymd påverkar<br />
nämligen pixlarnas värden vilket i sin tur påverkar de värden som signaltransformen resulterar i.<br />
Av naturliga anledningar har därför heller inte dessa delars motsvarigheter i<br />
dekomprimeringsfasen (blockavkodning och denormalisering) implementerats.<br />
Trunkering<br />
I det här arbetet har tre metoder för trunkering implementerats – trunkering efter varians,<br />
trunkering efter magnitud samt tröskeltrunkering. Variansimplementationen är optimerad och där<br />
67
eräknar signaltransformen endast de transformkoefficienter som kommer att passera<br />
trunkeringen. I magnitudvarianten beräknas samtliga transformkoefficienter och sorteras därefter<br />
för att kunna finna de med störst magnitud (de som skall behållas). Tröskelimplementationen<br />
beräknar samtliga transformkoefficienter och förkastar därefter de som har en magnitud lägre än<br />
tröskvärdet.<br />
Observera att det är separationenen av trunkering och kvantifiering som möjliggör transparenta<br />
byten av färgrymd. Detta eftersom trunkeringen kan fungera oberoende av<br />
transformkoefficienternas värden.<br />
Efterbehandling<br />
Den efterbehandling som implementerats i detta arbete består av en kvantifiering till RGB–<br />
baserade pixelvärden. Stark trunkering av blocken orsakar extremvärdespunkter vilka hamnar<br />
utanför de diskreta värdena i området [0 – 255]. Dessa avvikande värden kvantifieras därför<br />
genom enkel avrundning till närmaste heltal inom området.<br />
Presentation<br />
Figur 14. Extremvärdespunkter<br />
Presentation av bilder är trivial och har skett med hjälp av Java swing.<br />
De delar som tillhör krypteringsystemet och kommunikationsstacken (paketering, kryptering,<br />
sändning) har inte implementerats och därför inte heller deras motsvarigheter i<br />
dekomprimeringsfasen (mottagning och dekryptering).<br />
Ansatsen av komprimeringsmodulens inneboende parallellitet genom trådning har inte<br />
implementerats.<br />
Krypteringssystem<br />
68
Den del av krypteringssystemet som praktiskt utarbetats är ett kodbibliotek med en<br />
implementation av DES i C och C++. I denna studerades särskilt möjligheten att via utrullningar<br />
och andra optimeringar uppnå god prestanda medan portabilitet behållits (d.v.s. utan maskinnära<br />
programmering). Biblioteket stödjer DES och trippel DES i ECB mode. Denna implementation har<br />
gjorts i studiesyfte och ämnas inte användas i systemet, mer lämpliga för detta är något externt API<br />
för kryptering där samtliga delar av ett krypteringssystem har implementerats, exempelvis Java<br />
Cryptography Extensions (JCE) eller OpenSSL.<br />
Demonstrationer<br />
De delar av kompressionsmodulen som implementerats har åskådligtgjorts i interaktiva<br />
demonstrationsprogram dokumenterade i Appendix C.<br />
69
Slutsatser<br />
Bildkällan<br />
Vad gäller standarder för bildanskaffning från bildkällor har tyvärr TWAIN visat sig vara ett<br />
olämpligt val för <strong>bildtelefoni</strong>. Standarden är i sig duglig (om än omständlig) men drivrutinernas<br />
implementationer lämnar mycket att önska, åtminstone för bildkällor av webkamera typ. Tyvärr<br />
verkar det inte finnas något annat generellt och portabelt API för bildanskaffning vid billigare<br />
lösningar. Den logiska följden ter sig vara att satsa på ett lokalt API för en viss plattform eller en<br />
dyrare bildkälla med eget API.<br />
Webkameror som bildkällor har de senaste åren blivit mycket bättre men fortfarande är hårdvaran<br />
av så låg kvalitet att den påverkar komprimeringsmodulens effektivitet. Det är framförallt vid<br />
otillräcklig belysning som dagens CCD–baserade webkameror har problem med att leverera<br />
samma färgvärde för oförändrade objekt mellan olika bildrutor.<br />
Kompressionsmodulen<br />
Ansatsen att basera den temporala kompressionen på att jämföra blocken som ändå skall användas<br />
för signaltransformen har fungerat bra. Det är en relativt (beräkningsmässigt) billig och enkel<br />
metod att detektera rörelser i bilden som inte påverkar senare delar av kompressionssystemet. Ett<br />
medelvärdesbaserat mått (exempelvis RMSE eller MSE) är att föredra eftersom absoluta mått<br />
tenderar att vara beroende av blockdimensionen.<br />
Mängden rörelse i bilden påverkar stort mängden data som måste behandlas av systemet. En fixt<br />
monterad kamera är nödvändig för att kunna effektivt utnyttja temporal redundans överhuvudtaget.<br />
Vid hårdare trunkeringar än 4:1:1 av färgdata börjar störande subjektivt upplevda fel uppträda i<br />
stillbilder. Denna effekt tycks motverkas i rörliga bilder och har ej stor genomslagskraft i de<br />
matematiska mätningarna RMSE och MSE.<br />
Byte av färgrymd mellan YUV, YIQ och YCbCr har negligerbar effekt så länge endast trunkering<br />
används för kompression av stillbilder. Intensitetskomponenten (d.v.s. intensistetskolumnen i<br />
omvandlingsmatrisen) är för övrigt densamma för alla de tre. Luminans och kromatisitetsdelarna<br />
skiljer dock stort och dessas värdeområden påverkar utformningen av kvantifierings– och<br />
bitallokeringsprocesserna. Värdeområdena för färger i YUV och YIQ beror på noggrannheten i<br />
specifikationen av omvandlingsmatrisen medan värdeområdet i YCbCr är proportionellt mot<br />
färgdjupet i bilden. Detta uppnås genom att Cb och Cr i YCbCr uttrycker det sammantagna<br />
färgtrycket från blått respektive rött i RGBs färgrymd och YCbCr ett val som underlättar<br />
implementation av en kvantifiering.<br />
När det gäller val av storlek på blocken bottnar DCTs felmarginaler ut vid 8 · 8 block, d.v.s. att<br />
felen för större block är inte så mycket mindre att det motiverar ökningen i antal beräkningar (se<br />
[9]). En mindre blockstorlek är dock att föredra för rent mjukvarurealiserade lösningar för att<br />
reducera beräkningsbelastningen. Mindre block ökar även effektiviteten av blockfiltret (vilken<br />
även det reducerar beräkningsbelastningen) samt ger mindre störande visuella fel för förkastade<br />
block i den resulterande bilden.<br />
Med DCT i kombination med trunkering av transformkoefficienter som enda komprimerande<br />
element är det möjligt att komprimera stillbilder upp mot 90 procent utan att störande effekter<br />
introduceras. Med blockfilter som enda komprimerande element är det möjligt att komprimera<br />
majoritetens av scenens bakgrund utan störande effekter. Den uppnådda kompressionsgraden beror<br />
70
då på andelen block som porträtterar bakgrund samt bildkällans kvalitet. Dessa två delar ger<br />
sammanslaget en god kompression sett till mängden utförda beräkningar och tillsammans med en<br />
kvantifiering och Huffmankodning av transformkoefficienterna kan en acceptabel<br />
kompressionsgrad uppnås. Observera att kompressionsgraderna för trunkering och blockfilter<br />
förutsätter en ideal bitallokeringsprocess, d.v.s. att de trunkerade transformkoefficienterna går att<br />
lagra utan extra utrymme för lagringsprotokoll. Detta motsvaras för hela systemet av att<br />
kvantifieringen och huffmankodningen är minst effektiv nog att dölja sitt eget overhead.<br />
Krypteringssystemet<br />
En bildström med en upplösning på 320 · 240 pixlar, 24 bitars färgdjup och en bildfrekvens på 25<br />
fps levererar cirka<br />
((320 · 240 · 24) · 25) = 46080000 bits = 5760000 bytes = 5625 kilobytes<br />
per sekund. Detta kombinerat med en förväntad kompressionsgrad på cirka 90 procents motsvaras<br />
av omkring en halv megabyte per sekund av data som skall krypteras och sändas. Detta är inte<br />
någon större belastning för en modern dator jämfört med insatsen som krävs för sagda<br />
kompression av samma datamängd. Krypteringsdelen kan därför bortses från som flaskhals för<br />
systemets genomströmning.<br />
Kommunikationsstacken<br />
Denna del behöver studeras mer för att kunna dra annat än generella slutsatser om modellens<br />
effektivitet.<br />
Vidareutvecklingar<br />
Vad gäller prestanda så är den del av systemet som kräver mest av hårdvaran otvetydigt<br />
bildkompressionen. Någon form av schema för att detektera överlastningar borde inkorporeras i<br />
systemet, exempelvis genom en återkoppling från uppnådd bildfrekvens som sänker bildkvaliteten<br />
vid behov.<br />
På grund av dess beräkningsintensiva natur skulle bildkompressionen kunna utvecklas i ett språk<br />
som inte exekveras via en virtuell motor (exempelvis C eller C++). Denna bildkompressionsmotor<br />
kan sedan användas från Java via Java Native Interface (JNI) eller som COM objekt från C# om så<br />
skulle önskas. För ökad effektivitet kan rena Java implementationer köras via JRocket eller annan<br />
alternativ Java Virtual Machine (JVM) där det är möjligt att slå av exempelvis s.k. bounds checks<br />
för arrayuppslagningar. Att implementera en bildkompressionsmotor närmare en lokal plattform<br />
skulle även göra det möjligt att utnyttja någon form av utökad instruktionsuppsättning, såsom<br />
MMX eller SSE. Dessa är idag så vitt spridda att de kan antas att förekomma hos i stort sett alla<br />
PC–baserade datorer, vilka utgör majoriteten av hemanvändarnas utrustningar.<br />
Den föreslagna kommunikationsstacken skulle vara intressant att studera ur ett<br />
genomströmningsperspektiv, speciellt då med en jämförelse av UDP vs TCP över långa avstånd.<br />
Utbytesförhållandena mellan bandbredd och kompression är av stor vikt för att slutgiltigt kunna<br />
fastställa kraven på kompressionens effektivitet.<br />
Systemets inneboende parallellitet (d.v.s. möjligheterna till att parallellisera bildkompression,<br />
kryptering och överföring) vore intressant att utforska mera. Trådningsansatsen erbjuder<br />
transparent parallellisering på multiprocessor maskiner vilket skulle kunna göra mycket för<br />
71
systemets prestanda. Denna är en ansats som i teorin är lovande och blir mer och mer populär men<br />
kan (som alltid med trådning) stöta på problem med synkroniseringsfrågor.<br />
Audiell information vore intressant att inkorporera i systemet, framförallt då med modellbaserade<br />
komprimeringsansatser.<br />
Sammanfattning<br />
När det gäller implementation av helt mjukvarurealiserade <strong>bildtelefoni</strong>system framstår<br />
bildkompressionsdelen tydligt som den viktigaste delen att lägga utvecklingstid på. En effektiv<br />
bildkompression är den viktigaste delen för att så mycket som möjligt begränsa systemets<br />
bandbredsbehov och därmed möjliggöra högre datakvaliteter. Den prestanda man kan uppnå<br />
genom att endast implementera de enklare delarna av den föreslagna kompressionsmodulen verkar<br />
duga för enklare <strong>bildtelefoni</strong>system.<br />
Det finns idag ett flertal etablerade algoritmer, modeller och protokoll som löser de flesta<br />
applikationers säkerhetsbehov med hjälp av kryptering. De symmetriska krypteringsalgoritmernas<br />
exekveringshastighet jämfört med dagens hårdvaras prestanda ger att krypteringsystemets<br />
genomströmning inte bör vara någon flaskhals ens för <strong>bildtelefoni</strong>.<br />
En effektiv algoritm är viktigare än en effektiv implementation.<br />
72
Ordlista<br />
AE Absolute Error, absolutfel<br />
AES Advanced Encryption Standard, symmetrisk krypteringsalgoritm<br />
API Application Programmer Interface, gränssnitt för applikationsprogrammerare<br />
Bit rate Ett mått på kompressionsgrad definierat som förhållandet mellan<br />
storlek på indata och storlek på utdata i kompressionstillämpningar<br />
COM Component Object Model, standard för komponentprogramvara<br />
DCT Diskreta Cosinus Transformen<br />
DES Data Encryption Standard, symmetrisk krypteringsalgoritm<br />
DFT Diskreta Fourier Transformen<br />
DST Diskreta Sinus Transformen<br />
FFT Fast Fourier Transform, snabb algoritm för att beräkna DFT<br />
Fps Frames per second, antal bildrutor per sekund, se frame rate<br />
Frame Bildruta i videosignal<br />
Frame rate Bildfrekvens i en videosignal, mäts i fps.<br />
GUI Graphical User Interface, grafiskt användargränssnitt<br />
IP Internet Protocol, transportprotokollet i TCP/IP<br />
ICMP Internet Control Message Protocol, kontrollprotokoll i TCP/IP<br />
JAR Java Archive, filformat för distribution av Java applikationer<br />
JRE Java Runtime Environment, Javas exekveringsplattform<br />
MSE Mean Square Error, medelkvadratfel<br />
MTU Maximum Transmission Unit, storleksgräns för fragmentering<br />
Publik nyckel Den publika (spridda) delen av ett asymmetriskt nyckelpar<br />
Privat nyckel Den privata (hemliga) delen av ett asymmetriskt nyckelpar<br />
RMSE Root Mean Square Error, medelabsolutfel<br />
Reference frame Bildruta i en videosekvens vilken inte beror av andra bildrutor<br />
73
RSA Asymmetrisk krypteringsalgoritm, döpt efter upphovsmännen<br />
SDK Software Development Kit, samling av APIs för programvaruutveckling,<br />
ofta ordnade efter typ av applikation<br />
TCP Transmission Control Protocol, pålitligt transportprotokoll i<br />
TCP/IP<br />
TCP/IP En protokollfamilj som vanligen används på internet<br />
Transformkoefficient Ett värde i resultatblocket för transformen<br />
Transformkärna Den del av transformberäkningen som utför själva transformen<br />
Transformterm Ett värde som används i en transformkärna, används här som förberäknat<br />
värde på funktioner alpha och cosinusfunktionerna i<br />
DCT<br />
UDP User Datagram Protocol, icke pålitligt transportprotokoll i<br />
TCP/IP<br />
XOR Exclusive OR, logisk operation på bitnivå<br />
74
Källhänvisningar<br />
[1] Ahlberg, Jörgen, An Experiment on 3D Face Model Adaptation using the Active Appearence<br />
Algorithm. http://www.icg.isy.liu.se/publications/LiTH–ISY–R–2325.pdf (December 2002)<br />
[2] Anton , Howard & Rorres, Chris. Elementary Linear Algebra. John Wiley & Sons. ISBN<br />
0471170526. 8th edition (January 2000)<br />
[3] Brown, Chris. UNIX Distributed Programming. Prentice Hall. ISBN 0130758965. (December<br />
1994)<br />
[4] Chow, Randy & Johnson, Theodore. Distributed Operating Systems & Algorithms. Addison–<br />
Wesley Pub Co. ISBN 0201498383. (March 1997)<br />
[5] comp.compression. Compression Frequently Asked Questions.<br />
http://www.faqs.org/faqs/compression–faq/ (August 1999)<br />
[6] comp.compression. MPEG Frequently Asked Questions. http://www.faqs.org/faqs/mpeg–faq/<br />
(August 1999)<br />
[7] Daemen, Joan & Rijmen, Vincent. AES Proposal: Rijndael.<br />
http://csrc.nist.gov/encryption/aes/rijndael/Rijndael.pdf (December 2000)<br />
[8] Fischer, Matthew. How to implement the Data Encryption Standard (DES). University of Iowa,<br />
Iowa USA. paper posted on sci.crypt (February 19 1995)<br />
[9] Gonzalez, Rafael C. & Woods, Richard E. Digital Image Processing. Association for Informational<br />
Image Management. ISBN 0201600781. 3rd edition (January 1994)<br />
[10] Haibo Li. Low Bitrate Sequence Coding. Linköpings Universitet. ISBN 9178711703. (1993)<br />
[11] Halsall , Fred. Data communications, computer networks and open systems. Addison–Wesley<br />
Pub Co. ISBN 020142293X. (January 15, 1996)<br />
[12] Independent JPEG Group, the. JPEG Frequently Asked Questions.<br />
http://www.faqs.org/faqs/jpeg–faq/ (August 1999)<br />
[13] Knudsen , Jonathan. Java Cryptography. O'Reilly & Associates. ISBN 1565924029. (May<br />
1998)<br />
[14] Oaks, Scott. Java Security. O'Reilly & Associates. ISBN 0596001576. 2nd edition (June<br />
2001)<br />
[15] Pfleeger, Charles P. Security in computing. Prentice Hall. ISBN 0130355488. 3rd edition<br />
(December 2, 2002)<br />
[16] Poynton, Charles A. Poyntons color FAQ.<br />
http://www.inforamp.net/~poynton/ColorFAQ.html (September 1999)<br />
[17] Råde & Westergren. Mathematics Handbook. CRC Press. ISBN 0849377587. 2nd edition<br />
(June 1992)<br />
75
[18] Russ, John C. The Image Processing Handbook. CRC Press. ISBN 0849325323. 3rd edition<br />
(January 1999)<br />
[19] RSA Laboratories. Frequently Asked Questions About Todays Cryptography, v4.1.<br />
http://www.rsasecurity.com/rsalabs/faq/ (December 2000)<br />
[20] Sayood, Khalid. Introduction to Data compression. Morgan Kaufmann Publishers. ASIN<br />
1558603468. 2 edition (January 1996)<br />
[21] Schneier , Bruce. Secrets and Lies : Digital Security in a Networked World. John Wiley &<br />
Sons. ISBN 0471253111. 1st edition (August 14, 2000)<br />
[22] Schneier , Bruce. Applied Cryptography: Protocols, Algorithms and Source Code in C. John<br />
Wiley & Sons. ISBN 0471117099. 2nd edition (October 18, 1995)<br />
[23] Singh , Simon. The code book. Anchor Books. ISBN 0385495323. (August 29, 2000)<br />
[24] TWAIN Working Group, the. TWAIN: Linking Applications and Images, A White Paper.<br />
http://www.twain.org/docs/whitepaper.htm (August 1999)<br />
[25] TWAIN Working Group, the. TWAIN specification v1.9.<br />
http://www.twain.org/docs/Spec1_9_197.pdf (August 1999)<br />
[26] TWAIN Working Group, the. TWAIN as an API for high throughput image capture.<br />
http://www.twain.org/docs/PerformanceWhitePaper.PDF (August 1999)<br />
[27] TWAIN Working Group, the. Capability Ordering, White Paper.<br />
http://www.twain.org/docs/CapOrderForWeb.PDF (August 1999)<br />
76
Appendix A – Systembeskrivning kompressionsmodul<br />
De delar av kompressionsmodulen som implementerats har så gjorts i Java och samlats i paketet<br />
se.umu.cs.dppog.x<br />
I detta paket finns det ett flertal underpaket vilka innehåller olika delar av paketet, dokumenterade<br />
nedan:<br />
comp<br />
I detta underpaket samlas de fyra klasserna<br />
FrameCompressor komprimerar bilder, används tillsammans med<br />
FrameSource<br />
FrameDecompressor dekomprimerar bilder, används tillsammans med<br />
FrameDestination<br />
FrameDestination efterbehandlar och rekonstruerar bilder, används<br />
tillsammans med FrameDecompressor<br />
FrameSource anskaffar och förbehandlar bilder, används tillsammans<br />
med FrameCompressor<br />
Dessa utgör stommen i den kompressionsmotor som används och är att betrakta som<br />
ramverksklasser som utnyttjar objekt av andra klasser via specificerade gränssnitt för kompression<br />
och dekompression av bilder. De har implementerats för att underlätta synkronisering av<br />
kompressionsmotorn vid användning.<br />
core<br />
I detta underpaket samlas de gränssnitt och klasser som utgör kärnan i kompressionsmotorn. Dessa<br />
är (ordnade efter funktionalitet)<br />
77
Databärande klasser<br />
RGBImage representerar en RGB bild<br />
Matrix representerar en tvådimensionell kvadratisk flyttalsmatris<br />
Block representerar ett block av bilddata, består av en<br />
matris (instans av Matrix) per färgkanal i bilden<br />
och innehåller antingen pixeldata eller<br />
transformkoefficienter<br />
Frame representerar en bildruta som extraherats ur en<br />
RGB bild av en BlockAccessor. Innehåller så<br />
många förallokerade block som maximalt kan<br />
extraheras ur bilden samt en förteckning över<br />
vilka block som faktiskt uppdaterats med data av<br />
den BlockAccessor som använts<br />
BlockIndexTable representerar en block index tabell. Detta är en<br />
tabell över pixelindex i en RGB bild som<br />
förberäknats med hjälp av bildens dimensioner<br />
samt index för blocket<br />
Mask representerar en filtreringsmask för transformberäkningar.<br />
Används framförallt av signaltransformen<br />
och trunkeringsklasserna.<br />
DCTTerms representerar förberäknade transformtermer<br />
(värden från basfunktioner) för Diskreta Cosinus<br />
Transformen, används av klassen DCT<br />
Generella ramverksklasser för transformbaserade beräkningar<br />
TransformObject Abstrakt basklass för alla transformklasser<br />
RGBImageTransform gränssnitt som specificerar ett ramverk för beräkningar<br />
på RGB bilder<br />
RGBImageTransformImpl basklass som implementerar generella beräkningar<br />
på RGB bilder enligt RGBImage-<br />
Transform<br />
MatrixTransform gränssnitt som specificerar ett ramverk för transformberäkningar<br />
på matriser<br />
BlockTransform gränssnitt som specificerar ett ramverk för<br />
transformberäkningar på block<br />
BlockTransformImpl basklass som implementerar generella beräkningar<br />
på block enligt BlockTransform<br />
FrameTransform gränssnitt som specificerar ett ramverk för<br />
transformberäkningar på bildrutor (Frame objekt)<br />
78
FrameTransformImpl basklass som implementerar generella beräkningar<br />
på bildrutor enligt FrameTransform<br />
ParameterizedMatrixTransform gränssnitt som utökar MatrixTransform med<br />
parameteriserade beräkningar<br />
ParameterizedMatrixTransformImpl basklass som implementerar generella beräkningar<br />
på matriser enligt ParameterizedMatrix-<br />
Transform<br />
ParameterizedBlockTransform gränssnitt som utökar BlockTransform med<br />
parameteriserade beräkningar<br />
ParameterizedBlockTransformImpl basklass som implementerar generella beräkningar<br />
på block enligt ParameterizedBlock-<br />
Transform<br />
ParameterizedFrameTransform gränssnitt som utökar FrameTransform med<br />
parameteriserade beräkningar<br />
ParameterizedFrameTransformImpl basklass som implementerar generella beräkningar<br />
på bildrutor enligt ParameterizedFrame-<br />
Transform<br />
Klasser för specifika delar av kompressionsprocessen<br />
ImageSource gränssnitt för bildkällor<br />
ImageSourceImpl basklass som implementerar simulationen av en<br />
bildkälla med en given bildfil som data<br />
PreProcessor gränssnitt för förbehandling av RGB bilder<br />
PadPreProcessor abstrakt basklass som implementerar förbehandling<br />
som paddning av bilddimensioner till jämna<br />
multiplar av blockdimensionen<br />
CropPadPreProcessor klass som implementerar förbehandling genom<br />
crop pad (beskärning) av bilden<br />
MirrorEdgePadPreProcessor klass som implementerar förbehandling genom<br />
mirror–edge pad av bilden<br />
NullPreProcessor klass som implementerar PreProcessor utan att<br />
förändra bilden<br />
BlockAccessor gränssnitt för blockfiltrering och blockextraktion<br />
BlockAccessorImpl abstrakt basklass som implementerar Block-<br />
Accessor utan att implementera någon förbehandling<br />
79
CropPadBlockAccessor klass som implementerar BlockAccessor med<br />
crop pad som förbehandling<br />
MirrorEdgePadBlockAccessor klass som implementerar BlockAccessor med<br />
mirror–edge pad som förbehandling<br />
NoPadBlockAccessor klass som implementerar BlockAccessor utan<br />
förbehandling<br />
ColorSpaceTransform gränssnitt för färgrymdsomvandling<br />
ColorSpaceTransformImpl abstrakt basklass som implementerar ett ramverk<br />
för färgomvandling som bildrutetransform<br />
ColorSpaceBlockTransformImpl klass som implementerar ett ramverk för färgomvandling<br />
som blocktransform<br />
ColorSpaceTransformOp interface som specificerar ett ramverk för färgrymdsomvandlingsoperationer<br />
på matriselementsnivå<br />
RGB2RGBColorSpaceTransform klass som implementerar ColorSpaceTransform,<br />
förändrar inte färgrymden<br />
RGB2YCbCrColorSpaceTransform klass som implementerar ColorSpaceTransform,<br />
omvandlar från RGB till YCbCr och vice versa<br />
RGB2YIQColorSpaceTransform klass som implementerar ColorSpaceTransform,<br />
omvandlar från RGB till YIQ och vice versa<br />
RGB2YUVColorSpaceTransform klass som implementerar ColorSpaceTransform,<br />
omvandlar från RGB till YUV och vice versa<br />
SignalTransform gränssnitt för signaltransform<br />
DCT klass som implementerar DCT som signaltransform<br />
på bildrutenivå<br />
DCTMatrixTransform klass som implementerar DCT som signaltransform<br />
på matrisnivå<br />
NormalizationTransform gränssnitt för normaliseringsmatris<br />
NullNormalizationTransform klass som implementerar Normalization-<br />
Transform, utför ingen normalisering<br />
QuantizationTransform gränssnitt för trunkering och kvantifiering (endast<br />
trunkering är implementerad)<br />
80
QuantizationFrameTransformImpl abstrakt basklass som implementerar trunkering<br />
på bildrutenivå<br />
QuantizationMaskFactory gränssnitt som specificerar ett ramverk för<br />
generering av filtreringsmasker (avsedda för<br />
trunkeringar av transformkoefficienter)<br />
QuantizationMaskFactoryImpl abstrakt basklass som implementerar ett ramverk<br />
för generering av filtreringsmasker (avsedda för<br />
trunkeringar av transformkoefficienter)<br />
QuantizationMatrixTransform gränssnitt som specificerar ett ramverk för<br />
trunkering av transformkoefficienter på matrisnivå<br />
QuantizationMatrixTransformImpl abstrakt basklass som implementerar ett ramverk<br />
för trunkering av transformkoefficienter på<br />
matrisnivå<br />
NullQuantizationMaskFactory klass som implementerar QuantizationMask-<br />
Factory utan att implementera någon trunkering<br />
NullQuantizationMatrixTransform klass som implementerar QuantizationMatrix-<br />
Transform utan att implementera någon<br />
trunkering<br />
NullQuantizationTransform klass som implementerar QuantizationMatrix-<br />
Transform utan att implementera någon<br />
trunkering<br />
QuantizationByMagnitudeMaskFactory klass som implementerar QuantizationMask-<br />
Factory för trunkering efter magnitud<br />
QuantizationByMagnitudeMatrixTransform klass som implementerar QuantizationMatrix-<br />
Transform för trunkering efter magnitud<br />
QuantizationByMagnitudeTransform klass som implementerar QuantizationTransform<br />
för trunkering efter magnitud<br />
QuantizationByThresholdMaskFactory klass som implementerar QuantizationMask-<br />
Factory för tröskeltrunkering<br />
QuantizationByThresholdMatrixTransform klass som implementerar QuantizationMatrix-<br />
Transform för tröskeltrunkering<br />
QuantizationByThresholdTransform klass som implementerar QuantizationTransform<br />
för tröskeltrunkering<br />
QuantizationByVarianceMaskFactory klass som implementerar QuantizationMask-<br />
Factory för trunkering efter varians<br />
QuantizationByVarianceMatrixTransform klass som implementerar QuantizationMatrix-<br />
Transform för trunkering efter varians<br />
81
QuantizationByVarianceTransform klass som implementerar QuantizationTransform<br />
för trunkering efter varians<br />
PostProcessor gränssnitt för efterbehandling<br />
PixelQuantizationMatrixTransform klass som implementerar efterbehandling innehållande<br />
trunkering av pixelvärden som matristransform<br />
PixelQuantizationPostProcessor klass som implementerar efterbehandling innehållande<br />
trunkering av pixelvärden som bildrutetransform<br />
NullPostProcessor klass som implementerar efterbehandling utan att<br />
bildrutan påverkas<br />
demo<br />
I detta underpaket samlas de interaktiva demonstrationer som utvecklats samt hjälpklasser de<br />
använder sig av, här listade efter funktion<br />
Hjälpklasser<br />
MatrixModelPanel klass som producerar en vy av en matris väg<br />
genom komprimeringsfasen<br />
BlockModelPanel klass som producerar en vy av ett blocks väg<br />
genom komprimeringsfasen<br />
MatrixPanel klass som producerar en grafisk representation av<br />
en matris<br />
ImagePanel klass som producerar en grafisk representation av<br />
en RGB bild<br />
FramePanel klass som producerar en grafisk representation av<br />
en videosekvens<br />
ImageEngine motorklass som implementerar diverse omvandlingar<br />
i bildformat<br />
ImageBrowser klass som implementerar ett verktyg för att<br />
granska förgenererade bilder<br />
82
ImageGenerator klass som förgenererar bilder för statistiksammanställning<br />
StatisticGenerator klass genererar en statistiksammanställning av<br />
förgenererade bilder<br />
Statistics klass som demonstrerar statistik för förgenererade<br />
bilder<br />
Miscellaneous klass som implementerar små praktiska funktioner<br />
som avrundning<br />
Bildkällor som används för demonstrationer<br />
CookieMonsterImageSource klass som simulerar en bildkälla kring testbilden<br />
Kakmonstret<br />
LenaImageSource klass som simulerar en bildkälla kring testbilden<br />
Lena<br />
HighMotionImageSource klass som simulerar en bildkälla kring testvideosekvensen<br />
HighMotion<br />
LowMotionImageSource klass som simulerar en bildkälla kring testvideosekvensen<br />
LowMotion<br />
Interaktiva demonstrationer<br />
PadDemo interaktiv demonstration av bilddimensionsomvandlingar,<br />
se Appendix X<br />
PadDemoApplet PadDemo som Java Applet<br />
BlockDemo interaktiv demonstration av blockextraktion, se<br />
Appendix B<br />
BlockDemoApplet BlockDemo som Java Applet<br />
DCTDemo interaktiv demonstration av DCT, se Appendix B<br />
DCTDemoApplet DCTDemo som Java Applet<br />
QuantizationDemo interaktiv demonstration av trunkering, se Appendix<br />
B<br />
QuantizationDemoApplet QuantizationDemo som Java Applet<br />
QuantizationOrdoDemo demonstration av beräkningskomplexitet för trunkering<br />
QuantizationOrdoDemoApplet QuantizationOrdoDemo som Java Applet<br />
83
FrameCompressionDemo interaktiv demonstration av bildkompression, se<br />
Appendix B<br />
FrameCompressionDemoApplet FrameCompressionDemo som Java Applet<br />
StreamCompressionDemo interaktiv demonstration av bildsekvenskompression,<br />
se Appendix B<br />
StreamCompressionDemoApplet StreamCompressionDemo som Java Applet<br />
AnimatedStreamCompressionDemo interaktiv demonstration av bildsekvenskompression,<br />
se Appendix B<br />
AnimatedStreamCompressionDemoApplet AnimatedStreamCompressionDemo som Java<br />
Applet<br />
graph<br />
I detta underpaket finns ett enkelt ramverk för produktion av grafer<br />
Function klass som representerar en samplad funktion<br />
Sample klass som representerar en sampling av en funktion<br />
GraphEngine motorklass som producerar grafiska representationer<br />
av samplade funktioner<br />
marker underpaket som innehåller 15 klasser som vardera<br />
representerar olika typer av markörer för funktioner<br />
i grafer (cirkel, fylld cirkel, rektangel<br />
o.s.v.)<br />
measure<br />
I detta underpaket finns ett ramverk för och olika implementationer av mätmetoder<br />
Ramverksklasser<br />
84
Measurement gränssnitt för mätmetod<br />
MeasurementImpl abstrakt basklass som implementerar ett ramverk<br />
för generella mätmetoder på matriser, block, bildrutor<br />
och RGB bilder<br />
AbsoluteMeasurementImpl abstrakt basklass som implementerar ett ramverk<br />
för absoluta (summerande) mätmetoder på matriser,<br />
block, bildrutor och RGB bilder<br />
AverageMeasurementImpl abstrakt basklass som implementerar ett ramverk<br />
för genomsnittliga (medelvärdesbaserade) mätmetoder<br />
på matriser, block, bildrutor och RGB<br />
bilder<br />
Mätmetoder<br />
AbsoluteErrorMeasurement klass som implementerar mätmetoden AE<br />
CompressionMeasurement klass som mäter kompressiongrad<br />
MeanSquareErrorMeasurement klass som implementerar mätmetoden MSE<br />
NumberPixelsDifferMeasurement klass som mäter antal pixlar som förändrats<br />
mellan två bilder<br />
RootMeanSquareErrorMeasurement klass som implementerar mätmetoden RMSE<br />
util<br />
I detta underpaket finns generella verktygsklasser<br />
BlockDimension klass som räknar ut lagringsutrymme för<br />
förberäknade transformtermer (för DCT) som<br />
funktion av blockdimensionen<br />
BMPConverter klass som omvandlar en .BMP fil till en .X fil<br />
RGBImageAccessor klass som laddar bilder från kända filformat samt<br />
sparar dem i ett eget format (kallat .x)<br />
TGAConverter klass som omvandlar en .TGA fil till en .X fil<br />
85
Appendix B – Interaktiva demonstrationer<br />
De interaktiva demonstrationer som utvecklats för att illustrera de olika delarna av<br />
kompressionsprocessen finns tillgängliga från<br />
http://www.cs.umu.se/~dppog/exjobb/<br />
Dessa demonstrationer har implementerats i Java med swing och kräver JRE 1.4 för att kunna<br />
köras. Samtliga demonstrationer inklusive bilddata finns samlade i en JAR fil som heter<br />
dppog.jar.<br />
De första fyra demonstrationerna arbetar på matriser och har tagits fram för pedagogisk överblick<br />
över kompressionsprocessen komponenter. De sista tre arbetar på bilder och demonstrerar<br />
praktiskt kompression med de implementerade komponenterna. Dessa syftar till att demonstrera<br />
utbytesförhållandena mellan de olika delarna av kompressionsmodulen.<br />
86
Pad Demo<br />
Detta program demonstrerar användandet av två stycken paddningsscheman och startas med<br />
kommandot<br />
java –classpath dppog.jar PadDemoApplet<br />
Mirror–edge pad speglar pixlar runt blockkanter och crop pad klipper bort överskjutande pixlar<br />
Figur 15. Pad Demo, demonstrerar mirror–edge pad och crop pad<br />
87
Block Demo<br />
Detta program demonstrerar användandet av mirror–edge pad tillsammans med blockextraktion<br />
och startas med kommandot<br />
java –classpath dppog.jar BlockDemoApplet<br />
Figur 16. Block Demo, demonstrerar mirror–edge pad tillsammans med blockextraktion<br />
88
DCT Demo<br />
Detta program demonstrerar den Diskreta Cosinus Transformen (DCT) och startas med<br />
kommandot<br />
java –classpath dppog.jar DCTDemoApplet<br />
Figur 17. DCT Demo, demonstrerar den Diskreta Cosinus Transformen (DCT)<br />
89
Quantization Demo<br />
Detta program demonstrerar den Diskreta Cosinus Transformen (DCT) i kombination med<br />
trunkering efter varians respektive magnitud och startas med kommandot<br />
java –classpath dppog.jar QuantizationDemoApplet<br />
Figur 18. Quantization Demo, demonstrerar Diskreta Cosinus Transformen (DCT) tillsammans<br />
med trunkering efter varians respektive magnitud<br />
90
Frame Compression Demo<br />
Detta program demonstrerar kompression av stillbilder och startas med kommandot<br />
java –classpath dppog.jar –mx400M FrameCompressionDemoApplet<br />
De komponenter som går att kontrollera i denna applikation är<br />
image source bildkälla, tillhandahåller bild(er)<br />
pre processor förbehandlar bilden<br />
block accessor sköter blockextraktion ur bilden<br />
colorspace transform beräknar färgrymdsomvandlingar<br />
signal transform signaltransform, endast DCT<br />
normalization tranform normalisering av transformkoefficienter, icke implementerad<br />
post processor sköter efterbehandling av block<br />
De parametrar som går att styra är<br />
block dimension dimension på blocken i komprimeringen<br />
# coefficients antal transformkoefficienter, för varians– och magnitudtrunkering<br />
quantization threshold tröskelvärden för tröskeltrunkering<br />
De mätvärden som beräknas är<br />
compression ratio kompressionsgrad, i storleksförhållande och andel<br />
RMSE medelabsolutfel<br />
MSE medelkvadratfel<br />
AE absolutfel, totalt och utslaget per pixel<br />
# pixels affected antal pixlar som förändrats efter kompression, totalt och andel<br />
Bilden presenteras i originalform och komprimerad form. Båda bilder är klickbara och producerar<br />
en förstoring av valt område med förstoringsfaktor 10 och 20 för vänster– respektive högerklick.<br />
Klickas med mittenknappen (eller scrollhjulet) produceras en överblick över valt block för alla<br />
steg i komprimeringsfasen.<br />
91
Figur 19. Frame Compression Demo, demonstrerar kompression av stillbilder<br />
92
Stream Compression Demo<br />
Detta program demonstrerar kompression av bildrutor i videosekvenser och startas med<br />
kommandot<br />
java –classpath dppog.jar –mx400M StreamCompressionDemoApplet<br />
Stream Compression Demo är byggd ovanpå Frame Compression Demo och fungerar likadant<br />
med undantagen att den arbetar på bildsekvenser samt att det finns de extra parametrarna<br />
reference frame interval antalet bildrutor mellan refernce frames<br />
block filter threshold tröskelvärde för blockfiltret<br />
Det finns även en filter image, vilket är en grafisk representation av vilka block som passerat<br />
blockfiltret för den aktuella bildrutan<br />
Figur 20. Stream Compression Demo, demonstrerar kompression av bildrutor i videosekvenser<br />
93
Animated Stream Compression Demo<br />
Detta program demonstrerar kompression av bildrutor i videosekvenser animerat och startas med<br />
kommandot<br />
java –classpath dppog.jar –mx400M<br />
AnimatedStreamCompressionDemoApplet<br />
Animated Stream Compression Demo är byggd ovanpå Stream Compression Demo och fungerar<br />
likadant med undantaget att det finns möjlighet att köra videosekvensen som en animation.<br />
Figur 21. Animated Stream Compression Demo, demonstrerar kompression av bildrutor i<br />
videosekvenser animerat<br />
94