Luku 2 Synteesi-analyysi koodaus Tärkein koodausmenetelmä puheenkoodausstandardeissa 9-luvulta alkaen on ollut synteesi-analyysi koodaus (engl. analysis-by-synthesis). Tässä lähestymistavassa optimaaliset parametrit analysoidaan sitä kautta että katsotaan millaisen synteesin ne tuottavat (josta nimikin). Lähtökohtana voi ajatella suljettua eteenpäin-adaptiivista ADPCM-järjestelmää, jossa kehyksittäin lasketaan ja kvantisoidaan ensin LPC-kertoimet ja tämän jälkeen residuaalisignaali. Synteesi-analyysi koodekeissa vain residuaalisignaali rakennetaan siten että koodaustulos on mahdollisimman hyvä sen sijaan että alkuperäinen residuaali kvantisoitaisiin näytteittäin. Tämän voi taas toteuttaa (ainakin käsitteellisesti) herätekoodikirjan avulla, joka sisältää mahdolliset herätteet joista valitaan kuhunkin kehykseen paras. Tämän takia synteesi-analyysi koodekeista käytetään myös nimeä code-excited linear prediction, CELP. Katsotaan ensin läpi multipulse-koodekki, joka historiallisen mielenkiinnon ohella havainnollistaa hyvin synteesi-analyysi koodauksen perusideaa. 2.1 Multipulse-koodekki Vuonna 1982 Atal ja Remde kehittivät multipulse-menetelmän puheenkoodaukseen, jossa yritetään konstruoida residuaali joka tuottaa mahdollisimman hyvän tuloksen sen sijaan, että yritetään kompressoida alkuperäistä residuaalia. Lohkokaavio menetelmästä on esitetty kuviossa 2.1. Kaikki prosessointi tehdään kehys kerrallaan. Homma toimii seuraavasti: 1. Lasketaan LPC-analyysikehyksestä LP-suodatin ja kvantisoidaan se esim. kuten edellä ADPCM-koodekin yhteydessä. Kvantisoidut LPC-kertoimet lähetetään vastaanottimelle. 2. Generoidaan herätekandidaatti synteesikehykselle, joka suodatetaan ääntö- 18
2.1. MULTIPULSE-KOODEKKI 19 1 väyläsuodattimella suorakaideikkunalla.. Synteesikehys on otettu alkuperäisestä puheesta 3. Lasketaan erotus tämän rekonstruoidun puheen ja alkuperäisen puhekehyksen välillä. 4. Painotetaan virhettä taajuustasossa painotussuodattimella W(z) siten että taajuusalueilla joissa puheen teho on suuri sallitaan enemmän virhettä. Tämä perustuu ihmisen kuuloaistin taajuusmaskausominaisuuksiin, joista tarkemmin kurssilla SGN-42 Digitaalinen Audio. Painotussuodatin voidaan laskea joko kvantisoidun tai kvantisoimattoman LP-suodattimen avulla koska sitä ei lähetetä dekooderille. Painotussuodattimen määrittämiseen palataan tarkemmin jäljempänä. 5. Lasketaan painotetun virheen energia ja pidetään muistissa pienimmän virheen aiheuttava heräte. 6. Toistetaan sama operaatio kohdasta 2 eri herätteille. 7. Lähetetään vastaanottimelle paras löydetty heräte. Huomaa että painotussuodatin W(z) tarvitaan ainoastaan lähettimessä valittaessa parasta herätettä, periaatteessa ihmisen korva hoitaa saman tehtävän vastaanottimessa. Herätesignaalin rakenne eli herätekoodikirja tai kiinteä koodikirja on yksi tärkeimpiä synteesi-analyysi koodekkien parametreja. Alkuperäisessä multipulsemenetelmässä heräte generoitiin lisäämällä siihen impulssi kerrallaan tiettyyn määrään asti. Eli tarkemmin: 1 Aloitetaan nollaherätteestä. 2 Lisätään yksi impulssi nykyiseen herätteeseen sellaiseen kohtaan ja sellaisella amplitudilla, että rekonstruoidun puheen painotettu virhe kehyksen yli minimoituu. 3 Jatketaan kohdasta 2, kunnes herätteessä on haluttu määrä impulsseja. Kuviossa 2.2 on esimerkki synteesikehyksestä, yllä olevalla tavalla tehdystä herätteestä ja vastaavista rekonstruktioista. Laskennallisesti multipulse-herätteen määrittämisessä tarvittavat suodatukset on näppärintä esittää matriisialgebran avulla joten katsotaan tässä välissä...
2 LUKU 2. SYNTEESI-ANALYYSI KOODAUS kanava SYNTEESIKEHYS s(n) LPC-ANALYYSIKEHYS DEKOODERI LPC-analyysi generoi pulssi herätekehykseen e(n) 1/ - + kvantisointi W(z) S() 2 valitse paras heräte Kuvio 2.1: Multipulse-menetelmän lohkokaavio. 2.1.1 Suodatus esitettynä matriisialgebran avulla Otetaan tilanne jossa halutaan suodattaa kehys x(), x(1),..., x(n 1) suodattimella B(z) = b + b 1 z 1 +... + b p z p 1 + a 1 z 1 +... + a q z q. Tässä aloitetaan siis signaalin indeksointi kullekin N:n näytteen pituiselle kehykselle nollasta. Tämä on lineaarinen operaatio joten se voidaan esittää matriisioperaatioiden avulla. Miten? No ensin kerätään signaali vektoriin: x = x() x(1). x(n 1).
2.1. MULTIPULSE-KOODEKKI 21.3 1 impulssi.3 puhe ja rekonstruktio.2.1.2.1 2 4 6 8 1 2 impulssia.3.2.1 2 4 6 8 1 3 impulssia.4.2.2 2 4 6 8 1.1 2 4 6 8 1 puhe ja rekonstruktio.3.2.1.1 2 4 6 8 1 puhe ja rekonstruktio.3.2.1.1 2 4 6 8 1 Kuvio 2.2: Synteesikehys, multipulse-herätteet eri impulssimäärillä ja vastaavat rekonstruktiot. Seuraavaksi tehdään matriisi jolla kertominen vastaa suodatusta suodattimella B(z) B(z). Tätä varten tarvitaan suodattimen impulssivaste h(n). Suoraviivaisin tapa tehdä tämä on yksinkertaisesti suodattaa impulssi suodattimella B(z) joka Matlabilla onnistuu komennolla impz. Jos tämän haluaa tehdä monimutkaisesti niin impulssivasteen saa selville myös suorittamalla formaalisti jakolaskun B(z). Nyt kun h(n) on selvillä, sen avulla konstruoidaan nk. konvoluutiomatriisi H. Oletetaan vaikka että kehyksen pituus N = 5 niin tämä saadaan kirjoitettua auki kokonaisuudessaan: H = h() h(1) h() h(2) h(1) h() h(3) h(2) h(1) h() h(4) h(3) h(2) h(1) h() Muilla N:n arvoilla homma hoituu täysin vastaavasti. Tarkkaavainen lukija voi todeta että konvoluutiomatriisi on Toeplitz-tyyppinen eli sen kaikilla diagonaaleilla on sama arvo. Kun suodatetaan kehys signaalista x(n) suodattimella B(z).
22 LUKU 2. SYNTEESI-ANALYYSI KOODAUS niin ulostulo saadaan yksinkertaisesti matriisikertolaskusta Hx (lukija voi miettiä miksi näin on). 2.1.2 Multipulse-herätteen laskenta Takaisin multipulse-herätteen määrittämiseen. Käytetään puhesignaalikehyksestä merkintää s(n), kvantisoidusta LPC-suodattimen siirtofunktiosta (synteesisuodatin) merkintää 1, painotussuodattimen siirtofunktiosta merkintää W(z) ja herätesignaalista merkintää e(n). Nykyinen heräte on siis e(n) (joka on aluksi täynnä nollia) ja haluamme lisätä siihen yhden impulssin joka minimoi summan E(i, α) = N 1 n= (w(n) (s(n) h(n) (e(n) + αδ i (n)))) 2, (2.1) missä N on synteesikehyksen pituus, w(n) on painotussuodattimen impulssivaste, tarkoittaa konvoluutiota, h(n) on synteesisuodattimen 1 impulssivaste, α on uuden impulssin amplitudi ja δ i (n) on diskreetti impulssi hetkellä n = i (eli signaali jonka i:s alkio on yksi ja muut nollia). Huomaa että tämä virhe riippuu siis sekä impulssin sijainnista i ja sen amplitudista α. Katsotaanpa summaa (2.1) hiukan tarkemmin. Termi e(n) + αδ i (n) on nykyinen heräte e(n) johon on lisätty impulssi hetkellä i jonka amplitudi on α. Tämä konvoloidaan synteesisuodattimella h(n) joka muuttaa herätteen puheeksi. Tämä syntetisoitu puhe vähennetään sitten alkuperäisestä puheesta s(n) jolloin saadaan virhe synteesin ja alkuperäisen puheen välillä. Tämä suodatetaan painotussuodattimella W(z) konvoloimalla se vastaavan impulssivasteen w(n) kanssa. Tuloksena saadaan siis painotettu virhe jonka energia lasketaan ottamalla näytteittäin neliöt ja summaamalla koko kehyksen yli. Kaiken kaikkiaan (2.1) siis kertoo mikä on painotetun virheen energia kun herätteeseen lisätään impulssi hetkellä i amplitudilla α, ja tavoitteenamme on määrittää i ja α siten että tämä summa minimoituu. Summa (2.1) voidaan kirjoittaa vektorien ja konvoluutiomatriisien avulla. Lähdetään liikkelle termistä e(n) + αδ i (n) joka on N:n näytteen pituinen kehys joten se voidaan esittää vektorina e + αd i,
2.1. MULTIPULSE-KOODEKKI 23 missä ja e = e() e(1) e(2). e(n 1) d i = 1. missä i:s alkio on 1 ja muut ovat nollia. Termin h(n) (e(n) + αδ i (n)) laskemiseksi tempaistaan ääntöväyläsuodattimen impulssivasteesta h(n) konvoluutiomatriisi H tyyliin H = h() h(1) h() h(2) h(1) h()....... h(n 1) h(n 2) h(n 1) h() Nyt signaali h(n) (e(n) + αδ i (n)) voidaan esittää vektorina H (e + αd i ). Vastaavalla logiikalla kun vähennetään tämä alkuperäisestä puhekehyksestä s ja painotetaan virhe niin signaali w(n) (s(n) h(n) (e(n) + αδ i (n))) saadaan vektorina W (s H (e + αd i )). Summassa (2.1) lasketaan tämän vektorin neliöiden summa. Tämäkin onnistuu kätevästi matriisilaskennan avulla kun muistetaan että yleisesti vektorin v = v 1 v 2. v N alkioiden neliöiden summa saadaan sisätulosta v T v = v 2 1 + v2 2 +... + v2 N..
24 LUKU 2. SYNTEESI-ANALYYSI KOODAUS Tässä tapauksessa vektorina v on hankalahko W (s H (e + αd i )) mutta periaate pysyy täysin samana. Eli summa (2.1) voidaan kirjoittaa matriisimuodossa E(i, α) = (W (s H (e + αd i ))) T (W (s H (e + αd i ))) = (W(s He) αwhd i ) T (W(s He) αwhd i ) = α 2 (WHd i ) T (WHd i ) 2α(WHd i ) T W(s He) +(W(s He)) T (W(s He)). Tämä saattaa vaikuttaa ensi alkuun pelottavalta mutta itse asiassa kun siihen sijoitetaan tietty i:n arvo (eli impulssin sijainti) se on yksinkertainen toisen asteen paraabeli muuttujan α suhteen, eli muotoa aα 2 + bα + c. Tämä saavuttaa minimiarvon α:n suhteen kun α min = (WHd i) T W(s He) (WHd i ) T (WHd i ) eli vanha tuttu x = b 2a. Tavoitteenahan oli selvittää uuden optimaalisen lisättävän impulssin paikka i ja amplitudi α. Amplitudi α on nyt selvillä mutta optimaalisen paikan selvittämiseen ei yleisesti ole muuta keinoa kuin kokeilla kaikki mahdollisuudet läpi. Tehdään tämä laskemalla E(i, α) kaikille mahdollisille sijainneille i siten että jokaiselle käytetään vastaavaa optimaalista α:n arvoa. Jos haluttaisiin olla oikein tarkkoja niin voisimme merkitä α:a itse asiassa α(i) koska se on i:n funktio. Sijoittamalla optimaalinen α min suoraan virheen E(i, α) kaavaan saataisiin melkoinen hirviö mutta onneksi voimme ensinnäkin jättää virheestä pois vakiotermin (W(s He)) T (W(s He)) sen takia että tämä ei riipu i:stä ja haluamme vain löytää parhaan i:n arvon. Toiseksi jos sijoitamme toisen asteen polynomiin ax 2 + bx minimiarvon x = b 2a niin tulos on ( a b ) 2 + b( b ) 2a 2a = ab2 4a 2 b2 2a = ab2 2ab 2 4a 2 = b2 4a.
2.1. MULTIPULSE-KOODEKKI 25 Meidän tapauksessamme tämä lavenee muotoon E min (i) = ( (WHdi ) T W(s He) ) 2 (WHd i ) T (WHd i ) (2.2) missä E min (i) merkitsee minimiarvoa α:n suhteen. Tämä termi siis lasketaan ja talletetaan kaikille arvoille i =, 1,..., N 1, kuten myös jokaista vastaava α min. Osamäärän (2.2) nimittäjä voidaan vielä laskea tehokkaasti siten että ensin kehykselle lasketaan matriisi (WH) T (WH), tämän jälkeen termit (WHd i ) T (WHd i ) ovat vain diagonaalialkioita tästä matriisista (lukija todetkoon). Nyt parhaan lisättävän impulssin paikka ja amplitudi löydetään yksinkertaisesti etsimällä i:n arvo i min joka antoi pienimmän virheen. Tätä vastaava amplitudi α min kvantisoidaan, esimerkiksi epätasavälisellä skalaarikvantisoijalla. Merkitään kvantisoitua amplitudia ˆα min. Seuraavaksi lisätään herätteeseen tämä optimaalinen kvantisoitu impulssi: e e + ˆα min d imin. Tätä jatketaan kunnes impulsseja on haluttu määrä (esimerkiksi luokkaa 5 impulssia 4:n näytteen ikkunassa). Dekooderille lähetetään siis: kvantisoidut LPC-kertoimet, pulssien sijainnit ja kvantisoidut amplitudit. Dekooderi toimii yksinkertaisesti siten että se konstruoi herätteen summaamalla impulssit annetuilla amplitudeilla ja suodattaa sen LPC-suodattimesta läpi. Tämä voidaan tehdään vielä niin että synteesisuodattimella on muisti jota kierrätetään kehyksestä toiseen mutta ei murehdita siitä vielä. Multipulse-koodekissa, kuten synteesi-analyysi koodekeissa yleensäkin, kooderi on huomattavasti monimutkaisempi kuin dekooderi. 2.1.3 Painotussuodattimen toteutus Painotussuodattimen tarkoituksena on muovata virheen spektri siten, että se maskautuisi formanttien alle. Tämä voidaan toteuttaa painottamalla virhettä eri taajuuksilla puheen spektristä riippuen. Painotuksen pitää siis olla pieni formanttien 1 kohdalla ja suuri muualla. Synteesisuodattimen spektri on hyvä approksimaatio kehyksen spektrille, joten sitä käytetään painotukseen. Yleisesti käytetty painotussuodatin on A(z/γ 1 ) A(z/γ 2 ), missä < γ 2 < γ 1 1, esim. γ 1 =.94, γ 2 =.6 on toimiva valinta. Kuviossa 2.3 on esitetty LPC-suodattimen 1/ spektri ja suodattimen A(z/.94) A(z/.6) spektri.
26 LUKU 2. SYNTEESI-ANALYYSI KOODAUS Havaitaan että painotussuodatin painottaa enemmän taajuuksia joissa puheella on vähän energiaa, aivan kuten pitääkin. Miksi tämä suodatin toimii? Perusajatuksena on se että suodatin A(z/.94) on melko lailla käänteinen suodatin 1/:lle joten sen amplitudivaste on suuri kun 1/:n amplitudivaste on pieni ja kääntäen. Tämä antaa kuitenkin hiukan turhan jyrkän painotuksen joten sitä pehmennetään suodattimella 1/A(z/.6). Tämä vastaa suodatinta jossa navat ovat muuten samat kuin 1/:lla mutta niiden etäisyydet origosta on kerrottu.6:lla, joten vaste on pehmeämpi kuin 1/:lla. 4 3 Painotussuodattimen vaste 1/ W(z) 2 amplitudivaste, db 1 1 2 3 5 1 15 2 25 3 35 4 taajuus, Hz Kuvio 2.3: LPC-suodattimen ja vastaavan painotussuodattimen amplitudivasteet. Painotus tehdään ainoastaan kooderissa eikä painotussuodatinta lähetetä dekooderille, joten siinä voidaan käyttää joko kvantisoitua tai kvantisoimatonta - polynomia.