keskiviikko 11. helmikuuta 2009

Paperi #2 / R4-kierros - kooste

Lasketaan diskreettiaikaista konvoluutiota muutamalla eri tavalla.
Perusskeemassa konvoluuto on operaatio signaalille x[n] ja suotimen impulssivasteelle h[n], joka tuottaa y[n].



Konvo on yksiselitteisesti määritelty operaatio x:lle ja h:lle tuottaen y:n. Jos iso sigma (summain) tuottaa ongelmia, avaa se.



Esitetään siis kolme eri tapaa. Neljäs pistelaskarien esimerkissä.

Konvo on siis suodattimista, kuten käy ilmi tehtävässä 1a. [156]



Kohdat b ja c tulevat konvon määritelmästä. Otetaan avuksi sekvenssin pituuden ilmoittava L{.} ja sekvenssin aloituskohdan indeksin palauttava A{.}. [157]



Ensin b:ssä ulostulo saadaan kääntämällä toinen sekvenssi, liu'uttamalla sitä eri n:n arvoilla ja kussakin kohdassa summaamalla kohdakkain sattuvien lukujen tulot. [158, 159]





Kohta c on itsestäni huomattavasti simppelimpi. Konvo on skaalattujen ja siirrettyjen sekvenssien ax[n-k] summa. Skaalauskertoimet a ja siirrot k määräytyvät toisesta konvoloitavasta h[n].
[160]



Laskettiin pistelaskareita. [161]



Pistelaskareissa tulee vastaan vielä yksi tapa laskea konvoluutio: taajuustasossa kertolasku. Esim h[n] * x[n] => H(z) X(z) = Y(z) => y[n]. Eli konvo onkin vastaavien polynomien tulo.

Tehtävässä 2 lasketaan dekonvoluuutiota eli konvoluution käänteisoperaatiota. Konvoluutio: tunnetaan kaksi konvoloitavaa sekvenssiä. Dekonvoluutio: tunnetaan toinen konvoloitavista ja konvoluution lopputulos.

Päädytään siihen, että dekonvo lasketaan konvon määritelmää hyväksikäyttäen. Muodostuva yhtälöryhmä on helppo ratkaista muuttuja kerrallaan. [162-165]









Demotaan Matlabilla puhtaan kosinin näytteistämistä. Aja demosampling4.m

Okei, tämä toimii yhdelle kosinille, mutta käytännössä meillä on aina erikoinen signaali. Hmm.., voidaan ajatuksellisesti käyttää fourier-muunnosta, hajottaa mielivaltainen signaali yksitt, näytteistää kukin erikseen ja summata yhteen.

Entä käytännössä tuo vierastuminen...?

Tehtävä 3: näytteenottotaajuuden pitää olla vähintään kaksi kertaa korkein taajuus signaalissa. Kohdan 3d napanollakuviot tulevat vasta ensi viikolla luennolla (?). [167]. Matlab-demon avulla voi pohtia tuota pistelaskaria (e) eli kun 8 kilon kosini ja näytteistys 10 kiloa, niin minne kohtaa peruskaistaa 0..5 kiloa laskostuu?



Tiistaina 10.2. aika 1h30min meni: alkujorinat 5 min, ykkönen n 40 min, pistelaskari a-d 10 min, pistelaskari a:n ratkaisun läpikäynti, kakkonen n 20 min, matlab-demo 5 min, kolmosen alku 5 min. Englannin kieli / kaksikielinen esitys hidastutti? Lukuisia kysymyksiä, omaa häsläystä 1b:ssä, "kiire" lopussa.

Keskiviikkona 11.2. 1h15min: alkujorinat 5 min, ykkönen n. 25 min, pistelaskari a-d 10 min, kakkonen 15 min, kolmonen 5 min ja aliasingdemo 5 min. Vain muutama kysymys, muutama jäi laskemaan tehtäviä.

keskiviikko 4. helmikuuta 2009

Matlab #2 / R3 -kierros: mentaalinen malli

Tänä keväänä pidän kahdet samat paperilaskarit tiistaisin ja keskiviikkoisin. Tietokoneharjoituksia tuli ensimmäisellä kierroksella viidet ja nyt toisella neljät. Kun samoja tehtäviä on esittänyt ennenkin, on aika ihmeellistä että joka kerta löytyy jotain uutta. Hämmentävää itse asiassa. Eikä se johdu pelkästään siitä, että unohtaisi jotain yksityiskohtia.

