keskiviikko 31. maaliskuuta 2010

Kompressiota ja kuva-analyysiä

Ensimmäisellä tunnilla tutustuttiin kompression teoriaan, erityisesti kuvien tapauksessa. Kompressio lienee se signaalinkäsittelyn ala, joka on lähinnä jokapäiväistä elämää. Anekdoottina esitin aluksi muisikuvan, jonka mukaan ensimmäiset 1990-luvun alun jpeg-purkuohjelmat prosessoivat tyypillistä neljännesmegapikselin kuvaa useamman minuutin ennen kuin se oli GIF-formaatissa, jonka silloiset kuvankatseluohjelmat osasivat näyttää. Ilman laskentatehon eksponentiaalista kasvua digitaalinen media olisi kaukana siitä mitä se nyt on.

Häviöttömistä menetelmistä käytiin tarkemmin läpi Huffman-koodaus, joka perustuu koodipuun generointiin symbolien todennäköisyyksien mukaan. Harvinaisemmille symboleille annetaan pidempi koodisana, mikä mahdollistaa lyhyemmän koodisanan antamisen yleisemmille symboleille. Huffmanin pakkaustehokkuutta voidaan verrata entropiaan, joka antaa alaraja mille tahansa häviöttömälle pakkausmenetelmälle. Todettiin Huffmanin pääsevän melko lähelle alarajaa. Entropiarajaa voidaan pudottaa erilaisilla tempuilla, kuten tallentamalla ns. erotuskuva.

Toisen tunnin jälkimmäisellä puoliskolla oli "vierailuluento", jossa kerroin itse automaattisesta rekisterikilpien tunnistuksesta videokuvasta. Tätä tekee Tamperelainen yritys Visy Oy, jossa olin töissä 2003-2005 (ja edelleenkin sivutoimiluvalla). Rekisterikilpien tunnistus toimii kulunvalvonnan tunnisteena, jolloin kulkulupa suljetulle alueelle voidaan myöntää tietylle kilvelle. Erityisen hyödyllinen tämä on esimerkiksi satamissa, joissa vieraat käyvät usein vain kerran. Tällöin normaalit menetelmät, kuten autojen RFID-lukijat (esim. tämä valmistaja) ovat liian vaivalloisia hallinnoida. Sen sijaan rekisterikilpi toimii kuin sormenjälki: se on aina mukana.

Kurssin viime kevään välikoe/tentti käydään läpi huomenna to 1.4 klo 10:15 alkaen salissa TB109.

Kurssille järjestetään jatkokurssi SGN-1250 ensi kesänä juhannuksen jälkeen sekä ensi syksynä.

keskiviikko 24. maaliskuuta 2010

Kanavan estimointia ja kuvankäsittelyä

Tunnin aluksi korostettiin viimeistä kertaa konvoluution ja Fourier-muunnoksen yhteyttä. Jos siis

y(n) = h(n) * x(n),

niin konvoluutio muuttuu kertolaskuksi z-muunnoksessa (ja näin ollen myös vastaavissa Fourier-muunnoksissa):

Y(z) = H(z) X(z),
Y(e^(iw)) = H(e^(iw)) X(e^(iw)),
Y(n) = H(n) X(n),

Tästä seuraa, että jakolaskulla voidaan ratkaista joko H tai X, kun kaksi muuta termiä tiedetään. Esimerkiksi kanavan estimoinnissa tiedetään X ja Y, ja halutaan ratkaista näiden välinen yhteys esim. GSM-kanavan ekvalisoinnissa.

Tämän jälkeen luotiin lyhyt katsaus suodinsuunnitteluun ns. käänteisen Fourier-muunnoksen menetelmällä, josta on myös ensi viikolla kaksi harjoitustehtävää. Menetelmän etu on sen yksinkertaisuus ja nopeus. Miinussarakkeeseen tulee merkintä sen huonosta tarkkuudesta: amplitudivaste on tarkka vain N:ssä pisteessä, muualla se voi olla mitä sattuu.

