Notch-suodin -harjoitus
460 530 625
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:
Nollat ja navat koordinaattimuodossa:
Otetaan käyttöön apumuuttujat
jolloin nollat ja navat voidaan merkitä muotoon
Tällöin kaksinollaisen ja -napaisen suotimen siirtofunktioksi muodostuu
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.