Tänään tutustuttiin suodinsuunnitteluun ikkunamenetelmällä. 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. Matlabissa tällainen kuvaaja saadaan esim. komennoilla:
Tälle suotimelle laskettiin vaihevaste myös analyyttisesti taululla.
Freqz-funktiosta saa siis ulos taajuusvastefunktion arvoja vektorissa H.
Vektorissa on lueteltu taajuusvasteen kompleksiset lukuarvon 512:ssa
pisteessä taajuusakselilla.
Amplitudivasteen osalta tavoitteena on saada vaste 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. Oikealla olevan kuvan mukaisen demottiin, 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. 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. Oikealla olevasta kuvasta nähdään, 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ä.
Tänään käsiteltiin suotimen analysointi (kappale 4) melkein loppuun.
Menetelmässähän ratkaistaan ensin impulssivaste, sitten siirtofunktioja 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.Vaihevaste puolestaankertoo paljonko eri taajuudet viivästyvät suodatettaessa.
Amplitudivastetta tarkasteltaessa on kätevämpi käyttää desibeliasteikkoa,
joka on logaritminen. Logaritmi tekee kertolaskusta yhteenlaskua, ja
korostaa lähellä nollaa olevia eroja, jotka molemmat ovat meille käteviä
ominaisuuksia.
Kappaleen 4 kaksi
viimeistä lukua käytiin läpi ratkaisemalla kevään 2009 lokakuun tentin
tehtävä 3. Tässä tehtävässä on annettu suotimen yhtälö, josta täytyy
ratkaista siirtofunktio, piirtää napa-nollakuvio sekä päätellä
stabiilisuus. Maanantaina ratkaistaan vielä löydetyn siirtofunktion arvo taajuudella 2500 Hz (tentin bonustehtävä).
Luennolla nähtiin demo, jossa tutkittiin taajuusvasteen visualisointia alemman animaation
mukaisesti. Vasemman yläkulman kuvaajassa ovat kaikki termit exp(-iwk),
jotka on kerrottu suotimen kertoimilla oikean yläkulman kuvassa (siis
h(k)exp(-iwk)). Näiden summa vektoriesityksenä on puolestaan vasemmassa
alakulmassa, jonka etäisyys origosta (amplitudivaste) on kuvattu
alaoikealla.
Tänään tarkasteltiin Z-muunnosta ja sen tärkeimpiä
ominaisuuksia. Z-muunnoksen avulla voidaan selvittää mm. suotimen
stabiilisuus: suodin on stabiili jos kaikki siirtofunktion navat ovat
yksikköympyrän sisäpuolella.
Tässä yhteydessä tutkittiin myös napa-nollakuvion ja taajuusvasteen suhdetta. Tästä nähtiin alla olevan kuvan
mukainen demo, jossa hiirellä voidaan sijoitella napoja ja nollia
yksikköympyrälle. Alimpaan kuvaan piirtyy jokaisen klikkauksen jälkeen
suotimen amplitudi- ja taajuusvasteet; niin että jokainen nolla aiheuttaa sakaran alaspäin ja jokainen napa huipun ylöspäin.
Opiskelimme myös Z-muunnoksen laskentaa esimerkkisignaalien tapauksessa. Erityisesti keskityimme prujun esimerkkisuotimen analyysiin: johdimme Z-muunnoksen suotimen yhtälöstä, ja jatkoimme taajuusvasteen, amplitudivasteen ja vaihevasteen laskentaan.
Tänään tarkasteltiin Fourier-muunnoksen ominaisuuksia, sovelluksia sekä nopeaa toteutusta. Luennon
aluksi käytiin läpi v. 2016 elokuun tentin tehtävä 2b, jossa
laskettiin käsin neljän mittainen Fourier muunnos (ks. myös videon
esimerkki).
Seuraavaksi tutustuttiin Fourier-muunnoksen käyttöön alkeellisessa puheentunnistimessa. Kirjan Elements of statistical learning kappaleen
5.2.3 inspiroimana toteutin Matlab-skriptin, joka löytää S-kirjaimet mikrofonin taltioimasta puheesta. Menetelmä on nimeltään logistinen regressio,
joka monimutkaisista kaavoista huolimatta on varsin yksinkertainen
toteuttaa: menetelmä etsii kertoimet kullekin Fourier-muunnoksen
taajuudelle, ja laskee tulokset yhteen. Tuloksen perusteella saadaan todennäköisyys kummallekin luokalle: "S" ja "ei-S".
Menetelmää
demottiin Matlab-toteutuksella, jossa luokittelija opetettiin
erottamaan S-äänne muista äänteistä näyttämällä luokittimelle
esimerkkejä kahteen luokkaan kuuluvista Fourier-muunnoksista. Menetelmä
toimi kohtalaisen hyvin ottaen huomioon opetusaineiston erot
testiaineistoon. Matlab-koodi löytyy alta. Esimerkki
kuvaa hyvin tämän päivän signaalinkäsittelyalgoritmia: perusmenetelmiä
(Fourier-muunnos, konvoluutio, jne.) käytetään piirregeneraattoreina,
jotka tuottavat hieman parempaa raakadataa kuin suora mittaussignaali
(esim. taajuustietoa eikä raakaa mittausdataa). Laskettujen piirteiden
perusteella sitten nostetaan tiedon abstraktiotasoa edelleen.
Esimerkiksi äänteen tunnistuksessa hierarkia on esimerkiksi seuraava: 16000 aikatason näytettä -> 128 taajuustason kerrointa -> 1 bitti, joka kertoo kumpi äänne on kyseessä Tämän
jälkeen siirryttiin tarkastelemaan Fourier-muunnoksen ominaisuuksia.
Ominaisuuksista tutustuttiin lähemmin siirtoon ajassa (esim. laske
signaalin x(n+20) muunnos, kun tiedetään x(n):n muunnos) sekä konvoluution muunnokseen (DFT muuntaa konvoluution kertolaskuksi, eli x(n)*y(n) -> X(n)Y(n)). Aivan luennon lopussa mainittiin yhteys ns. dekonvoluutioon
joka on konvoluutiolle käänteinen operaatio. Menetelmää käytetään muun
muassa matkaviestinnän siirtotien häiriöiden korjaukseen sekä Hubble-teleskoopin alkuaikoina,
jolloin yhdessä peilissä olleen hiontavirheen vuoksikuvat olivat
sumuisia. Kuvantamisprosessia voidaan nimittäin mallintaa
(kaksilulotteisella) konvoluutiolla
y(n,m) = h(n,m) * x(n,m),
missä x on todellinen näkymä, y on havaittu sumuinen kuva, ja h on linssin impulssivaste (nk. point spread function; PSF). Yhtälössä y ja h ovat tunnettuja, ja tehtävänä on ratkaista x. Ratkaisu löytyy taajuustasossa, koska
Y(n,m) = H(n,m) X(n,m),
joten (Matlabin syntaksilla ilmaistuna):
x(n,m) = ifft (Y(n,m) ./ H(n,m)).
Dekonvoluutiosta on hyötyä yleisemminkin lineaarisen kanavan aiheuttaman häiriön poistossa. Jos tiedetään signaalin x kulkeneen kanavan h läpi, voidaan vastaanotetusta mittaustuloksesta y päätellä x, jos meillä on joku käsitys kanavasta h. Esimerkkinä tästä on esim.mainittu langattoman tiedonsiirtokanavan estimointi ja sen aiheuttaman vääristymän kompensointi.
Toinen menetelmän tuottama etu on että Fourier-muunnoksen (käytännössä FFT:n) avulla voidaan laskea konvoluutio kaavasta (Matlabin syntaksilla ilmaistuna):
conv(x,y) = ifft(fft(x) .* fft(y))
Lisäksi käsiteltiin nopeaa Fourier-muunnosta eli FFT:tä,
joka on vain nopeampi tapa toteuttaa diskreetti Fourier-muunnos (DFT).
FFT perustuu signaalin jakamiseen lyhyempiin pätkiin, jotka muunnetaan
jakamalla ne edelleen rekursiivisesti kahtia. Rekursio päättyy, kun
muunnoksen pituus on 1, jolloin muunnosta ei tarvitse enää tehdä.
1-ulotteisen vektorin tapauksessa muunnosmatriisi on yksinkertaisesti F =
[1], joka tarkoittaa pelkkää ykkösellä kertomista eikä sitä tarvitse
tehdä. Lyhyemmistä vektoreista saadaan koostettua pidemmät vektorit
kaavoilla (3.3) ja (3.4).
Alla on vielä luennon esimerkkikoodi S-kirjaimen tunnistuksesta. Funktio käyttää Stanfordin yliopistossa kehitettyä glmnet-pakettia. Jos näiden asennus on haastavaa, Matlabissa on nykyään myös valmis glmfit-funktio.
function vokaalin_tunnistus()%% Esimerkki vokaalin ja S-kirjaimen erottelusta äänisignaalista.% heikki.huttunen@tut.fi -- 4.2.2015%
close alladdpath/home/hehu/Documents/Libraries/glmnet_matlab/% Ladataan opetusaineisto:[x, Fs]= audioread('seiska.wav');[X, H, numFrames]= extractFeatures(x, Fs);
title ('Merkitse S-kirjaimet hiirella');
isConsonant =zeros(numFrames, 1);while true
[x1, y1]= ginput(1);[x2, y2]= ginput(1);if x1 > x2
xt = x1;
x1 = x2;
x2 = xt;end
isConsonant(round(x1 * numFrames):round(x2 * numFrames))= 1;
response = questdlg('Jatketaanko annotointia?',...'Kysymys',...'Kyllä','Ei','Kyllä');if strcmp(response,'Ei')breakendend
cvob2 = cvglmnet(X, isConsonant,'binomial',[],'class');
yHat = glmnetPredict(cvob2.glmnet_fit, X, cvob2.lambda_min,'response');
coefficients = H * cvob2.glmnet_fit.beta(:, cvob2.lambda == cvob2.lambda_min);figure()subplot(211)plot(yHat);
ylabel('S-kirjaimen TN')subplot(212)stem(coefficients)
response = questdlg('Valmiina tunnistamaan?',...'Tunnistus',...'OK','OK');while true
close all
myRecObj = audiorecorder(Fs, 16, 1);
recordblocking(myRecObj, 2);
y = getaudiodata(myRecObj);
X = extractFeatures(y, Fs);
yHat = glmnetPredict(cvob2.glmnet_fit, X, cvob2.lambda_min,'response');figure()plot(yHat);
response = questdlg('Jatketaanko tunnistusta?',...'Kysymys',...'Kyllä','Ei','Kyllä');if strcmp(response,'Ei')breakendendendfunction[F, H, numFrames]= extractFeatures(x, Fs)[~,f,t,S]= spectrogram(x, 256, 128, 256, Fs,'yaxis');
surf(t, f, 10*log10(abs(S)),'EdgeColor','none');axis xy;axis tight;colormap(jet); view(0,90);
S =log10(S)';
H =[];
n =(1:size(S, 2))';for k = 0:3
H =[H, n.^k];end
F = S * H;
numFrames =size(S, 1);end
Luennon
aluksi käsiteltiin kappale 2 loppuun. Tällöin tutustuttiin konvoluution
ominaisuuksiin (laskentasäännöt: a(b+c) = ab+ac, kausaalisuuden ja
stabiilisuuden tunnistus impulssivasteesta, jne.). Konvoluution
ominaisuuksien käsittelyn yhteydessä tuotiin esille niiden yhteys
LTI-järjestelmien yhdistämiseen: peräkkäiset tai rinnakkaiset
LTI-järjestelmät voidaan esittää yhtenä järjestelmänä ja toisaalta
niiden järjestys ei vaikuta lopputulokseen.
Kappaleen lopussa määriteltiin FIR- ja IIR-suotimet
LTI-järjestelmien alalajeina. FIR-suotimet ovat yksinkertaisuutensa
vuoksi laajemmin käytettyjä, mutta IIR-suodinten ilmaisuvoima ja
laskennallinen tehokkuus tekevät niistä hyödyllisiä useissa tilanteissa. Testikysymys: onko seuraava suodin FIR vai IIR?
Haastavampaa on selvittää esim. se, onko yo. suodin stabiili. Tähän ratkaisu löytyy prujun sivulta 68, johon pääsemme aikanaan.
Toisella tunnilla päästiin kappaleeseen 3: Fourier-muunnos.
Olennaisin asia käsitteli muunnoksen ideaa alla olevan kuvan
mukaisesti. Fourier-muunnoksen idea on kysyä paljonko eri taajuuksia
annetussa signaalissa on. Taululla oli alla olevan piirroksen kaltainen
kuva. Kuvan "yhtälössä" vasemmalla oleva signaalin pätkä jaetaan eri
taajuuksiin kysymällä paljonko tarvitaan vakiotaajuutta (0.3 kpl),
paljonko kerran värähtävää siniä (0.6 kpl), jne. Sama idea on kaikkien
neljän muunnostyypin takana, mutta erona on montako eri taajuutta
tarvitaan muodostamaan alkuperäinen signaali. Joissain tapauksissa niitä
tarvitaan äärettömän paljon, jolloin kuvan summan sijaan tarvitaan
integraali.
Jatkuvat tapaukset perustuvat siis integraalin laskentaan, ja käytännössä tämä täytyy tehdä muunnostaulukoidenavulla.
Tarkkaan
ottaen yllä olevan kuvan sinisignaalit eivät riitä esittämään kaikkia
mahdollisia signaaleita: lisäksi tarvitaan mahdollisuus viivästää tai
edistää eri taajuuksia. Tämä onnistuu laajentamalla taajuuksien kokoelma
kompleksiksi eksponenttisignaaleiksi: exp(ix) = cos(x) + i sin(x).
Kompleksinen eksponenttifunktio on oheisen kuvan mukainen, eli sen
reaaliosa ja imaginaariosa värähtelevät samalla taajuudella.
Käsin laskettavien kolmen ensimmäisen muunnostyypin jälkeen tutustuttiin lopuksi diskreettiin Fourier-muunnokseen, joka voidaan esittää matriisimuunnoksena. Muunnosmatriisi muodostetaan lisäämällä rivi kerrallaan ykkösen n:nnen juuren eri
potensseja. Lopuksi esitettiin tällaisen matriisin konstruointi yksikköympyrän avulla tapaukselle N = 4.
Kurssin toisella luennolla luotiin ensin katsaus muutamaan
signaalinkäsittelyn alan tunnettuun sovellukseen: kompressio,
puheentunnistus, puheen välitys digitaalisesti, jne.
Kappaleen 2 alussa käsitellään usein käytettyjen jonojen
perusmääritelmät ja lohkokaavioiden perusoperaatiot: yhteenlasku,
skalaarilla kertominen sekä viivästys. Näiden avulla voidaan esittää
kaikki tämän kurssin suotimet. Kurssilla tarkastellaan lineaarisia ja
aikainvariantteja suotimia, jotka voidaan esittää konvoluution avulla, toisin sanoen painotettuna keskiarvona N:stä viimeksi sisään tulleesta näytteestä. Konvoluutiosta nähtiin oheisen kuvan mukainen demo.
Kuvassa
ylimpänä on suodatettava signaali, joka etenee vasemmalta oikealle.
Jokaisen uuden näytteen saapuessa (kuvan ulkopuolelta vasemmalta)
kerrotaan punaisella merkityt näytteet kuvan keskellä keskellä olevilla
kertoimilla. Näin saadut tulot lasketaan yhteen ja sijoitetaan tulos
alla olevan kuvan punaisella merkityksi uusimmaksi vastearvoksi.
Tämän
jälkeen jatkettiin teoreettisemmalla asialla, eli kappaleen 2.2
diskreettien järjestelmien ominaisuuksilla. Näistä lineaarisuus ja
aikainvarianssi ovat ne perusominaisuudet jotka otetaan myöhemmän
tarkastelun lähtökohdaksi. Myös stabiilisuus on kriittinen ominaisuus,
koska epästabiililla suotimella ei tee mitään.
Kappaleessa 2.3 tarkastellaan LTI-järjestelmiä, eli järjestelmiä jotka ovat lineaarisia ja aikainvariantteja. Kappaleen alussa osoitetaan, että LTI-järjestelmät voidaan esittää konvoluutionavulla
(josta on esimerkki yo. kuvassa). LTI-järjestelmän hieno ominaisuus on,
että sen impulssivaste määrää vasteen mille tahansa herätteelle.
Esimerkkinä tästä tutustuttiin demoon, jossa impulssivaste oli saatu
lyömällä käsiä yhteen kirkossa (ts. generoimalla impulssi) ja
mittaamalla vaste, josta kaiku oli
selvästi kuultavissa. Näin saatua impulssivastetta voidaan käyttää
mallina tilan akustisista ominaisuuksista, ja myös kotivahvistinten tilaefektit (hall, arena, club, jne.) on toteutettu tällä periaatteella. Mallia testattiin laskemalla konvoluutio seiska-testisignaalin ja kyseisen impulssivasteen kesken. Tulos kuulosti kuin testisignaali olisi viety kirkkoon.
TL;DR: Impulssivaste sisältää kaiken tiedon LTI-järjestelmästä, ja konvoluutiolla saadaan vaste mille tahansa signaalille.
Kurssin SGN-11000 kulkua voi seurata luentojen ja harjoitusten lisäksi kurssiblogissa. Blogissa on kahdenlaisia merkintöjä:
Videoblogi, joka ilmestyy aina ennen luentoa ja esittelee tiivistelmän luennon asioista.
Tekstiblogi, johon täydennetään kunkin luentokerran jälkeen keskeisimmät luennolla tulleet asiat.
Alla ensimmäinen videoblogimerkintä.
---
Tänään luennolla käsiteltiin kurssin hallinnolliset asiat sekä luentomonisteen kappaleet 1.1 ja 1.2.
Ensimmäinen tunti käytettiin hallinnollisiin asioihin ja aihepiirin yleiskatsaukseen.
Toisella tunnilla varsinaista asiaa alustettiin puhumalla A/D-muunnoksesta, digitaalisista signaaleista, digitaalisista suotimista sekä Fourier-muunnoksesta. Matlab-esimerkkinä tarkasteltiin erästä testisignaalia (seiska.wav) Matlabilla, ja todettiin, että oikealla olevassa spektrogrammissa näkyvät selvästi eri äänteet.
Ensimmäisenä varsinaisena asiana käsiteltiin näytteenottoteoreema, jonka mukaan naytteistämisessä ei häviä informaatiota, jos näytteenottotaajuus on vähintään tuplat signaalin korkeimpaan taajuuteen nähden. Käytännössä ennen näytteistystä täytyy siis poistaa liian korkeat taajuudet analogisella suotimella ettei laskostumista pääsisi tapahtumaan.
Audiossa tapahtuvaa laskostumista verrattiin videokuvaan, jossa esimerkiksi kärrynpyörä saattaa näyttää pyörivän väärään suuntaan. Youtubesta löytyy useita videoita hakusanalla Wagon wheel effect; esim. tämä. Sääntö on tässäkin tapauksessa sama: kuvia pitää ottaa vähintään kaksi per kierros.
Termi laskostuminen viittaa taajuusakselin laskostumiseen. Tässä yhteydessä kaikkien laskosten energiat summautuvat yhteen jäljelle jäävälle taajuuskaistalle. Ilmiötä havainnollistettiin laskostamalla piirtoheitinkalvo, jossa oli erään signaalin spektrogrammi.
Laskostunut signaali.
Näytteenottoteoreema liittyy myös peleissä käytettyyn ns. antialiasing-tekniikkaan. Myös tällöin lähtökohtana on äärettömän tarkka virtuaalinen malli, josta joudutaan ottamaan näytteitä esim. 1920 x 1200 monitoria varten. Tällöinkin kuvan sisältämät korkeat taajuudet laskostuvat ja muodostavat ns. Moire-ilmiön. Tästäkin päästään eroon suodattamalla signaali alipäästösuotimella ennen näytteistystä (eli poistamalla laskostuvat taajuudet).
TL;DR: jos näytteitä otetaan Fs kpl sekunnissa, täytyy tätä ennen poistaa yli Fs/2 Hz taajuudet.