3 Ikkunointi Puhe ei ole stationaarinen signaali, vaan puheen ominaisuudet muuttuvat varsin nopeasti ajan myötä. Tämä on täysin luonnollinen ja hyvä asia, mutta tämä tekee sellaisten signaalinkäsittelyn menetelmien kuten DFT tai autokorrelaatio käyttämisen sellaisenaan mahdottomaksi. Useilla äänteillä puhesignaalin omainaisuudet pysyvät lyhyen jakson ajan (n. 5- ms) enemmän tai vähemmän vakiona. Tämä tarkoittaa sitä että puhesignaalista otettuun lyhyeen ikkunaan voidaan soveltaa suhteellisen menestyksekkäästi perinteisiä signaalinkäsittelyn menetelmiä. Suuri osa puheenkäsittelystä tapahtuukin näin: ottamalla signaalista lyhyitä ikkunoita (mahdollisesti osittain päällekkäisiä) ja käsittelemällä niitä. Tälläistä lyhyttä puheesta (tai muusta signaalista) otettua ikkunaa kutsutaan kehykseksi (engl. frame). Tämä ikkunointi vastaa toteutuksellisesti sitä mitä sillä ymmärretään esimerkiksi suodattimen suunnittelussa ikkunointimenetelmällä: otetaan pitkä signaali (esimerkiksi puhesignaali tai ideaalinen impulssivaste) ja kerrotaan se näytteittäin äärellisen pituisella ikkunafunktiolla, jolloin tuloksena saadaan äärellisen mittainen ja yleensä painotettu versio alkuperäisestä signaalista. Havainnollistus löytyy kuviosta. Alkuperäinen signaali ja Hanning ikkuna....5.5 38 39 4 4 42 43 44 45 46 47 48.3...tadaa! Ikkunoitu kehys signaalista.2...2.3 2 3 4 5 6 7 8 9 Kuvio : Signaalin ikkunointi. Puheenkäsittelyssä ikkunafunktion täsmällinen muoto ei ole kovin kriittinen, mutta yleensä kannattaa käyttää jotain pehmeää ikkunaa (esimerkiksi Hanning, Hamming, kolmio, puolisuunnikas), ei siis suorakulmaista. Tämä johtuu pitkälti samasta syystä kuin suodattimen suunnittelussakin, ts. pehmeämmän ikkunan spektrin sivukeilat ovat huomattavasti pienemmät kuin suorakulmaisen ikkunan (kuvio 2). Lisäksi esimerkiksi myöhemmin tarkasteltavassa LPC-analyysissä signaali oletetaan :ksi ikkunan ulkopuolella, joten suorakulmaisen ikkunan tapauksessa tapahtuu ikkunan rajalla äkillinen muutos signaalissa, mikä tietenkin usein vääristää tuloksia. 9
Muutama ikkunatyyppi....8.6.4.2 5 5 2 25 3 35 4 45 5...ja niiden vasteet (normalisoituna) Vaste, db 2 3 4 5 6.5..5.2.25.3.35 Normalisoitu taajuus (=Nyquist) Kuvio 2: Signaalin ikkunointi. Kuitenkin täytyy pitää mielessä, että puheenkäsittelyssä (päinvastoin kuin esimerkiksi suodattimen suunnittelussa) menetelmät ovat harvoin täydellisesti matemaattisesti perusteltuja, vaan yleensä tavoitteena on toteuttaa järjestelmä, joka toimii mahdollisimman hyvin annetussa sovelluksessa. Nämä sovelluksen kriteerit taas saattavat olla hyvin vaikeasti analyyttisesti määriteltävissä, kuten esimerkiksi koodatun puheen laatu, syntetisoidun puheen ymmärrettävyys tai ehostetun puheen miellyttävyys. Tältä pohjalta kannattaa ikkunointiinkin suhtautua sen verran vapaasti, että on valmis käyttämään erilaista ikkunointia eri tilanteissa. Esimerkiksi: puheen koodauksessa pyritään usein esittämään näytteet täsmälleen sellaisina kuin ne ovat, jolloin tässä käytetään suorakulmaista ikkunointia. Sen sijaan kun puhekoodekissa lasketaan ns. LPC-kertoimet, näiden laskennassa käytetään pehmeää ikkunaa, joka on vieläpä epäsymmetrinen jotta koodekin viive saadaan minimoitua. Puheentunnistuksessa käytetään yleensä päällekkäsiä nin ms ikkunoita, joista tehdään hypoteeseja mikä äänne voisi olla kyseessä, ja näitä hypoteeseja yhdistellään useamman ikkunan yli. Jos puhetta halutaan myös muokata (ei siis ainoastaan analysoida), kannattaa käyttää päällekkäisiä ikkunoita jotka summautuvat suurin piirtein :een. Esimerkki: maailman karkein koodaussysteemi, jossa otetaan kustakin kehyksestä DFT, nollataan siitä kaikki paitsi isointa tappia ja otetaan tästä käänteismuunnos. Toteutetaan tämä koska siinä tulee hyvin esille erilaisia ikkunointiin, analysointiin ja syntetisointiin liittyviä juttuja. Matlab-koodi löytyy osoitteesta http://www.cs.tut.fi/sgn/arg/835/fft_koodaus_fi.m sekä alta. function syn = FFT_koodaus_fi(ind,N);
% syn = FFT_koodaus_fi(ind,N); % Ikkunointi-demo: otetaan puhetta, käydään se läpi % pyöreäreunaisesti ikkunoiduissa 6 ms kehyksissä (jos ind == ), tai % suorakulmaisesti ikkunoiduissa 3 ms kehyksissä (jos ind == ), % lasketaan kustakin FFT, nollataan kaikki paitsi N+ korkeinta tappia, ja % syntetisoidaan tämän perusteella puhe takaisin (ulostulosignaaliin % syn ). % Puhetiedostona käytetään yhdeksän6.mat. load yhdeksän6.mat x = x(:); % tehdään pystyvektoriksi fs = 6; % näytteenottotaajuus if ( ind == ), awinlen = round( fs*.6); % analyysi-ikkunan pituus, 6 ms % tehdään hihasta analyysi-ikkuna, pyöreät reunat, tasainen keskeltä temp = hanning( fs*.); % tässä siis ne pyöreät reunat awinfun = [temp(:length(temp)/2); ones(awinlen-length(temp),);... temp(length(temp)/2+:)]; swinlen = round(awinlen/2); % synteesi-ikkunan pituus, puolet % analyysi-ikkunasta swinfun = hanning( swinlen); % synteesi-ikkunafunktio nforward = swinlen/2; % kuinka monta tappia on kehysten välillä if ( ind == ), awinlen = round( fs*.3); % analyysi-ikkunan pituus, 3 ms awinfun = boxcar( awinlen); swinlen = round(awinlen); % nyt synteesi-ikkunan pituus = % analyysi-ikkunan pituus swinfun = boxcar( swinlen); % synteesi-ikkunafunktio nforward = swinlen; figure plot(awinfun, -- ); hold on plot(+awinlen/2-swinlen/2+(:swinlen-), swinfun, r-. ); title( analyysi-ikkuna (sin) ja synteesi-ikkuna (pun) ) axis([.4]) print -depsc a_ja_s_ikkuna.eps fftind = :floor(awinlen/2)+; % FFT:n puolikkaan indeksit n = +ceil(awinlen/2); % kehyksen keskimmäinen näyte syn = zeros( size( x));
flag = ; % lippu piirtelyä varten while ( n+ceil(awinlen/2) <= length(x)) awinind = n-ceil(awinlen/2)+(:awinlen-); % nykyisen kehyksen % analyysi-ikkunan indeksit frame = x( awinind).*awinfun; % kehys Frame = fft(frame); % kehyksen FFT %etsitään (N+):nneksi suurin itseisarvo [val,sind] = sort( abs( Frame( fftind))); valn = val( -N); Frame( abs(frame) < valn)=; % nollataan kaikki paitsi N+ % korkeinta tappia iframe = real(ifft(frame)); % käänteinen FFT, reaaliosa pyöristys- % virheiden takia swinind = n - swinlen/2 + (:swinlen-); % synteesi-ikkunointi swin = iframe( + awinlen/2 - swinlen/2 + (:swinlen-)).*swinfun; syn( swinind) = syn(swinind) + swin; % overlap-add if ((n > 3) & ~flag) % piirrellään kuvio kehyksestä figure plot( x(awinind), k ); % tätä tuskin kuvasta näkyy jos % suorakulmainen ikkuna oli valittuna hold on plot( frame, b-- ); plot( awinlen/2-swinlen/2+(:swinlen-), swin, r-. ); title( alkup. puhe (must), analyysi-ikkuna (sin) ja synteesi-ikkuna (pun print -depsc kehys.eps flag = ; n = n + nforward; figure plot(x, k ); hold on plot(syn, r-. ); title( puhe (must) ja muokattu puhe (pun) ); print -depsc tulos.eps Idea hommassa on seuraava: puheesta ikkunoidaan ensin kehys FFT-analyysia varten kohtuullisen pitkällä (6ms) ja melko suorakaiteisella ikkunalla. Tarkoituksena on saada käsitys puheen taajuussisällöstä ikkunan aikana, mutta silti niin että ikkunointi ei kohtuuttomasti vaikuta kehyksen muotoon. 2
Funktioon on esimerkin vuoksi sisällytetty myös mahdollisuus käyttää 3 ms pituista suorakaiteen muotoista ikkunaa, mutta sitä ei käytännössä kannata valita, jotta puheen laatu ei kohtuuttomasti kärsisi. Analyysikehyksestä lasketaan FFT ja nollataan siitä kaikki paitsi itseisarvoltaan suurimmat tapit. Tälle osittain nollatulle spektrille lasketaan tämän jälkeen käänteinen FFT, jolloin saadaan vastaava aikatason signaali. Seuraavaksi tehdään uusi ikkunointi (mikäli 6 ms ikkuna oli valittuna): edellisestä signaalista ikkunoidaan vain keskimmäinen osa, ja reunat pehmennetään. Tässä käytetään Hanningikkunaa, jolla on se mukava ominaisuus, että puoliksi päällekkäiset ikkunat summautuvat lähes :een, kuten kuva 3 osoittaa (täsmälleen :een jos ikkunan pituus on pariton). Tätä menetelmää, jossa generoidaan osittain päällekkäisiä signaaleja ja muodostetaan varsinainen lopputulos näiden summasta, sanotaan overlap-add-menetelmäksi. Jos kokeilumielessä valitaankin 3 ms suorakaideikkuna, peräkkäiset kehykset eivät osu ollenkaan päällekäin, vaan synteesi tapahtuu liimaamalla käänteisen FFT:n tuottamia aikatason signaaleja sellaisenaan peräkkäin. Kehysten rajoilla esiintyy täten epäjatkuvuuskohtia, jotka saavat ulostulopuheen kuulostamaan hyvin epäluonnolliselta..4 Puoliksi päällekkäisten Hanning ikkunoiden summa.2.8.6.4.2 2 4 6 8 2 Kuvio 3: Puoliksi päällekkäisten Hanning-ikkunoiden summa on lähes, eli niitä voidaan näppärästi käyttää synteesi-ikkunointiin. Käytettäessä 6 ms ikkunaa (eli ind = ) ja valittaessa N = 9, jolloin itseisarvoltaan suurinta tappia FFT:stä jätetään jäljelle, funktio tulostaa kuvioiden 4-6 mukaiset kuvat. 3
analyysi ikkuna (sin) ja synteesi ikkuna (pun).2.8.6.4.2 2 3 4 5 6 7 8 9 Kuvio 4: M-funktiossa käytetyt analyysi- ja synteesi-ikkunat..5 x 4 alkup. puhe (must), analyysi ikkuna (sin) ja synteesi ikkuna (pun).5.5.5 2 3 4 5 6 7 8 9 Kuvio 5: Yhden kehyksen signaalit. 4
.5 x 4 puhe (must) ja muokattu puhe (pun).5.5.5 2 4 6 8 2 Kuvio 6: Alkuperäinen ja koodattu puhe. 5