Näiden jälkeen paneuduttiin kappaleeseen 6, joka tarkastelee kuvankäsittelyä. Alkuosa koostuu enimmäkseen yksiulotteisten lineaaristen järjestelmien yleistyksestä kahteen ulottuvuuteen. Fourier-muunnoksen yhteydessä todettiin, että kaksiulotteinen tapaus voidaan toteuttaa kahden yksiulotteisen FFT:n avulla, mikä mahdollistaa nopean laskennan.

Tämän jälkeen tarkasteltiin dekonvoluutiota, eli konvoluution käänteistä operaatiota. Monisteen esimerkin lisäksi esimerkkinä mainittiin Hubble-avaruusteleskoopin varhainen ongelma, joka aiheutti kuvaan jonkin verran epätarkkuutta. Ennen kuin kiertoradalle päästiin korjaamaan linssi kuntoon, täytyi linssin virhe mallintaa konvoluution avulla. Varhaisia kuvia myös korjattiin dekonvoloimalla virheelliset kuvat. Linssi kuitenkin lopulta vaihdettiin, koska dekonvoluutio ei voi tuottaa yhtä täydellistä tulosta kuin fyysinen korjaus. Tämä johtuu siitä, että PSF ei koskaan ole täysin oikea, vaan siinä on numeerista epätarkkuutta. Lisäksi informaatiota saattaa kadota konvoluution yhteydessä, jos taajuustason funktiossa H(n,m) on nollia kertoimina.

Lisäksi tutustuttiin liike-epätarkkuuden korjaukseen erään SIGGRAPH-artikkelin vaikuttavien esimerkkien kautta.

Tunnin lopuksi perehdyttiin kuvien piste-ehostukseen. Tähän alueeseen kuuluvat menetelmät käsittelevät kuvaa piste kerrallaan ajamalla kunkin harmaasävyarvon tietyn funktion läpi. Funktio määräytyy tilanteen mukaan, ja gamma-korjauksen tapauksessa se on muotoa

y = x^gamma

(sopivilla skaalauksilla varustettuna, jolloin väli [0,255] kuvautuu väliksi [0,255]). Histogrammin ekvalisoinnin tapauksessa funktio lasketaan kuvasta niin, että histogrammin massa jakautuu suunnilleen tasaisesti. Tämä saadaan aikaiseksi kaavalla 6.1.

torstai 18. maaliskuuta 2010

Suodinsuunnittelu, osa 2

Tämän viikon luennolla käsiteltiin suodinsuunnittelu loppuun.

Ensimmäisellä tunnilla kerrattiin taajuusvasteen ja impulssivasteen yhteyttä. Jos tiedetään haluttu taajuusvaste, voidaan sitä vastaava impulssivaste ratkaista käänteisellä diskreettiaikaisella Fourier-muunnoksella (jos integraali vaan saadaan ratkeamaan). Valmiit ratkaisut annetaan prujussa neljälle vastetyypille: alipäästö-, ylipäästö-, kaistanpäästö-, sekä kaistanestosuotimelle. Näistähän tosin voidaan kolme viimeistä järkeillä pelkän alipäästösuotimen avulla. Esimerkiksi ylipäästösuodin on mahdollista esittää identiteettisuotimen ja alipäästösuotimen avulla:

hyli(n) = delta(n) - hali(n)

tai toisin sanoen

(korkeat taajuudet) = (kaikki taajuudet) - (matalat taajuudet).

Ideaalisen suotimen impulssivasteen pituus on ääretön, eikä sitä voi käytännössä toteuttaa. Näin ollen impulssivaste on katkaistava, mistä seuraa vääristymä amplitudivasteeseen. Matlab-testeillä havaittiin, että tätä ei voi kompensoida esim. kertoimia lisäämällä, vaan on käytettävä ikkunaa joka pehmentää katkaisun vaikutusta. Ikkunoita on lueteltu esim. sivun 84 taulukossa, ja mitä paremmat vaimennusominaisuudet niillä on, sitä leveämpi siirtymakaistasta tulee. Onneksi tätä voidaan kuitenkin kompensoida kertoimia lisäämällä.

Luennon lopuksi käytiin taululla esimerkki ikkunamenetelmän käytöstä vuoden 2008 toukokuun tentissä. Tässä sattui kiireessä valitettava virhe, ja taajuudet normalisoitiin 16 kHz:lla, vaikka oikea luku olisi ollut näytteenottotaajuus 32 kHz. Tästä virheestä olisi tentissä mennyt yksi piste.

