Ensimmäisen tunnin aiheena oli 1-bittinen D/A-muunnos, jonka tavoitteena on yksinkertaistaa analogiapuolta äärimmilleen kvantisoimalla D/A-muunnettava signaali 1-bittiseksi. Ratkaisusta käytetään nimeä kohinanmuokkaus, englanniksi noise shaping tai sigma delta modulation. Kvantisointi onnistuu äänenlaatua heikentämättä, kun nostetaan näytteenottotaajuus ensin riittävän suureksi. Tällöin näytteiden suuri määrä kompensoi niiden heikkoa tarkkuutta. Pelkkä ylinäytteistys ei kuitenkaan vielä riitä: ilman muita temppuja näytteenottotaajuus pitäisi nostaa jopa miljardikertaiseksi, mikä ei käytännössä ole mahdollista. Siksi täytyy ottaa käyttöön alla olevan lohkokaavion mukainen takaisinkytkentä, joka aiheuttaa kvantisointivirheen siirtymisen korkeammille taajuuksille.
Korkeilla taajuuksilla kohina ei haittaa, koska se voidaan erottaa hyötysignaalista analogisella alipäästösuodatuksella D/A-muunnoksen jälkeen. Jäljelle jäävän kvantisointikohinan määrä voidaan laskea, ja havaitaan että suuruusluokassa 1500 oleva muunnoskerroin riittää (miljardien sijaan). Ratkaisua voidaan edelleen tehostaa tarkastelemalla korkeampiasteisia kohinanmuokkaimia, jotka siirtävät vieläkin tehokkaammin kvantisointikohinaa korkeammalle.
Jotkin audioformaatit kuten Super Audio CD tallentavat äänen suoraan yksibittisenä. Tästä on etuna se, että kohinanmuokkaus täytyy tehdä vain kerran äänitysstudiossa eikä jokaisessa kuluttajalaitteessa erikseen.
Toisella tunnilla käsiteltiin kappale signaaliprosessoreista. Tärkeimmät syyt niiden käyttöön ovat yksinkertaisuus, halvempi hinta sekä pienempi virrankulutus (ks. esim TI). Kuitenkin niistä saa riittävästi tehoa signaalinkäsittelyn tarpeisiin, koska alan tarvitsemat operaatiot (kertolasku, yhteenlasku) ovat nopeita sekä rinnakkaisia. Esimerkiksi FIR-suodatuksen tai kompressiossa käytettävän kaksiulotteisen DCT:n tarvitsemat kertolaskut ja yhteenlaskut voidaan pistetuloina laskea rinnakkain ns. MAC-operaation avulla. Vastaavia operaatioita on nykyisin myös tavallisissa prosessoreissa, ja ensimmäinen tällainen laajennus oli Intelin MMX-käskykanta vuodelta 1997.
Kahden viikon päästä olevissa viikkoharjoituksissa koodataan FIR-suodin luokan TC303 signaaliprosessoreille. Olennaisimmat vaiheet olivat:
- Suodin suunniteltiin Matlabin fir1-rutiinilla.
- Kertoimet kopioitiin C-koodiin.
- C-kieliseen pohjaan kirjoitettiin for-silmukka, jossa kertoimet käydään läpi.
- Ulostulonäyte kirjoitetaan D/A-muuntimelle.
Aivan toisen tunnin loppupuolella luotiin katsaus GPU-laskentaan ja sen sovelluksiin koneoppimisessa. GPU on keskeinen työkalu esim. syvien neuroverkkojen opetuksessa, ja mm. GPU-valmistaja Nvidialla on oma DNN-kirjastonsa. Aiheesta lisää hahmontunnistuksen yhteydessä.
Myös Matlabissa on GPU-tuki. Seuraava koodinpätkä kertoo matriisit A ja B keskenään GPU:lla:
tic();
A = gpuArray(rand(2000, 2000));
B = gpuArray(rand(2000, 2000));
C = A * B;
elapsedTime = toc();
disp(['Matriisikertolaskuun kului ', num2str(elapsedTime), ' sekuntia.'])
A = gpuArray(rand(2000, 2000));
B = gpuArray(rand(2000, 2000));
C = A * B;
elapsedTime = toc();
disp(['Matriisikertolaskuun kului ', num2str(elapsedTime), ' sekuntia.'])
Käyttö on siis helppoa: funktio gpuArray() siirtää matriisin GPU:lle, jonka jälkeen laskenta toimii kuten muutenkin.
Omalla kannettavallani (Intel i7 + Nvidia NVS 5200M) GPU-versio on noin 4 kertaa nopeampi kuin CPU-versio (joka saadaan poistamalla gpuArray-funktio).

Ei kommentteja:
Lähetä kommentti