Tämän viikon Matlab-laskareissa on ollut "yllättävän" vähän osallistujia. Kolmessa istunnossa vajaa 50, kun yhteen saliin mahtuisi 30. Lisäksi olen vähentänyt demojen määrää. Aikaa menee edelleen sama - tai toisinaan jopa enemmänkin kuin edellisinä vuosina. Rauhallisempi tahti antaa aikaa kysymyksille ja niitä myös esitetään.

Tällä viikolla on ollut kysymyksiä spektrin jaksollisuudesta ja symmetrisyydestä, mihin kuvittelen keksineeni jonkin sortin hyvän vastauksen. On ollut jälkipuintia "formanteista" (lisätehtävän F1, F2, F3) ja kuinka kiisseli.wav:n /i/:ssä on "hassuja, epämääräisen suttuisia" korkeita taajuuksia. Heitin aivan puhtaan arvauksen.

Millainen on hyvä demo? Kierroksella R3 päädyin jakamaan istunnon noin 13 ohjattuun keskeytykseen. Ne on kirjoitettu alla olevan tehtäväpaperin marginaaliin. Nämä lienevät peräisin minun mentaalisesta mallista signaalinkäsittelyn perusteista. Se ei ole samaa mitä ajattelen, vaan se, mitä saan itse lausuttua ulos. Nyt opiskelijat kokoavat itse oman tulkintansa siitä.








"Okei, aloitellaan DSP:n toiset tietokoneharjoitukset..."

ALKU

Tehtäväpapereita on tarjolla, lisäpistetehtäviä tarjolla, kuulokkeita lainaan tarjolla. Äänitiedosto kiisseli.wav löytyy kurssin www-sivulta. Yllätyin, kuinka monelle _ei_ ollut itsestään selvää, miten äänitiedosto luetaan selaimella (Explorer / Firefox) kotihakemistoon. Aika moni klikkasi vain vasenta hiiren nappia ja ihmetteli, kun QuickTime avautui selaimeen. Lisäksi Explorerin "Save Link as..." on jotenkin epäilyttävä - en minä linkin nimeä halua tallentaa. Firefoxissa sanotaan "Save Target as...".

Alussa pitää luoda myös oma alihakemisto kurssikertaa varten. Tämä sama hakemisto pitää muistaa lisätä myös Matlabin ikkunaan keskelle ylhäälle työhakemistoksi "Current directory".

"Sitten ei muuta kuin tekemään omassa tahdissa. Kysykää, jos tulee ongelmia tai punaista virheilmoitusta, ettekä pääse eteenpäin. Demoan pienissä paloissa ja tämä kestäänoin reilun tunnin ja vartin."

Aikataulu petti kaikilla kolmella kerralla himppa, mutta noin 1,5 tunnissa olin tyytyväinen. Tärkeintä on saada kontaktia, päästä "opiskelijan iholle". Tähän voi auttaa nimilistan kierrättäminen henkilökohtaisesti, jolloin kysyminen helpottuu.

STOP 01


Jankataan kurssin perusskeemaa: x -> h -> y ja analysointi aika- ja taajuustasossa, togglaus Fourierin/z/Laplacen avulla. Tällä kierroksella tehtävässä 1 generoidaan 400 Hertzin puhdas sinisignaali - Fourier-sarjan teoria keroo, että mikä tahansa jaksollinen signaali
voidaan esittää perustaajuuisen ja sen monikertaisten sinusoidien summana. Tehtävässä 2 taasen analysoidaan x[n]:ää perusskeeman mukaisesti aika/taajuus/aika-taajuusalueessa. Lopuksi tehtävässä 3 analysoidaan perusskeeman suodinta H, eli sitä järjestelmää, joka prosessoi syötettä tuottaen vasteen.

"Sitten tehtävä 1:n [M2057] kimppuun. Kirjoitetaan Matlabin editoriin, joka avautuu kirjoittamalla 'edit'."

Kirjoitan koodin aina S02-tagiin asti eli koodin ekat noin 10 riviä. Niin, että ne näkyvät kerralla editorissa ja voin myös saada kuvaajan näkyville. Matlabin editorissahan voi säätää fonttikoon kohdassa 'Preferences' - suuri fonttikoko näkyy takariville asti.