Myös luentomonisteessa on noin puolen pisteen arvoinen virhe sivulla 87. Tuon sivun tehtävässä N = 53, mutta sivun keskellä olevassa impulssivasteen ht(n) kaavassa on mystinen luku 85. Tämän kuuluisi olla 53.

keskiviikko 10. maaliskuuta 2010

Suotimen analyysi ja synteesi

Tänään pääasiana oli suotimen suunnittelu eli synteesi. Aluksi muisteltiin vielä suotimen analyysikappaletta (kappale 4), jossa suotimen ominaisuudet pääteltiin sen kertoimista. Varsinaisen luennon aluksi käytiin läpi Matlab-demo, jossa hiirellä voidaan sijoitella napoja ja nollia napa-nollakuvioon, ja Matlab laskee syntyneen suotimen taajuusvasteen. Kolmanteen kuvaan tuli funktio

20 log10 (|H(z)|),

jossa näkyi nollien ja napojen aiheuttamat piikit ylös- ja alaspäin.

Kappaleessa 5 tarkastellaan kappaleen 4 ongelmaa toisin päin. Kappaleessa 4 tavoite oli selvittää annetun suotimen taajuusominaisuudet, ja kappaleessa 5 pitäisi ratkaista mikä suodin toteuttaa annetun taajuuskäyttäytymisen. Suunnittelukriteerit ovat kahtalaiset: suotimen taajuusvasteen määräämiseksi pitää tietää millainen vaihevaste halutaan ja millainen amplitudivaste halutaan.

Vaihevasteen osalta vaaditaan että kaikkien taajuuksien tulee viivästyä yhtä paljon. Tämä toteutuu jos vaihevaste on lineaarinen. Yksinkertaisimmissa tapauksissa vaihevasteen lauseke voi olla siis esimerkiksi muotoa -2w, joka taatusti on lineaarinen. Havaittiin kuitenkin, että vaihevasteessa tapaa olla 180 asteen hyppäyksiä, ja silti vaihevaste voi olla lineaarinen. Tällainen hyppäys tulee tilanteessa jossa taajuusvastefunktio menee kompleksitason origon läpi. Matlabissa tällainen kuvaaja saadaan esim. komennoilla:

>> [H,W] = freqz([1, 1, 1]);
>> plot(H);
>> grid on

Freqz-funktiosta saa siis ulos taajuusvastefunktion arvoja vektorissa H. Vektorissa on lueteltu taajuusvasteen kompleksiset lukuarvon 512:ssa pisteessä taajuusakselilla. Kun kuvaaja plotataan ruudulle, on tuloksessa yksi nollakohta, jossa kompleksifunktion vaihe hyppää 180 astetta (ts. funktio vaihtaa merkkiä). Näistä nollakohdista huolimatta suodin voi olla lineaarivaiheinen, ja näin ollen lineaarisuus kannattaakin määritellä näin: Vaihevaste on lineaarinen, jos vaihevasteen derivaatta on vakio aina kun se on määritelty. Derivaatasta käyteään nimeä ryhmäviive, ja se ilmaisee suoraan eri taajuuksille tulevan viiveen näytteinä (miinusmerkkisenä). Lopuksi todettiin, että vaihevaste on aina lineaarinen, jos impulssivasteen termit ovat symmetrisesti keskipisteen suhteen.

Amplitudivaste täytyisi saada päästökaistalla ykköseksi ja estokaistalla nollaksi. Käytännössä tämä ei ole mahdollista, vaan suotimelle täytyy antaa hieman toleranssia ja sallia tietty määrä värähtelyä molemmilla kaistoilla. Lisäksi kaistojen väliin täytyy sallia "don't care" -alue, jossa amplitudivaste saa olla mitä vain.

Prujussa ratkaistaan mikä impulssivaste toteuttaisi ideaalisen amplitudivasteen (arvot vain nollaa tai ykköstä). Osoittautuu että impulssivasteen muoto on tuttu sinc-funktio, mutta sen pituus on ääretön. Tämän vuoksi suotimesta ei saataisi ainuttakaan vastearvoa koskaan, vaan laskentaa tarvittaisiin äärettömän paljon.

