Puheenkoodaus Olivatpa kerran iloiset serkukset PCM, DPCM ja ADPCM
PCM eli pulssikoodimodulaatio Koodaa jokaisen signaalinäytteen binääriseksi (eli vain ykkösiä ja nollia sisältäväksi) luvuksi kvantisointitasolle, jonka rekonstruoitu Arvo riippuu: käytössä olevien bittien lukumäärästä käytössä olevasta dynaamisesta alueesta
* Perus PCM -dynaaminen alue [-1 1] -tämä dynaaminen alue jaetaan tasavälisesti bittien lukumäärän mukaan (N = 2^bits) * PCM epätasavälisella kvantisoinnilla: -dynaaminen alue [-1 1] - signaaliarvojen jakaumaa tasoitetaan jollakin sopivalla funktiolla ennen kvantisointia: -- Euroopan lankapuhelinverkossa A-law-kompandointi -- Pohjois-Amerikassa µ-law-kompandointi * PCM adaptiivisella kvantisointiaskeleella - Dynaamista aluetta säädetään aina edellisen näytearvon perusteella niin, että bitit olisivat mahdollisimman optimaalisessa käytössä.
Kompandointi Kompressioparametri A on yleensä Euroopassa 87.7
Voisiko ajatella, että koodattaisiin signaaliarvojen sijaan peräkkäisten signaaliarvojen erotus? * Jotta siinä olisi järkeä, pitäisi tuon erotuksen olla yleisesti ottaen pienempi kuin signaaliarvo. * Silloin erotus saataisiin koodattua samalla bittimäärällä tarkemmin kuin alkuperäinen signaaliarvo.
Korreloivatko puhesignaalin peräkkäiset näytteet kun Fs = 8000Hz?
Matemaattisesti: *Signaalinäytteen suuruus = s(n) *Peräkkäisten näytteiden erotuksen suuruus = s(n-1) - s(n) Näiden käyttäytymistä voidaan verrata esimerkiksi energian lausekkeiden avulla: * Signaalin energia E(s) = Σ s(n)² = r(0) * Erotuksen energia E(erotus) = Σ(s(n-1)-s(n))²
Erotussignaalin energia: E(erotus) = Σ ( s(n-1) s(n) )² = Σ ( s(n-1)² - 2*s(n-1)s(n) + s(n)² ) = Σ s(n-1)² - 2*Σs(n-1)s(n) + Σs(n)² = r(0) - 2*r(1) + r(0) = 2*( r(0) - r(1) ) Tämä on pienempi kuin signaalin energia ( r(0) ), jos: 2*( r(0) - r(1) ) < r(0) r(1) > 0.5*r(0) Yleisesti puheelle (Fs = 8kHz) on mitattu r(1) > 0.85*r(0), joten on perusteltua koodata signaaliarvojen erotuksia alkuperäisten arvojen sijaan.
Differentiaalinen PCM, versio 1 s_out(n) = u(n) + s_out(n-1) = d(n) + q(n) + s_out(n-1) = s(n) s(n-1) + s_out(n-1) + q(n) = s(n) s(n-1) + s(n-1) s(n-2) + s_out(n-2) + q(n-1) + q(n) = s(n) s(n-2) + s_out(n-2) + q(n-1) + q(n) = s(n) s(n-2) + s(n-2) s(n-3) + s_out(n-3) + q(n-2)+ q(n-1)+q(n) = s(n) s(n-3) + s_out(n-3) + q(n-2)+q(n-1)+q(n) = Kun vastaanottopäässä saadaan erotussignaali u(n), jossa on virheittä kvantisoinnista, niin tämä virhe vaikuttaa kaikkiin ulostulossa dekoodattuihin arvoihin siitä eteenpäin!!!
Sama taajuustasossa: S_out(z) = S(z) S(z)*zˉ¹ + Q(z) + S_out(z)*zˉ¹ S_out(z) ( 1 zˉ¹ ) = S(z)(1 zˉ¹) + Q(z) S_out(z) = S(z)(1 zˉ¹) / ( 1 zˉ¹ ) + Q(z) / ( 1 zˉ¹ ) S_out(z) = S(z) + Q(z) / ( 1 zˉ¹ ) Dekooderin ulostulossa on siis alkuperäisen signaalin lisäksi kvantisointivirhe Q(z), joka on mennyt järjestelmän 1/( 1 zˉ¹ ) läpi. * 1/( 1 zˉ¹ ) on askelfunktion impulssivaste!! Eli?
DPCM, versio 2 IDEA: Käytetään erotuksen laskemisessa dekoodattua signaaliarvoa s_out(n-1) alkuperäisen s(n-1):n sijaan. s_out(n) = e(n) + s_out(n-1) = s(n) s_out(n-1) + q(n) + s_out(n-1) = s(n) + q(n) Tässä järjestelmässä ulostulossa vaikuttaa vain tämän hetkinen kvantisointivirheen arvo, eivät enää edelliset.
DPCM, versio 2 Sama taajuustasossa: S_out(z) = E(z) + S_out(z)*zˉ¹ S_out(z) = S(z) S_out(z)*zˉ¹ + Q(z) + S_out(z)*zˉ¹ S_out(z) = S(z) + Q(z) Dekooderin ulostulossa on siis alkuperäisen signaalin lisäksi kvantisointivirhe Q(z) sellaisenaan.
DPCM versio 2: vaihdetaan hieman näkökulmaa: ajatellaan, että edellinen näytearvo on estimaatti uudesta signaaliarvosta Eli merkitään: s_pred(n) = s_out(n-1) Differenssiyhtälö aikatasossa (n): Ja tajuustasossa (z): s_out(n) = e(n) + s_pred(n) S_out(z) = E(z) + S_pred(z) = s(n) s_pred(n) + q(n) + s_pred(n) = s(n) + q(n) S_out(z) = S(z) + Q(z)
DPCM, versio 3 IDEA: Edellisen version estimaatti voidaan korvata millä funktiolla P(z) tahansa!! *P(z) voi olla esim LPC-tyyppinen ennustaja!
AdaptiivinenDifferentiaalinenPCM eteenpäin adaptoinnilla * Tehdään LP-analyysi kehyksittäin. * Lähetetään LP-kertoimet myös vastaanottimeen.
Algoritminen viive * LP analyysiin käytetään näytekehystä, jonka reunat on pyöristetty. * Näillä LP-kertoimilla tuotetaan kehyksen tasaisen keskiosan näytteet y_pred(0 :100). Analyysi tarvitsee siis sisääntulevasta signaalista näytteet s(-30:130), eli 130 uutta näytettä -> ALGORITMINEN VIIVE on siis 130 näytettä eli 16,3ms jos Fs = 8kHz.
ADPCM taaksepäin adaptoinnilla Tehdään LP-analyysi erikseen sekä lähettimessä, että vastaanottimessa. * Mitään kertoimia ei tarvitse lähettää. * ALGORITMINEN VIIVE on nolla!
Käsittelimme siis aaltomuotokoodauksia: PCM, DPCM, ADPCM seuraavaksi tutustumme synteesi-analyysi -koodaukseen
Synteesi-analyysi -koodaus Englanniksi: AbS analysis by synthesis Kutsutaan myös nimellä CELP - code exited linear prediction Askel kohti synteesi-analyysi-koodausta: Multipulse koodekki 1. LP-analysoidaan signaalikehys ja lähetetään LP-kertoimet A(z) 2. Tuotetaan keinotekoinen heräte/glottis signaali siten, että rekonstruktio puhesignaalista S(z) = G(z) / A(z) on mahdollisimman hyvä, ja lähetetään se.
Synteesi-analyysi koodekin rakenne
Vektorikvantisointi * Käytetään kirjastoa (=koodikirjaa), josta valitaan lähinnä kvantisoitavaa vektoria vastaava elementti, ja lähetetään vain tämän indeksinumero * Vektorikvantisointia voidaan käyttää: - Keinotekoisen herätesignaalin lähettämisessä - LPC-informaation lähettämisessä => ositettu vektorikvantisointi LSF:ille