Joskus joku kysyy - hieman tuohtuneestikin - eikö koodia ole saatavilla valmiina jostain eli pitääkö se kirjoittaa itse? Itse kirjoittaessa on se hyvä puoli, että silloin tekee virheitä!
Väitän, että syntaksi ja komennot tulevat tutummiksi, kun ne joutuu itse näpyttelemään. Tietyt virheet ovat syntaksivirheitä, jolloin punainen virheilmoitus tulee Matlabin ruudulle. Jos älyää ruutua katsoa, ja jos älyää virheilmoituksen luonteen, niin voi korjata asian. Ikävämpiä ovat loogiset virheet. Kuten eräs opiskelija ihmetteli, miksi ei tullut haluttua kuvaajaa:

... t = 0 : 1000 / fT; ...

Tässä presedenssi on jakolaskulla, kun taas haluttiin oikeasti

... t = (0 : 1000) / fT; ...

Koodinhan voi toki kopioida PDF-paperista, jolloin joutuu vaihtamaan hipsukat.

STOP 02

Tässä vaiheessa on voinut kulua jo 20 minuuttia: jollakin on ollut ongelmia Matlabin käynnistämisen kanssa (SoftGrid-asennus? Matlab ei oikeasti löydy koneelta). Pitää vaan tsekata, että kaikki ovat aloittaneet eli saaneet Matlabin auki ja editorin auki ja tekstiä. Lähes kaikilla pitäisi olla tuo sinikäppyrä jo valmiina. Jos ei ole,

"Jos on ongelmia aloittamisen kanssa tai tulee punaista virheilmoitusta, niin räpylät pystyyn."

Okei, nyt meillä on ensimmäiset rivit koodia valmiina. Käytetään Matlabin 'cell mode' eli kaksi prosenttimerkkiä välilyönnin kera rytmittävän koodin lohkoihin, joita voi ajaa editorin vasemman yläkulman nappuloilla: "evaluate cell", "evaluate and advance", "evaluate all".










Sitten alkaa koodin esittely rivi kerrallaan. Tähän editorin rivinumerot ovat mukavat. Laserpyssyllä voi vahvistaa sanomaa. Näytteenottotaajuus: kuinka monta lukuarvoa yhden sekunnin aikana. Matlabin vektorinotaatio: tässä tulee väistämätön tarve päästä taululle ja piirtää taulukko, jossa sarakkeina indeksinumerot, t:n arvot ja y:n arvot.















plot-komento on "tyhmä"
: se vain yhdistää pisteparit (t_i, y_i) toisiinsa suorilla viivoilla

Okei, ollaanko nyt tyytyväisiä? Lisätään nuo kuvaajan kauneudet eli akselien nimet, ruudukko päälle (grid). Zoomata voidaan koodista käsin axis-komennolla. Ja kuva voidaan myös suoraan koodista tallentaa. Ja tietty pitää kuunnella sitä sini-ininää. Jep jep.

Tehtävässä 1 generoidaan 400 Hertzin puhdas sinisignaali. Aaltomuodon kuvaajasta näkee, että 0,01 sekuntiin sinissä on 4 jaksoa, värähdystä. Tällöin 1 sekuntiin osuu 400 jaksoa. Voidaan siis huomata, että koodi toimii loogisestikin oikein.

Tehtäviin kuuluu myös itse toteutettavia osia, jotka on merkattu "Task:".
Jos ei vastaääniä kuulu, istahdan ja kirjoitan demon lopun sekä puolitoista riviä tulevasta "Task":sta.

STOP 03

Eli kuluu puoli minuuttia kun kirjoitan lopun demokoodin ja kerron, että jos halutaan 16400 Hz mustilla palloilla, niin luetaan 'help plot'. Jos tuntuu, niin voin antaa valmiiksi, että k on musta ja o on pallo. Yleensä kello on jo niin paljon, että suurin osa on saanut ruudulle jo oikean kuvaajaan.

STOP 04

Kirjoitetaan koodi valmiiksi ja saadaan pallukat osumaan 400 Hz:n "jatkuvaan" käyrään. Kyse siis vierastumisesta (aliasing, folding): liian pieni näytteenottotaajuus suhteessa 16400 Hertzin signaaliin.













Tästä tietenkin kannattaa ottaa saman tien tuo koko näytteenottoteoreema puheeksi. Digitaalisessa maailmassa nähdään taajuudet vain puoleen näytteenottotaajuuteen asti. Spektri on jaksollinen näytteenottotaajuuksien monikertojen suhteen. Reaalisen signaalin spektri on symmetrinen. Tulee laskettua myös normalisoidut kulmataajuudet ja niille huomataan omega_1 = 0.05 pi ja omega_2 = 2.05 pi = 0.05 pi + 2 pi. Muistutellaan tuosta 2pi-jaksollisuudesta.















