Luku 1 Puheen koodaus Puheen koodauksella tarkoitetaan puhesignaalin esittämiseen tarvittavan bittimäärän pienentämistä sillä tavalla, että puhesignaalin laatu ja ymmärrettävyys kärsivät mahdollisimman vähän. Puheen koodauksella on suuri merkitys mm. digitaalisissa matkapuhelinjärjestelmissä ja tämän vuoksi puheen koodausmenetelmät ovat kehittyneet voimakkaasti viimeisten 15 vuoden aikana. Kaupallisesti ajateltuna puheen koodaus on puheenkäsittelyn ylivoimaisesti tärkein sovellus. Koodausta tarvitaan kun välitetään digitaalinen puhesignaali jonkin kanavan yli, erityisesti matkapuhelinjärjestelmissä tai puheen tallennuksessa. Hyvältä puhekoodekilta (engl. codec = coder-decoder) vaaditaan seuraavia ominaisuuksia: puheen laatu kärsii koodauksesta mahdollisimman vähän. puhe pakkautuu mahdollisimman pieneen määrään bittejä. koodaaminen/dekoodaaminen aiheuttaa vain pienen viiveen. koodekki ei ole herkkä lähetyksessä tapahtuville virheille. koodaaminen/dekoodaaminen on laskennallisesti nopeaa. koodekki toimii hyvin myös kohinaiselle puheelle (ja mielellään vielä musiikille). useampi peräkkäinen koodaaminen ei heikennä laatua suhteettoman paljon. Tällaista täydellistä koodekkia ei ole olemassa, koska osa vaatimuksista on toisensa poissulkevia, esimerkiksi bittimäärän pienentäminen heikentää puheen laatua. Koodekkeja on kuitenkin kehitetty ja standardoitu suuri määrä erilaisia sovelluksia varten. Esimerkiksi matkapuhelimen puhekoodekissa kaikki edellä olleet vaatimukset ovat oleellisia, kun taas vaikkapa puheen tallennussovelluksessa 1
2 LUKU 1. PUHEEN KOODAUS laskennalliset vaatimukset, viive ja virhesietoisuus ovat epäoleellisia ja puheen laatu ja bittimäärä ovat tärkeitä. Koodausmenetelmiä on useita erilaisia, mutta ne voidaan jakaa karkeasti aaltomuotokoodaukseen ja lähdekoodaukseen. Aaltomuotokoodauksessa pyritään säilyttämään (puhe)signaalin alkuperäinen aaltomuoto ja koodaus perustuu kvantisointiin ja aaltomuodossa olevan redundanssin poistamiseen. Lähdekoodauksessa taas keskitytään aaltomuodon sijasta puheen parametrien koodaamiseen (herätteen tyyppi, ääniväylämalli, formanttitaajuudet,...), joiden avulla puhe voidaan rekonstruoida dekooderissa. Lähdekoodauksella koodatun puheen aaltomuoto voi siis erota hyvinkin paljon alkuperäisestä. Raja näiden koodausmenetelmien välillä ei ole täysin terävä, etenkin uudemmissa synteesi-analyysi koodekeissa, joissa puheen aaltomuoto pyritään syntetisoimaan sopivien parametrien avulla. Seuraavassa oletetaan yleisesti että puhesignaali on kapeakaistaista, eli puheen näytteenottotaajuus on 8 khz ja kaista on sama kuin lankapuhelinverkossa eli 300-3400 Hz. Sovelluksissa joissa puheen ei täydy kulkea kiinteän lankapuhelinverkon kautta voidaan käyttää korkeampaa puheenlaatua, esim. videokonferensseissa tai internetin yli välitettävässä puheessa. Näissä sovelluksissa käytetään usein 50-7000 Hz kaistanleveyttä ja 16 khz näytteenottotaajuutta, jota kutsutaan laajakaistaiseksi puheeksi. Aaltomuotokoodaus Aaltomuotokoodaus pohjautuu siihen että signaalissa olevaa redundanssia poistetaan siten että aaltomuoto koodauksen ja dekoodauksen jälkeen pysyy mahdollisimman lähellä alkuperäistä. Lähdemme liikkeelle yksinkertaisesta kvantisoinnista ja katsomme tämän jälkeen useita menetelmiä miten sitä voidaan tehostaa. Pulssikoodimodulaatio PCM Pulssikoodimodulaatio (engl. pulse-code modulation eli PCM) koodaa jatkuvaaikaisen puhesignaalin s a (t) ajan suhteen tasavälisiksi näytteiksi s(n), missä kvantisointi on myös tasavälinen, kuten kuva 1.1 osoittaa. Jos käytössä on R bittiä näytettä kohden, voidaan koodata 2 R eri amplituditasoa. Näiden amplituditasojen voidaan ajatella olevan koodikirjassa, ja jokainen kvantisoitu näyte esitetään binaarilukuindeksinä tähän koodikirjaan, jota vastaavaa arvoa alkuperäinen näyte vastaa parhaiten. PCM:n tapauksessa 2-bittinen koodikirja voisi olla vaikkapa indeksi arvo 00-0.2 01-0.1 10 0 11 0.1
3 Alkuperäinen kvantisoimaton signaali s a (n) voidaan aina esittää muodossa s a (n) = s(n) q(n), missä s(n) on kvantisoitu signaali ja q(n) on kvantisointivirhe. Oletetaan, että signaalin dynamiikka on rajoitettu välille [ 1, 1]. Tällöin PCM:n kvantisointivirheen jakaumaa voidaan menestyksekkäästi mallintaa tasajakaumalla f q (ξ) = 1, /2 ξ /2, missä = 2 1 R on kvantisointiaskel. Kohtuullisen hyvä indikaatio aaltomuotokoodauksen laadusta saadaan laskemalla signaali/kohina-suhde (engl. signal-to-noise ratio eli SNR), tai tarkemmin oikeastaan hyötysignaalin ja kohinan tehojen suhde. Vielä tarkemmin ottaen SNR määritellään kaavalla SNR = 10 log 10 S E (db), missä S on hyötysignaalin keskimääräinen teho, E on kohinan keskimääräinen teho ja yksikkö on desibeli (db). Huomaa että SNR on logaritminen, eli jos hyötysignaalin teho kasvaa kymmenkertaiseksi niin SNR kasvaa kymmenellä (eikä siis kymmenkertaistu). Lasketaan seuraavaksi R-bittisen PCM-kvantisoijan signaali/kohinasuhde. Tasavälisen kvantisoijan kvantisointivirheen keskimääräinen teho on /2 E{q(n) 2 1 } = /2 x2 dx = 1 1 ( ( /2) 3 ( /2) 3) 3 = 2 12 = 2 2R 3, missä E{} on odotusarvo-operaattori (joka on lukijalle toivottavasti tuttu todennäköisyyslaskennasta). Entä mikä on hyötysignaalin teho? Riippuu signaalista, mutta parhaassakin (ja täysin epärealistisessa) tapauksessa signaalin kaikki näytteet ovat amplitudiltaan ±1, jolloin keskimääräinen teho on 1. Siis PCM-kvantisoijan signaali/kohina-suhde on SNR = 10 log 10 1 2 2R 3
4 LUKU 1. PUHEEN KOODAUS Kvantisointitasot, 4 bittinen PCM 1 0.8 0.6 0.4 Kvantisoitu arvo 0.2 0 0.2 0.4 0.6 0.8 1 1.5 1 0.5 0 0.5 1 1.5 Kvantisoimaton arvo Kuvio 1.1: Tasavälinen PCM-kvantisointi saturoinnilla, eli dynamiisen alueen ulkopuoliset arvot asetetaan mahdollisimman lähelle kvantisoimatonta arvoa. Tasoja on 16 eli kvantisointi on 4-bittinen. = 10 log 10 ( 3 4 R ) = 10R log 10 (4) 10 log 10 (3) = 6.02R 4.77. Toisin sanoen, yhden bitin lisääminen kvantisointitarkkuuteen nostaa signaali/kohinasuhdetta n. 6 db. Puhesignaalien kvantisoinnissa kannattaa käyttää epätasavälistä kvantisointia, osittain siksi, että puheessa on pääosin matalia amplitudeja, osittain siksi, että ihmisen kuulo on vähemmän herkkä virheille kun signaali on voimakas (lisää infoa kuulon ominaisuuksista löytyy kurssilla SGN-4200 Digitaalinen Audio). Kuvassa 1.2 on esimerkki puheen amplitudijakaumasta josta huomataan että matalia amplitudeja on huomattavasti enemmän kuin korkeita. Yleisesti jos tunnetaan signaalin amplitudien jakauma (joka voidaan aina estimoida testiaineistosta), voidaan määrittää tälle jakaumalle ja valitulle virhefunktiolle optimaalinen ns. Lloyd-Max kvantisoija. Epätasavälinen kvantisointi toteutetaan käytännössä epälineaarisella muun-
5 10 5 Puheen amplitudijakauma 10 4 Esiintymien lukumäärä 10 3 10 2 10 1 10 0 1 0.8 0.6 0.4 0.2 0 0.2 0.4 0.6 0.8 Näytearvo Kuvio 1.2: Amplitudien jakauma 20 s näytteelle puhetta. noksella ennen tasavälistä kvantisointia ja vastaavalla käänteismuunnoksella kvantisoinnin jälkeen. Tätä sanotaan kompandoinniksi (engl. compression, expanding). Puheen tapauksessa Euroopassa käytetään lankapuhelinverkoissa A-law-kompandointia, joka muuntaa näytearvon x seuraavasti: (ei kannata opetella ulkoa) y = Ax 1log 10 A, 0 x 1 A sgn(x) 1log 10 (A x ), 1 x 1, 1log 10 (A) A missä A = 87.56 ja sgn(x) on x:n merkki (siis -1 tai 1). Pohjois-Amerikan puhelinliikenteessä käytetään µ-law-kompandointia, joka perustuu samantyyliseen logaritmiseen kompressointiin: log(1 µ x ) y = sgn(x) log(1 µ), missä µ = 255 ja käytetään luonnollista logaritmia. Vastaavat ekspandoinnit saadaan ratkaisemalla y:n avulla x edellisistä yhtälöistä (jätetään lukijalle harjoitustehtäväksi). Epätasavälisellä kvantisoinnilla saavutetaan suuri etu puhesignaalien kvantisoinnissa; 12 bpn (bittiä/näyte) tasavälisellä kvantisoinnilla vastaa subjektiivisesti
6 LUKU 1. PUHEEN KOODAUS suunnilleen 8 bpn em. kvantisoinneilla. Karvalakki-PCM-kvantisointiin löytyy iso nippu ehostuksia, joita katsotaan seuraavaksi. Periaatteessa voidaan lisäksi käyttää mitä tahansa yleisiä häviöttömiä kompressiomenetelmiä (joita löytyy mm. kurssilta SGN-2306 Signal Compression), mutta jatkossa keskitytään menetelmiin jotka sopivat nimenomaan puheelle. PCM adaptiivisella kvantisointiaskeleella Kvantisointiaskelta voidaan säätää signaalin mukaan; tätä menetelmää sanotaan adaptiiviseksi kvantisoinniksi. Perusajatuksena on pienentää kvantisointiaskelta silloin kun signaalin taso on pieni, jolloin kvantisointivirhe pienenee myös. Vastaavasti suurien arvojen myötä kvantisointiaskelta suurennetaan. Adaptiivisesta kvantisoinnista on erityisesti hyötyä epästationaaristen signaalien matalan bittimäärän (<8) kvantisoinnissa. Yleinen menetelmä kvantisointiaskeleen (n) säätämiseksi on (n 1) = (n)m( x(n)), missä M() on kiinteä funktio, x on hetkellä n olevan puhenäytteen kvantisoitu arvo ja (n1) on kvantisointiaskel hetkellä n1. Funktio M() voidaan määrittää kokeellisesti testiaineiston avulla, ideana kuitenkin se että kvantisointiaskelta kasvatetaan (eli M() > 1) kun edellisen näytteen kvantisointitaso on pieni ja pienennetään (eli M() < 1) kun edellisen näytteen kvantisointitaso on suuri. Tällä menetelemällä on se hyvä puoli, että kvantisointitasot saadaan vastaanotettaessa rekonstruoitua ilman että täytyy lähettää lisätietoa kvantisointiaskeleen muutoksista. Miksi? Oletetaan, että hetkellä n kooderissa käytetään kvantisointiaskelta (n) ja saadaan kvantisoitu näyte x(n), joka lähetetään vastaanottimeen. Mutta koska seuraava kvantisointiaskel (n 1) riippuu ainoastaan edellisestä kvantisointiaskelesta (n) (joka tiedetään dekooderissa), näytteestä x(n) (joka lähetettiin dekooderiin joten sekin on tiedossa) ja kiinteästä funktiosta M() (joka on kiinteästi koodattu kooderiin ja dekooderiin), voidaan se laskea myös vastaanottimessa. Tämä on tärkeä synkronointipiirre kooderin ja dekooderin välillä paljon monimutkaisemmissakin koodekeissa: kooderin ja dekooderin tulisi olla samassa tilassa. Mielellään vielä niin, että jos ne joutuvat eri tilaan esim. lähetyksessä tapahtuvan virheen vuoksi, ne pystyisivät synkronoitumaan uudestaan suhteellisen nopeasti. Differentiaalinen PCM alias DPCM Perusidea: lähetetään kvantisoitujen näytteiden sijasta niiden väliset erotukset. Tämän pitäisi toimia jos erotukset ovat keskimäärin pienempiä kuin näytteet,
jolloin niiden vaatima dynaaminen alue on pienempi, eli samalla bittimäärällä voidaan käyttää pienempää kvantisointiaskelta, joka luonnollisesti pienentää kvantisointivirhettä. Itse asiassa erosignaalin s(n) s(n 1) teho on E { (s(n) s(n 1)) 2} = E{s(n) 2 } 2E{s(n)s(n 1)} E{s(n 1) 2 } = r(0) 2r(1) r(0) = 2 (r(0) r(1)), missä r(k) on puheen autokorrelaatio viiveellä k. Puheen teho taas on r(0), joten erosignaalin teho on pienempi kuin puheen jos r(1) > 0.5. Puheelle on yleisesti r(1) r(0) > 0.85. Tarkastellaan kuvion 1.3 mukaista DPCM-kvantisointia, jossa lasketaan sisäänmenon peräkkäisten näytteiden erotus d(n) joka kvantisoidaan ja lähetetään. Kvantisointi on mallinnettu kvantisointikohinan q(n) lisäämisellä. Vastaanottimessa erotukset vastaavasti summataan. q(n) r(0) 7 x(n) - d(n) u(n) y(n) -1-1 z Kuvio 1.3: Avoin DPCM-kvantisoija, jossa ennustus on ŝ(n) = s(n 1). Kvantisointikohina on mallinnettu lisättynä kohinalähteenä q(n). Tällä menetelmällä on kuitenkin vakava puute: kvantisointikohina summautuu vastaanottimessa. Katsotaanpa miten. Kuviosta saadaan (ottamalla signaalien z- muunnokset) D(z) = X(z)( ), U(z) = D(z) Q(z), Y (z) = U(z) z 1 Y (z) z
8 LUKU 1. PUHEEN KOODAUS eli Edelleen sijoittamalla Y (z) = Y (z) = U(z). = U(z) D(z) Q(z) = X(z)(1 z 1 ) Q(z) = X(z) Q(z). Suodattimen 1 1 z 1 impulssivaste on yksikköaskel eli kvantisointikohina summautuu, joten periaatteessa kohinan vaikutus voi kasvaa vastaanottimessa mielivaltaisen suureksi (saturointi luonnollisesti estää tämän käytännössä). Edellisen tapaista järjestelmää, jossa kvantisointi tehdään alkuperäisen signaalin pohjalta, sanotaan avoimeksi (open-loop). Vaihtoehto on suljettu järjestelmä (closed-loop), jossa kvantisointi tehdään dekoodatun signaalin perusteella. Suljetuilla järjestelmillä on se tärkeä ominaisuus, että kvantisointikohina ei summaudu vastaanottimessa, koska kooderissa valitaan kvantisoitu näyte siten että dekoodattu signaali on mahdollisimman hyvä. Tämä on oleellinen piirre myöhemmin esitettävissä synteesi-analyysi koodekeissa. Esimerkki sovellettuna DPCMkvantisointiin on kuvassa 1.4. q(n) x(n) ^ x(n) - ~ e(n) y(n) ~ x(n) z -1 z -1 Kuvio 1.4: Suljettu DPCM-kvantisoija, jossa ennustaja on z 1. Kvantisointikohina ei summaudu vastaanottimessa. Lasketaan seuraavaksi suljetun DPCM-kvantisoijan siirtofunktio. Kuviosta Ẽ(z) = X(z) ˆX(z) Q(z),
9 X(z) = z 1 X(z) Ẽ(z) eli X(z) = Ẽ(z), ˆX(z) = z 1 X(z), Y (z) = Signaalien tulkinnat ovat seuraavat: Ẽ(z): kvantisoitu residuaalivirhe X(z): rekonstruoitu signaali Ẽ(z). ˆX(z): ennustus rekonstruktion perusteella Edellisistä kaavoista (tai suoraan kuviosta) havaitaan, että Y (z) = X(z), eli siis kooderiin sisältyy dekooderi. Lasketaan vielä X(z): josta seuraa X(z) = Ẽ(z) = X(z) ˆX(z) Q(z) = X(z) z 1 X(z) Q(z) X(z) = 1 X(z) Q(z) 1 z 1 1 z 1 = ( ) = X(z) Q(z), X(z) Q(z) kuten pitääkin. Seuraava parannus DPCM-koodekkiin on käyttää yksinkertaisen erotuksen sijasta monimutkaisempaa ennustusta. Suodatin z 1 voidaan ajatella ennustajaksi ˆx(n) = x(n 1),
10 LUKU 1. PUHEEN KOODAUS jossa siis ennustetaan seuraavaa näytettä edellisellä. Suljetun järjestelmän tapauksessa oikeastaan ˆx(n) = x(n 1), jossa ennustus tehdään siis dekoodatun arvon perusteella. Korvattaessa ennustaja z 1 suodattimella P(z) = p(1)z 1... p(n)z n koodekin vuokaavio löytyy kuviosta 1.5. Kuvio 1.5: Suljettu DPCM-kvantisoija ennustajalla P(z) = p(1)z 1... p(n)z n. Huomaa että ennustajalla ei ole vakiotermiä. Käyttämällä parempaa ennustavaa suodatinta saadaan ennustusvirheen tehoa pienennettyä, jolloin kvantisointi voidaan tehdä vähemmillä biteillä. Tarkoitukseen sopivan ennustaja voidaan määrittää lineaarisen ennustuksen avulla ja se riippuu ainoastaan puheen (keskimääräisestä) autokorrelaatiofunktiosta. Tämä taas voidaan estimoida kohtuullisesta määrästä puhedataa. Jo toisen asteen ennustaja pienentää kohinan tehoa n. 6 db, jolloin sama signaali/kohina-suhde saavutetaan lähettämällä 1 bpn (eli 8000 bps) vähemmän kuin ilman ennustajaa.