Tästä ongelmasta päästään katkaisemalla impulssivaste, mutta tämä luonnollisesti vaikuttaa amplitudivasteeseen. Todettiin, että suoralla katkaisulla ei estokaistan värähtelyä saada millään alle n. 21 desibelin, ja päästökaistallakin suurin heitto on luokkaa 0.7 dB. Ratkaisu tähän on käyttää ikkunointia, eli kertoa katkaistu impulssivaste jollain ikkunafunktiolla. Näin voidaan päästä parempiin vaimennusominaisuuksiin. Tämä kuitenkin kostautuu siirtymäkaistan levenemisenä: esim. Hamming-ikkunan siirtymäkaista on aina n. 3,5-kertainen suoraan katkaisuun verrattuna. Tämä voidaan kuitenkin kompensoida nostamalla kertoimien määrää.

keskiviikko 3. maaliskuuta 2010

Siirtofunktio ja taajuusvaste

Tänään käsiteltiin kappaleen 4 loppuosa, ja pohdittiin siirtofunktion merkitystä suotimen analyysissä. Tämän ja viime viikon tavoite oli siis oppia analysoimaan annetun suotimen toiminta. Ensi viikolla käännetään ongelma toisin päin ja siirrytään suotimen synteesiin: kuinka suunnitellaan suotimen impulssivaste niin että se täyttää annetut taajuusvaatimukset.

Kaikki lähtee liikkeelle konvoluution ja z-muunnoksen yhteydestä: konvoluutio muuttuu kertolaskuksi z-muunnoksessa. Jos siis suodatus noudattaa yhtälöä

y(n) = h(n) * x(n),

on sama yhtälö voimassa myös z-tasossa:

Y(z) = H(z) X(z)

Tällöin impulssivasteen h(n) muunnoksen tuloksesta käytetään nimeä siirtofunktio. Siirtofunktio on rationaalifunktio, jonka osoittajassa ja nimittäjässä on polynomi. Kun tämä lauseke tiedetään, saadaan Fourier-muunnos em. sijoituksella. Tulos H(exp(iw)) on nimeltään taajuusvaste, ja siihen menee sisään reaaliluku w (taajuus josta ollaan kiinnostuneita), ja ulos tulee kompleksiluku. Tämän kompleksiluvun itseisarvo kertoo kuinka suuri vahvistus suotimella on kyseisellä taajuudella.

Suotimen analyysi käytiin läpi kaavan (4.3) suotimella. Ensin siitä selvitetään impulssivaste, sitten siirtofunktio ja lopuksi taajuusvaste. Taajuusvaste on kompleksifunktio, joten sitä ei voida sellaisenaan piirtää 2-ulotteiseen koordinaatistoon. Näin ollen piirretään kaksi kuvaajaa: funktion itseisarvon kuvaaja sekä sen vaihekulman kuvaaja. Näistä edellinen kertoo kuinka paljon eri taajuuksien amplitudit muuttuvat suodatuksessa ja jälkimmäinen paljonko ne viivästyvät suodatuksessa. Amplitudivaste on näistä mielenkiintoisempi, koska sen avulla taajuuksia saadaan esim. poistettua yksinkertaisesti huolehtimalla että amplitudivaste ko. taajuudella on nolla. Vaihevasteessakin on oma mielenkiintonsa, ja siihen tutustutaan lähemmin ensi viikolla.

Lineaarista asteikkoa kätevämpi on käyttää desibeliasteikkoa, joka on logaritminen. Logaritmi tekee kertolaskusta yhteenlaskua, ja korostaa lähellä nollaa olevia eroja, jotka molemmat ovat meille käteviä ominaisuuksia.

Seuraavaksi perehdyttiin suotimen siirtofunktion käytännön laskentaan kappaleessa 4.5.4. Tällä menetelmällä saadaan kätevästi sekä IIR-, että FIR-suotimen siirtofunktiot laskettua. Siirtofunktion navoista ja nollista voi päätellä yllättävän paljon suotimen stabiilisuudesta sekä amplitudivasteesta, ja tästä jatketaan ensi kerralla.