Kosinipyöritys x[n] = cos(omega n) sai porukan hiljaiseksi. Onhan se oudon näköistä, että yhtäsuuruus on olemassa, mutta roikkuu tuosta n:stä ja sen kokonaislukumaisuudesta.

(pitää muistaa olla hätäilemättä e71:n kanssa, tulee helposti tärähtäneitä kuvia; lisäsin tämän taulun kuvaajat osin tuohon tehtäväpaperin Page 2 / 4 ylälaitaan)

"Tuleeko mieleen kysyttävää tästä ekasta tehtävästä?"

Kun fT=16000 eli fT näytettä sekunnissa ja kun taajuus 400, niin yhdessä jjaksossa 40 näytettä. Jos taajuus 16400, niin noin yhdellä näytteellä yritettäisiin esittää koko sinin jakso. Ei onnistu! Shannon sanoo, että riittää vähän yli 2 näytettä per jakso. Miten kummassa niinkin harva riittää...?

Sitten siirrytään tehtävään 2. Kirjoitan koodia aina tagiin S05-asti.

STOP 05

Nyt on saatu näytölle piirrettyä tuo aikatason käppyrä. Käydään Matlabin komentoikkunasta painamassa "fs", "nbits", "2^8" ja "M", jotta saadaan selitettyä nuo lukuarvot. Kvantisointitasoja jonkin kerran demosin "linspace(-1, 1, 256)":lla, mutta en tiedä, osuiko vai upposiko.














Tästä päästään näytteenottotaajuuksiin, signaalin pituuteen sekunneissa, joka selvitetään tuon janan avulla.

Tulostetaan näytölle x:n arvot, jotta varmistutaan, että ääni on vain numeroarvoja tietokoneessa. Selitetään, että nyt meillä (t, x) pareja tuo 29001 kappaletta. Pisteet piirretään plot-komennolla ja yhdistetään suoralla viivalla toisiinsa. Kuunnellutetaan tuota kiisseliä, kiisseliä, kiisseliä... Kuvaajasta näkyy /k/, /i/ ja /s/ sekä loppuosa. Tässä vaiheessa esittelen piirrosikkunan suurennuslasitoiminnon (unohdin paluun oikealla hiirellä) ja zoomaan /i/ ja /s/ (kuvassa piirretty erikseen omiin ikkunoihin, ei tapahdu demokoodissa).













Tässä taulukuvassa olen tähän mennessä piirtänyt vain vasemman yläosan, jossa signaalin pituudeksi saadaan noin 1,3 sekuntia.

Sitten kirjoitetaan koodi S06-tagiin asti.

STOP 06

Nyt vuorossa koodin tarkastelua DFT:n osalta. Tarkistan että sekä x että xF ovat molemmat 29001 merkkiä pitkiä, mutta kun x on reaalinen niin xF(1:5) osoittaa xF:n olevan kompleksiarvoinen. Saatu kuvaaja on symmerinen fs/2:n suhteen.














Tässä siis en ole vielä zoomannut sitä "peruskaistalle".

Selitän lyhyesti logaritmin ottamisen ja siten päätymisen desibeliskaalalle. Edellisinä vuosina tässä kohdassa on piirretty pelkkää abs ja log-absia, nyt ei sekoitettu sillä asialla soppaa.

Ihmetellään myös taululla tuota spektrin symmetrisyyttä ja jaksollisuutta. Ainakin cos(0.05 pi n) = cos(0.05 pi n + 2 pi n) = cos(2.05 pi n) on minulle ihan luonnollinen yhteys, kun n on kokonaisluku.

Ajan tuon axis-rivin ja päädyn STOP 07 -tagiin.


















STOP 07

Nyt siis "peruskaistalle" zoomattuna. Kirjoitan perään sitten spektrogrammikoodin S08:aan asti.















STOP 08

Spektogrammi, Short-Time Fourier Transform (STFT). Otetaan rinnan kuvat 1 ja 3, joissa molemmissa x-akselilla aika. Spektrogrammissa x-akselilla siis aika, y-akselilla taajuus ja z-akselilla kunkin taajuuskomponentin voimakkuus kunakin ajanhetkenä. Huomataan että /i/ ja /s/ erottuvat spektrogrammissa.














