Tänään
tarkasteltiin äärellisen sanapituuden vaikutuksia. Tarkastelimme ensin
mallia, jolla johdettin arvio AD-muunnoksen kvantisointivirheen
varianssille, joka on suoraan verrannollinen syntyvän
kvantisointivirheen tehoon. Tätä kautta määritellään SNR,
eli signaali-kohinasuhde, eli häiriöetäisyys. Tämä suure kertoo jotain
äänenlaadusta, ja saatavia tuloksia tullaan tarvitsemaan kappaleessa 9,
kun päätellään montako bittiä signaalista uskalletaan poistaa
kompressiossa ilman äänenlaadun havaittavaa heikkenemistä.
Jos ehtojen oletetaan olevan voimassa, voidaan osoittaa kohinan odotusarvon olevan nolla ja varianssin yhtä kuin 2^(-2b) / 12.
Yllä
olevaa kaavaa voidaan edelleen jalostaa signaali-kohinasuhteen
käsitteeksi (SNR), joka kertoo signaalin tehon suhteessa kohinan tehoon.
Kun kaavaa pyöriteltiin, havaittiin jokaisen ylimääräisen bitin (per
näyte) nostavan SNR:ää kuudella desibelillä.
SGN-11000 kurssiblogi 2020
torstai 2. huhtikuuta 2020
Luento 30.3.: IIR-suotimet
Kappaleessa 6 esitetään
menetelmiä IIR-suodinten suunnitteluun, ja ne käydään melko
yleisellä Matlab-komentojen osaamisen tasolla. Kappaleen ydin on koottu
monisteen taulukkoon, jossa suodintyyppejä vertaillaan amplitudivasteen
ominaisuuksien ja kertoimien määrän suhteen. Kertoimia tarvitaan eri
menetelmillä 29+28, 13+12 ja 8+7 kappaletta.
Suurin määrä tulee Butterworth-suotimella ja pienin elliptisellä
suotimella. Kahden Chebyshev-suotimen kerroinmäärä on näiden kahden
ääripään välissä. Vertailun vuoksi FIR-suotimen kertoimien määrä
vastaavilla vaatimuksilla olisi N = [5.5/0.035] = 159 käytettäessä
Blackman-ikkunaa.
Muita esiin tulleita seikkoja olivat mm.
Matlabin kerroinvektorit a ja b eivät ole suoraan käytettävissä ulostulon y(n) laskennassa, vaan takaisinkytkentäkertoimien (siis esim. termin y(n-1) kertoimen) merkki täytyy vaihtaa vastakkaiseksi.
Muita esiin tulleita seikkoja olivat mm.
- Elliptisellä suotimella on aina vähemmän kertoimia kuin muilla. Lisäksi tasavärähtely-ominaisuus on yleensä hyvä asia.
tiistai 24. maaliskuuta 2020
Luento 24.3. Suodinsuunnittelu
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:
>> [H,W] = freqz([1, 1, 1]);
>> plot(angle(H));
>> grid on
Freqz-funktiosta saa siis ulos taajuusvastefunktion arvoja vektorissa H. Vektorissa on lueteltu taajuusvasteen kompleksiset lukuarvon 512:ssa pisteessä taajuusakselilla.
Vaihevasteen 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.
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. 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ä.
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:
>> [H,W] = freqz([1, 1, 1]);
>> plot(angle(H));
>> grid on
Freqz-funktiosta saa siis ulos taajuusvastefunktion arvoja vektorissa H. Vektorissa on lueteltu taajuusvasteen kompleksiset lukuarvon 512:ssa pisteessä taajuusakselilla.
Vaihevasteen 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.
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. 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ä.
Luento 23.3. Suotimen analyysi
Tänään
käsiteltiin suotimen analyysikappale loppuun. Opimme analysoimaan
FIR-suotimen taajuuskäyttäytymisen ja näimme Z-muunnoksen,
taajuusvasteen, amplitudivasteen ja vaihevasteen yhteyden toisiinsa.
Kappaleen 4 kaksi viimeistä lukua käytiin läpi ratkaisemalla kevään 2018 toukokuun 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.
Demona 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.
Lopuksi tutustuttiin Kaggle.com-alustalla n. 4v sitten järjestettyyn epileptisen kohtauksen tunnistuskilpailuun, jossa taajudet erottavalla suodatuksella oli keskeinen rooli.
Kappaleen 4 kaksi viimeistä lukua käytiin läpi ratkaisemalla kevään 2018 toukokuun 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.
Demona 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.
Lopuksi tutustuttiin Kaggle.com-alustalla n. 4v sitten järjestettyyn epileptisen kohtauksen tunnistuskilpailuun, jossa taajudet erottavalla suodatuksella oli keskeinen rooli.
maanantai 16. maaliskuuta 2020
Fourier-muunnos ja Z-muunnos
Ensimmäisellä tunnilla tutustuttiin Fourier-muunnoksen ominaisuuksiin. 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)).
Yksi tämän ominaisuuden seurauksista 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).
Lisäksi tutustuttiin demoon, jossa tunnistettiin automaattisesti puheesta S-kirjaimet. Alla on luennon esimerkkikoodi S-kirjaimen tunnistuksesta.
Toisella tunnilla johdettiin nopean Fourier-muunnoksen menetelmä (FFT), jonka jälkeen 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.
Yksi tämän ominaisuuden seurauksista 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).
Lisäksi tutustuttiin demoon, jossa tunnistettiin automaattisesti puheesta S-kirjaimet. Alla on luennon esimerkkikoodi S-kirjaimen tunnistuksesta.
function vokaalin_tunnistus() % % Esimerkki vokaalin ja S-kirjaimen erottelusta äänisignaalista. % heikki.huttunen@tut.fi -- 4.2.2015 % close all % 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') break end end [B, FitInfo] = lassoglm(X, isConsonant, 'binomial', 'CV', 5); B = B(:,FitInfo.IndexMinDeviance); B0 = FitInfo.Intercept(FitInfo.IndexMinDeviance); yHat = sigmoid(X*B + B0); coefficients = H * B; 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 = sigmoid(X*B + B0); figure() subplot(211) plot(yHat); subplot(212) [~,f,t,S] = spectrogram(y, 256, 128, 256, Fs, 'yaxis'); surf(t, f, 10*log10(abs(S)), 'EdgeColor', 'none'); axis xy; axis tight; colormap(jet); view(0,90); response = questdlg('Jatketaanko tunnistusta?', ... 'Kysymys', ... 'Kyllä', 'Ei', 'Kyllä'); if strcmp(response, 'Ei') break end end end function [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 function y = sigmoid(x) y = 1 ./ (1 + exp(-x)); end
Toisella tunnilla johdettiin nopean Fourier-muunnoksen menetelmä (FFT), jonka jälkeen 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.
keskiviikko 11. maaliskuuta 2020
Luento 10.3. Fourier-muunnostyypit
Tänään
käsiteltiin kaikki neljä Fourier-muunnostyyppiä yksityiskohtaisesti.
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.
Luento 9.3.: konvoluutio ja Fourier-muunnos
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?
y(n) = 0.9 y(n-1) - y(n-2) + x(n) + 0.5 x(n-1) +2 x(n-2)
Haastavampaa on selvittää esim. se, onko yo. suodin stabiili. Tähän ratkaisu löytyy prujun sivulta 68, johon pääsemme aikanaan.
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?
y(n) = 0.9 y(n-1) - y(n-2) + x(n) + 0.5 x(n-1) +2 x(n-2)
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ä muunnostaulukoiden avulla.
Jatkuvat tapaukset perustuvat siis integraalin laskentaan, ja käytännössä tämä täytyy tehdä muunnostaulukoiden avulla.
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.
Tilaa:
Blogitekstit (Atom)
Luento 31.3.: Äärellinen sananpituus
Tänään tarkasteltiin äärellisen sanapituuden vaikutuksia. Tarkastelimme ensin mallia, jolla johdettin arvio AD-muunnoksen kvantisointivirh...
-
Tänään käsiteltiin kaikki neljä Fourier-muunnostyyppiä yksityiskohtaisesti. Käsin laskettavien kolmen ensimmäisen muunnostyypin jälkeen t...
-
Tänään tarkasteltiin äärellisen sanapituuden vaikutuksia. Tarkastelimme ensin mallia, jolla johdettin arvio AD-muunnoksen kvantisointivirh...
-
Luennon aluksi käsiteltiin kappale 2 loppuun. Tällöin tutustuttiin konvoluution ominaisuuksiin (laskentasäännöt: a(b+c) = ab+ac, kausaalis...