keskiviikko 24. helmikuuta 2010

Iriksentunnistusta ja z-muunnoksia

Ensimmäisellä tunnilla kuultiin Tapio Mannisen vierailuluento aiheesta "Iiris biometrisena tunnisteena". Esitys pohjautui Tapion kandityöhön, joka valmistui vuosi sitten. Sivumennen sanoen Tapio valmistui tekniikan kandidaatiksi "oivallisesti", mikä tarkoittaa keskiarvoa yli 4 ja kandityön arvosanaa vähintään 4 sekä automaattista 250 euron stipendiä TTY:ltä.

Iiriksentunnistus pohjautuu John Daugmanin kehittämään ja patentoimaan IrisCode-menetelmään. Algoritmi tunnistaa ensin iiriksen ja pupillin reunat sovittamalla niihin ympyrät. Näiden avulla iiriksen alue muunnetaan napakoordinaatistoon, ja saatu matriisi jaetaan edelleen 8x4 = 32 alueeseen. Kukin näistä alueista projisoidaan pistetulon avulla ns. Gabor-kantaan (suodatetaan Gabor-suotimilla). Puhutaan myös Gabor-muunnoksesta, mikä viittaa siihen että kyseessä on hieman viritetty versio Fourier-muunnoksen kaksiulotteisesta yleistyksestä (ks. myös prujun sivut 96-99). Näin jokaisesta alueesta jää jäljelle yksi kompleksiluku kutakin 32:a Gabor-aalloketta kohti. Tämän kompleksiluvun vaihe kvantisoidaan neljään arvoon, jotka voidaan kuvata kahdella bitillä. Kaikkiaan saadaan siis 32 x 32 x 2 = 2048 bittiä pitkä bittijono, joka toimii tunnisteena. Lopuksi pohdittiin kuinka päätellään kuvaavatko kaksi bittijonoa samaa silmää. Tässä oli apuna tilastomatematiikka niin, että arvioitiin jakaumat ns. Hamming-etäisyydelle samoille ja eri silmille. Näin voidaan arvioida virhepäätelmän todennäköisyyttä, mikä on olennainen osa järjestelmän myyntipuheita sekä sen lakiteknistä luotettavuutta (esim.: Loton päävoitto on todennäköisempi kuin että asiaton henkilö pääsee kulunvalvonnastamme sisään ilman lupaa.)

Laitoksella tehtyihin kanditöihin voi tutustua tämän linkin takana. Linkistä latautuu zip-tiedosto, joka on suojattu salasanalla. Tunnus on sgnkandi ja salasana motiivi.

Toisella tunnilla aloitettiin Z-muunnoksen käsittely. Luennoilla ehdittiin käsitellä z-muunnoksen määritelmä, sekä laskea napa-nollakuviot muutamille z-muunnoksille. Itse muunnoksen laskennan osalta ehdittiin tarkastella vain yleisimpien jonojen z-muunnokset, jotka löytyvät sivun 58 alalaidan taulukosta. Useimpien jonojen z-muunnokset voidaan palauttaa näiden tapausten yhdistelmiksi, joten kauhean paljon monimutkaisempia muunnoksia ei tarvitse osatakaan laskea.

Z-muunnos on myös diskreettiaikaisen Fourier-muunnoksen (DTFT; s. 38) yleistys, ja muuntaa signaalin kompleksifunktioksi. Määritelmissä on eroa vain summan sisällä olevassa lausekkeessa, joka Z-muunnoksen tapauksessa on z, ja DTFT:n tapauksessa exp(iw). Jos siis tiedetään signaalin Z-muunnos, saadaan DTFT yksinkertaisesti sijoittamalla z = exp(iw).