Esitetään vielä ajatus, miten äänisignaali pilkotaan pieniin ikkunoihin, joista lasketaan Fourier-muunnokset, jotka yhdistetään spektrogrammiksi: signaalin x[n] osa -> spektri -> osaksi spektrogrammia.











STOP 09

Jatketaan jutustelua tehtävän 2 "Task":n perusteella. Suurin osa on näistä käyty, joten kerrataan. Miksi kuvaaja 2 ei ole mielekäs? Fourier-analyysissä signaalin pitää olla stationäärinen, jotta saadaan järkeviä lopputuloksia. Näin olleen puheäänen osalta päädytään noin 20-50 ms ikkunoihin, joiden sisällä taajuussisältö pysyy varsin muuttumattomana. Kun tässä demossa laskettiin fft(x) koko x:stä, niin silloin todellakin laskettiin DFT koko pätkästä, jolloin /i/:t ja /s/:t menevät "sekaisin" amplitudispektrin (Figure 2) kuvassa.

Tässä vaiheessa uskottava breikki:

"Onko kysymistä tehtävien 1 ja 2 suhteen? Perusskeemassa ne olivat sekvenssin x[n] syntetisointia ja analysointia. Tehtävässä 2 niin aika-, taajuus- kuin aika-taajuustasossa."

Nyt voi olla kello jo aika paljon, joten mennään ripeästi tehtävään 3.

STOP 10

Esitetään mahdollisimman yksinkertainen suodin. Tällainen on kahden pisteen liikkuva keskiarvoistava suodin (MA-2). Käytän esimerkkinä päivittäisiä lämpötilamittauksia ja niistä saatavaa keskiarvojonoa.










Kirjoitetaan sitten koodi S11-tagiin asti. Tein tässä niin, että editorissa jaoin ikkunan ala- ja yläikkunaan. Alas kirjoitin ma2.m-funktion, mutta jätin aluksi for-loopin toteutuksen kirjoittamatta. Yläikkunaan tulee koodi S11-tagiin asti.

STOP 11A

Selitetään vielä, miten Matlabin funktio toimii. Aliohjelmakutsu, johon tulee x sisään, funktio laskee jotain mielekästä ja palauttaa y:n.









STOP 11

Kirjoitettiin aliohjelmaan for-loopin sisälle toteutus. Käydään tuo ohjausrakenne läpi: for-silmukka tehdään 29000 kertaa. Ei tehokasta, mutta brute forcella halutaan esittää, että näin se lasketaan!

Havaitaan nyt, että musta katkoviivakäyrä on /i/:ssä lähes ennallaan, mutta /s/:ssä voimakkuus on selkeästi pudonnut. Tässä jälleen erikseen piirretty (ei demotilanteessa) zoomaukset sekä /i/ että /s/.















STOP 12

Kirjoitettiin suotimen analysoinnin koodit S12-tagiin asti. Ajetaan ja saadaan alipäästösuotimen magnitudivaste: pidetään matalat taajuudet (/i/) sellaisinaan mutta vaimennetaan korkeita taajuuksia (/s/) eli nopeasti värähteleviä.





















Tämän tehtävän "Task":a ei ehditty yhdelläkään esitellä tarkemmin kuin vain sanomalla, että voidaan laskea vaikkapa seitsemän vierekkäistä pistettä yhteen ja jakaa 7:llä.

LOPPUSANAT


"Tänään...". Kertaus on opintojen äiti. Kerrataan pääkohdat. Suhteutetaan tehtäväpaperin Page 4/4 :n perusskeemaan.

"Ensi viikolla jälleen paperilaskarit. Olen täällä vielä hetken aikaa paikalla, jos haluatte kysyä näihin tai muihin tehtäviin liittyen tai jos jäi koodiin virheitä, jotka pitää korjata."

Yleensä tähän vipuun jää joku. Yleensä parhaimmat keskustelut tulevat esiin silloin, kun kaikki pakkaavat tavaransa lähteäkseen. Vedetään pipo päähän ja takin vetoketju kiinni.

Mentaalinen malli?

Miksi tämä kaikki selvittäminen? Ymmärrän, ettei kukaan muu voi opettaa samalla tavalla kuin minä enkä minä opeta samalla tavalla kuin joku muu. Kirjallinen materiaali on hyvä olla olemassa, jolla opetustietoa voi jakaa. Mutta toinen opettaja käsittelee nämä tehtävät omalla tavallaan.

Perfektionistiset piirteet eivät ole hyväksi. Parempi tyytyä vähempään ja tehdä muuten laadukkaampaa tulosta.