timohei.net / Opintojaksot / Aiemmin pitämäni opintojaksot / Digitaalisen säädön perusteet / Harjoitukset /
Notch-suodin -harjoitus
Harjoituksessa poistetaan tiedoston puhe_hairio.mp3 (wav-muodossa puhe_hairio.wav) puhesignaalia häiritsevä voimakas vinkuna. Poistaminen tehdään ns. notch-suotimella, jolla saadaan poistettua halutun signaalin seasta tietyllä taajuudella oleva häiriö hyvin tehokkaasti.
Yksinkertaisimmillaan suotimen toiminta perustuu nolla- ja napapareihin (`z_1,_2, p_1,_2`), jossa nollat sijaitsevat häiriötaajuudella `omega_x` yksikköympyrän kehällä (eli etäisyydellä `r_p=1` origosta) ja navat täsmälleen samalla taajuudella `omega_x`, mutta hieman yksikköympyrän sisäpuolella (esimerkiksi etäisyydellä `r_p=0.99` origosta).
Esimerkissä käytettävän audiotiedoston näytetaajuus `f_s=44100 Hz` ja häiriösignaalin taajuus `f_x~~2020 Hz`. Näytteenottotaajuutta `f_s` vastaa kulmataajuus `omega_s=2pi` ja häiriösignaalin taajuutta `omega_x`, joka saadaan laskettua tunnettujen arvojen perusteella:
Matlab:
| fs=44100; | Näytteenottotaajuus [Hz] |
| fx=2020; | Poistettavan signaalin taajuus [Hz] |
| wx=2*pi*fx/fs | Poistettavan signaalin taajuus [rad/s] |
Nollat ja navat kulmamuodossa:
`p_1,_2=0.99/_+-omega_x`
Nollat ja navat koordinaattimuodossa:
`p_1,_2=kcos(omega_x)+-jksin(omega_x)`, missä `k=r_p=0.99`
Otetaan käyttöön apumuuttujat
`s=sin(omega_x)`
jolloin nollat ja navat voidaan merkitä muotoon
`p_1,_2=kc+-jks`
Tällöin kaksinollaisen ja -napaisen suotimen siirtofunktioksi muodostuu
`=(z^2+z(-c+js-c-js)+c^2-jcs+jcs+s^2)/(z^2+z(-kc+jks-kc-jks)+k^2c^2-k^2jcs+k^2jcs+k^2s^2)`
`=(z^2-2cz+c^2+s^2)/(z^2-2kcz+k^2c^2+k^2s^2)`
`=(z^2-2cz+c^2+s^2)/(z^2-2kcz+k^2(c^2+s^2))`
sijoitetaan `c^2+s^2=cos^2(omega_x)+sin^2(omega_x)=1` [Pythagorean trigonometric identity]
sijoitetaan `c=cos(omega_x)` ja `k=0.99`, jolloin
Suotimen osoittaja- ja nimittäjäpolynomit syötetään Matlabiin polynomin kertoimet sisältävinä vektoreina. Muodostetaan siis osoittajapolynomin kerroinvektori `b` ja annetaan sen jäsenille `b_0`, `b_1` ja `b_2` arvot ja tehdään sama nimittäjäpolynomin kerroinvektori `a`:lle ja sen jäsenille `a_0`, `a_1` ja `a_2`:
| c=cos(wx); | Apumuuttuja c |
| k=0.99; | Napojen etäisyys origosta |
| b=[1 -2*c 1]; | Osoittajapolynomin kertoimet (ks. kaavan johtaminen yltä) |
| a=[1 -2*k*c k*k]; | Nimittäjäpolynomin kertoimet |
Tarkistetaan, että suotimella on halutunlainen taajuusvaste. freqz piirtää suotimen taajuusvasteen:
Matlab:
| freqz(b,a) | Siirtofunktion H(z) = (b0*z2 + b1*z + b2)/(a0*z2 + a1*z + a2) taajuusvaste |
Lataa nyt puhe_hairio.mp3 (mp3-tiedosto) tai puhe_hairio.wav (wav-tiedosto) ja tallenna se omalle koneellesi. AUTATK-luokan koneilla sopiva paikka on Documents\MATLAB, jolloin audioread-funktio löytää tiedoston suoraan. Suodata signaali ja kuuntele alkuperäinen sekä suodatettu ääni:
Matlab (M), Octave (O):
| M: x=audioread('puhe_hairio.mp3'); O: [x,fs]=audioread('puhe_hairio.wav'); |
Luetaan äänitiedosto vektoriin x (Octavella luetaan myös näytteenottotaajuus muuttujaan fx) |
| sound(x,fs) | Soitetaan alkuperäinen häiriöllinen signaali. Jos teet tämän harjoituksen m-skriptillä, poista tämä rivi, koska muuten alkuperäinen ja suodatettu signaali soivat päällekkäin. |
| y=filter(b,a,x); | Suodatetaan x-vektorissa oleva signaali ja sijoitetaan tulos vektoriin y |
| sound(y,fs) | Soitetaan suodatettu, häiriötön signaali |
Octaven audioread-funktio ei tue mp3-formaattia. Käytä sen sijaan pakkaamatonta wav-tiedostomuotoa.