Erityisen mielenkiintoinen Z-muunnos on silloin kun muunnettavana on suotimen impulssivaste (joka on signaali siinä kuin mikä tahansa muukin). Tällöin muunnoksen tuloksesta käytetään nimeä siirtofunktio. Siirtofunktio on rationaalifunktio, jonka osoittajassa ja nimittäjässä on polynomi. Kun tämä lauseke tiedetään, saadaan Fourier-muunnos em. sijoituksella. Tulos H(exp(iw)) on nimeltään taajuusvaste, ja siihen menee sisään reaaliluku w (taajuus josta ollaan kiinnostuneita), ja ulos tulee kompleksiluku. Tämän kompleksiluvun itseisarvo kertoo kuinka suuri vahvistus suotimella on kyseisellä taajuudella.

Kirjallisuudessa suotimista puhutaan yleensä niiden z-muunnoksen kautta. Pikainen haku tuottaa esim. tämän artikkelin, jossa esim. kaava (12) tekee juuri näin. Muistan itse ennen signaalinkäsittelyn opintojani saaneeni tehtäväksi toteuttaa suotimen

H(z) = 1 / (1 - z^-1 + 0.5 z^-2).

Ohjaajani näki jakolaskut C-kielisessä koodissa, ja sanoi: ei näin. Ensi viikolla nähdään miten tämä suodin pitäisi toteuttaa. Jakolaskuja toteutuksessa ei kuulu olla.

Kaiken kaikkiaan asia oli tänään varsin matemaattista. Jos tämä ahdistaa sinua, niin ensi viikolla helpottaa.

tiistai 23. helmikuuta 2010

Välikoe

Kurssin ensimmäinen välikoe oli eilen, ja assareilta kuulin, että sitä oli pidetty haastavana. Välikoejärjestelmä on vielä melko uusi laitoksellamme, ja kysymyksetkin näin ollen melko uusia. Tenttiä vartenhan kysymykset tuppaavat tulemaan prujun loppupuolelta materiaalin kumulatiivisen luonteen vuoksi. Viime vuonnakin välikoetta pidettiin vaikeana, mutta useat saivat silti täydet pisteet.

Kysymykset löytyvät kurssin sivuilta. Tässä muutamia kommentteja niistä.
  1. Ykköstehtävän oikea rivi on E, T, E, E, T, E.
  2. a) 2 x 10 kHz = 20 kHz. b) Fs on nyt 1/0,00125 Hz = 800 Hz. Prujun sivun 4 alalaidan kuvan perusteella 500 Hz laskostuu nyt taajuudelle 300 Hz. c) Samanlainen kuin harkkatehtävä 2.12.
  3. a) Ratkeaa matriisimuunnoksella, ja tulos on [1, -5+2i, 5, -5-2i]. b) Vaikeinta lienee termin y(2-n) muunnoksen laskenta. Tämä saadaan ratkaisemalla ensin y(-n):n muunnos (joka on sama kuin Y, mutta kaikki omegat miinusmerkkisiksi), ja tämän jälkeen lisäämällä kahdella siirron vaikutus (eli lausekkeen y(-n + 2) muunnos). y(2-n):n muunnos on siis exp(2iw) Y(exp(-iw)). x(n-1):n muunnoksen laskenta on helppoa, samoin kuin konvoluution, joka muuttuu Fourier-puolella kertolaskuksi. Päässälaskien sanoisin että kysytty lauseke on exp(2iw) Y(exp(-iw)) exp(-iw) X(exp(iw)), joka vielä vähän sieveneekin. Lauseketta en tällä merkistöllä saa näkyviin. Sivumennen sanoen, x(n) on jono 0.1^n * u(n) ja y(n) = 1, kun n=-5,...,5 ja nolla muulloin (tai lyhyemmin: y(n) = u(n+5) - u(n-6)).
  4. a) Samanlainen kuin tehtävä 2.17. b) Askelvaste voidaan päätellä kuten harkkatehtävässä 2.18 tehtiin. h(n) saadaan yksinkertaisesti sijoittamalla arvot.
  5. a) Impulssivasteen arvot ovat [0.3, -1.2, 1.0, 0.3] välillä n=0,...,3, ja muualla nollia. b) Tässä voidaan käyttää sivun 22 konvoluution ominaisuuksia, joista luennolla piirrettiin kuvatkin. Oikea vastaus on h(n) = h1(n) * h2(n) + h3(n).
Välikokeiden tarkastamisessa menee ehkä parisen viikkoa. Ilmoittautuneita oli reilu 200.