22.08.2013 Views

Mjukvarurealiserad bildtelefoni - Umeå universitet

Mjukvarurealiserad bildtelefoni - Umeå universitet

Mjukvarurealiserad bildtelefoni - Umeå universitet

SHOW MORE
SHOW LESS

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

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!