LARI KUMPU ADPCM:N KÄYTTÖ ÄÄNEN HÄVIÖTTÖMÄSSÄ PAKKAUKSESSA

Samankaltaiset tiedostot
Puheenkoodaus. Olivatpa kerran iloiset serkukset. PCM, DPCM ja ADPCM

puheen laatu kärsii koodauksesta mahdollisimman vähän. puhe pakkautuu mahdollisimman pieneen määrään bittejä.

AV-muotojen migraatiotyöpaja - ääni. KDK-pitkäaikaissäilytys seminaari / Juha Lehtonen

Ongelma 1: Onko datassa tai informaatiossa päällekkäisyyttä?

T DSP: GSM codec

Kuvan pakkaus JPEG (Joint Photographic Experts Group)

Puheenkoodaus. koodekki toimii hyvin myös kohinaiselle puheelle (ja mielellään vielä musiikille ja muille yleisille signaaleille)

Laskuharjoitus 4 ( ): Tehtävien vastauksia

MICHAEL SITTIG ÄÄNEN HÄVIÖTÖN PAKKAAMINEN. Kandidaatintyö

Alla olevassa kuvassa on millisekunnin verran äänitaajuisen signaalin aaltomuotoa. Pystyakselilla on jännite voltteina.

TL5503 DSK, laboraatiot (1.5 op) Audiosignaalit (ver 1.0) Jyrki Laitinen

Digitaalinen audio & video I

Juha Henriksson. Digitaalinen äänentallennus Dr. Juha Henriksson Finnish Jazz & Pop Archive

Johdanto tieto- viestintäteknologian käyttöön: Äänitystekniikka. Vfo135 ja Vfp124 Martti Vainio

Digitaalinen audio & video, osa I

ELEC-C5070 Elektroniikkapaja (5 op)

SGN-4051 Puheenkoodaus

Synteesi-analyysi koodaus

Digitaalinen audio & video, osa I. Johdanto. Digitaalisen audion sovellusalueet. Johdanto. Taajuusalue. Psykoakustiikka. Johdanto Digitaalinen audio

SGN-1251 Signaalinkäsittelyn sovellukset Välikoe Heikki Huttunen

Dynamiikan hallinta Lähde: Zölzer. Digital audio signal processing. Wiley & Sons, Zölzer (ed.) DAFX Digital Audio Effects. Wiley & Sons, 2002.

1 Diskreettiaikainen näytteistys. 1.1 Laskostuminen. Laskostuminen

Digitaalitekniikan matematiikka Luku 1 Sivu 1 (19) Johdatus digitaalitekniikkaan

THE audio feature: MFCC. Mel Frequency Cepstral Coefficients

Kompleksiluvut signaalin taajuusjakauman arvioinnissa

Flash AD-muunnin. Ominaisuudet. +nopea -> voidaan käyttää korkeataajuuksisen signaalin muuntamiseen (GHz) +yksinkertainen

1 Johdanto. Johdanto Vaatimuksia audiokoodekille. Johdanto 1.1 Vaatimuksia audiokoodekille

Digitaalinen Audio & Video I

Signaalien datamuunnokset. Digitaalitekniikan edut

Signaalien datamuunnokset

AV-muotojen migraatiotyöpaja - video. KDK-pitkäaikaissäilytys seminaari / Juha Lehtonen

Laskuharjoitus 2 ( ): Tehtävien vastauksia

Successive approximation AD-muunnin

Tekniikka ja liikenne (5) Tietoliikennetekniikan laboratorio

ELEC-C7230 Tietoliikenteen siirtomenetelmät

Signaalien generointi

Mediaanisuodattimet. Tähän asti käsitellyt suodattimet ovat olleet lineaarisia. Niille on tyypillistä, että. niiden ominaisuudet tunnetaan hyvin

TL5503 DSK, laboraatiot (1.5 op) Suodatus 1 (ver 1.0) Jyrki Laitinen

IIR-suodattimissa ongelmat korostuvat, koska takaisinkytkennästä seuraa virheiden kertautuminen ja joissakin tapauksissa myös vahvistuminen.

1 Johdanto. Tiedonsiirron kaistanleveys kasvaa jatkuvasti, mutta kaistan tarve kasvaa vielä enemmän tarve kompressiotekniikoille

Kuulon malleihin perustuva audiokoodaus, osa II

1 Todellisia koodausjärjestelmiä: MPEG Audio 1 ja MPEG ensimmäinen sukupolvi. MPEG Audio 1 ja 2. Sisältö:

SGN Signaalinkäsittelyn perusteet Välikoe Heikki Huttunen

Algoritmit 2. Luento 9 Ti Timo Männikkö

Matematiikka ja teknologia, kevät 2011

Matias Sumanen Mittaussignaalin häviötön pakkaaminen. Kandidaatintyö

SGN-4200 Digitaalinen audio

Suodatus ja näytteistys, kertaus

1 Määrittele seuraavat langattoman tiedonsiirron käsitteet.

Digitaalinen audio

1. Määritä pienin näytelauseen ehdon mukainen näytetaajuus taajuus seuraaville signaaleille:

Puhetie, PCM järjestelmä, johtokoodi

S Laskennallinen Neurotiede

Matlab-tietokoneharjoitus

ELEC-C Sovellettu digitaalinen signaalinkäsittely. Äänisignaalien näytteenotto ja kvantisointi Dither Oskillaattorit Digitaalinen suodatus

Virheen kasautumislaki

SGN-1200 Signaalinkäsittelyn menetelmät, Tentti

SGN-1200 Signaalinkäsittelyn menetelmät, Tentti

1. Perusteita Äänen fysiikkaa. Ääniaalto. Aallonpituus ja amplitudi. Taajuus (frequency) Äänen nopeus

Digitaalinen tiedonsiirto ja siirtotiet

Muuntavat analogisen signaalin digitaaliseksi Vertaa sisääntulevaa signaalia referenssijännitteeseen Sarja- tai rinnakkaismuotoinen Tyypilliset

A/D-muuntimia. Flash ADC

VÄRISPEKTRIKUVIEN TEHOKAS SIIRTO TIETOVERKOISSA

SGN Signaalinkäsittelyn perusteet Välikoe Heikki Huttunen

TL5503 DSK, laboraatiot (1.5 op) Suodatus 2 (ver 1.0) Jyrki Laitinen

SGN-1200 Signaalinkäsittelyn menetelmät Välikoe

Tuntematon järjestelmä. Adaptiivinen suodatin

SGN-1200 Signaalinkäsittelyn menetelmät, Tentti

1 Olkoon suodattimen vaatimusmäärittely seuraava:

Tilastollinen vastepintamallinnus: kokeiden suunnittelu, regressiomallin analyysi, ja vasteen optimointi. Esimerkit laskettu JMP:llä

JATKUVAN AWGN-KANAVAN KAPASITEETTI SHANNON-HARTLEY -LAKI

Digitaalinen signaalinkäsittely Kuvankäsittely

Digitaalinen signaalinkäsittely Desibeliasteikko, suotimen suunnittelu

SGN-4200 Digitaalinen Audio Harjoitustyö-info

Pianon äänten parametrinen synteesi

Digitaalitekniikan matematiikka Luku 13 Sivu 1 (10) Virheen havaitseminen ja korjaus

AD/DA muunnos Lähteet: Pohlman. (1995). Principles of digital audio (3rd ed). Zölzer. (1997). Digital audio signal processing

Pörisevä tietokone. morsetusta äänikortilla ja mikrofonilla

Algoritmit 2. Luento 10 To Timo Männikkö

Ohjelmistoradio tehtävät 4. P1: Ekvalisointi ja demodulaatio. OFDM-symbolien generoiminen

LOPPURAPORTTI Lämpötilahälytin Hans Baumgartner xxxxxxx nimi nimi

Digitaalinen tiedonsiirto ja siirtotiet. OSI-kerrokset

MS-A0204 Differentiaali- ja integraalilaskenta 2 (ELEC2) Luento 7: Pienimmän neliösumman menetelmä ja Newtonin menetelmä.

11. kierros. 1. Lähipäivä

Matematiikan tukikurssi

1 Vastaa seuraaviin. b) Taajuusvasteen

Dynaamisten systeemien identifiointi 1/2

Kanavointi ja PCM järjestelmä

TL5503 DSK, laboraatiot (1.5 op) Kuvasignaalit. Jyrki Laitinen

6.8 Erityisfunktioiden sovelluksia

Algebralliset menetelmät virheenkorjauskoodin tunnistamisessa

Säätötekniikan matematiikan verkkokurssi, Matlab tehtäviä ja vastauksia

Inversio-ongelmien laskennallinen peruskurssi Luento 4

6. Analogisen signaalin liittäminen mikroprosessoriin Näytteenotto analogisesta signaalista DA-muuntimet 4

S Laskennallinen Neurotiede

SGN-1200 Signaalinkäsittelyn menetelmät, Tentti

Luku- ja merkkikoodit. Digitaalitekniikan matematiikka Luku 12 Sivu 1 (15)

Signaalinkäsittelyn sovellukset

Numeeriset menetelmät

Spektri- ja signaalianalysaattorit

Transkriptio:

LARI KUMPU ADPCM:N KÄYTTÖ ÄÄNEN HÄVIÖTTÖMÄSSÄ PAKKAUKSESSA Kandidaatintyö Tarkastaja: lehtori Konsta Koppinen Työ jätetty tarkastettavaksi 19. joulukuuta 2010

ii TIIVISTELMÄ TAMPEREEN TEKNILLINEN YLIOPISTO Tietotekniikan koulutusohjelma KUMPU, LARI: ADPCM:n käyttö äänen häviöttömässä pakkauksessa Kandidaatintyö, 20 sivua, 5 liitesivua Joulukuu 2010 Pääaine: Signaalinkäsittely ja multimedia Tarkastaja: lehtori Konsta Koppinen Avainsanat: PCM, DPCM, ADPCM, Äänen häviötön pakkaus, äänen häviöllinen pakkaus, MP3, FLAC, G.726 Äänisignaalin digitalisoimisesta lähtien on kehitetty menetelmiä parantaa signaalien laatua tai saada ne pakattua pienempään tilaan. Perinteiset pakkausmenetelmät eivät toimi puhe- tai musiikkisignaaleille niiden nopeiden amplitudimuutosten takia, jonka vuoksi niille on kehitetty omia pakkausalgoritmeja. Tämä työ selvittää audiokoodauksen taustoja, jotka ovat mahdollistaneet häviölliset ja häviöttömät pakkausalgoritmit, sekä käy perusperiaatteet läpi näistä pakkausmetodeista. Lisäksi lopussa esitellään G.726 puhekoodekin toiminta ja sen omakohtainen toteutus Matlab-ohjelmistolla.

iii ALKUSANAT Tämä työ on tehty Tampereen teknillisen yliopiston signaalinkäsittelyn laitoksen kandidaatintyöseminaaria varten syksyllä 2010. Suuret kiitokset ohjaajalleni Konsta Koppiselle, joka oli suurena apuna läpi seminaarin. 19. joulukuuta 2010

iv SISÄLLYS Termit ja niiden määritelmät... v 1 Johdanto... 1 2 Audiosignaalin koodaaminen... 2 2.1 Koodaamisen historiaa... 2 2.2 PCM... 2 2.3 DPCM... 4 2.3.1 Avoin DPCM-koodekki... 4 2.3.2 Suljettu DPCM-koodekki... 5 2.4 ADPCM... 6 3 Äänen pakkaaminen... 7 3.1 Häviöllinen pakkaus ja MP3-formaatti... 7 3.2 Häviötön pakkaus ja FLAC-formaatti... 10 4 G.726... 12 5 ADPCM-koodekin toteutus Matlabilla... 13 6 Tulokset ja johtopäätökset... 16 Lähteet... 19 Liite 1: Matlab-koodi... 21

v TERMIT JA NIIDEN MÄÄRITELMÄT PCM kvantisointi koodekki enkooderi dekooderi Pulssikoodimodulaatio, menetelmä jolla analoginen signaali muunnetaan digitaaliseksi. Jatkuva-aikaisen signaalin muuntaminen diskreettiin tasoon vastaamaan tiettyä tasoa, tietyllä ajanhetkellä. Ohjelmisto, joka mahdollistaa tiedostojen muuntamisen tiettyyn formaattiin tai niiden toiston tietokoneella. Koodekin osa, jolla muunnetaan tiedosto tai signaali formaatista toiseen. Koodekin osa, jolla puretaan enkooderilla saatu tiedosto toistettavaan muotoon.

1 1 JOHDANTO Äänidatan ja datan pakkaamisessa yleensäkin, on tarkoituksena saada haluttu tiedosto pienempään tilaan ilman, että siitä häviää oleellista informaatiota. Pakkaamiseen käytetyt algoritmit jaetaan kahteen luokkaan; häviöttömät ja häviölliset. Häviöllisillä algoritmeilla pakkaussuhde on huomattavasti suurempi ja ne ovat yleensä laskennallisesti kevyempiä toteuttaa, joten niitä käytetään usein kaupallisissa tuotteissa. Häviöttömillä algoritmeilla pakkaussuhde on pienempi, mutta pakattu signaali on laadultaan korkeampi, lähes identtinen alkuperäisen suhteen. Häviöttömät ja häviölliset koodekit muodostuvat enkooderista ja dekooderista. Enkooderista saatu signaali pakataan lyhyempään esitysmuotoon ja lähetetään dekooderille joka osaa esittää pakatun signaalin alkuperäistä vastaavana. Työssäni perehdyn tarkemmin jo digitaalisessa muodossa oleviin audiosignaaleihin, niiden koodaukseen ja pakkaamiseen. Käyn läpi kolme eri tapaa jolla äänisignaalin voidaan koodata, äänen häviöllisen ja häviöttömän pakkauksen ja lopuksi otan katsauksen standardisoituun G.726 koodekkiin, jota käytetään muun muassa kansainvälisten puheluiden siirtoon. Lisäksi toteutan itse ADPCM-koodekin Matlab-ohjelmistolla, sekä vertailen sen toimintaa puhe- ja musiikkitiedostoilla.

2 2 AUDIOSIGNAALIN KOODAAMINEN Tässä luvussa käydään läpi audiosignaalin koodaamisen historiaa ja kolme menetelmää, jolla audiosignaali voidaan koodata. 2.1 Koodaamisen historiaa Ensimmäiset digitaaliset ääninauhoitteet ovat peräisin 70-luvulta ja ne nauhoitti Thomas Stockham itse kehittämällään laitteella, josta tuli ensimmäinen laite, jota oli saatavilla kaupallisilla markkinoilla. Tämä ei olisi ollut kuitenkaan mahdollista ilman brittiläisen tiedemiehen Alec Reevesin patenttia, jossa kuvattiin PCM:n eli pulssikoodimodulaation teoria vuonna 1937 [1]. Vaikkakin toinen tiedemies, Paul M. Rainey oli jo ideoinut PCM:n toteutuksen jo muutamaa vuotta aiemmin. [2] 2.2 PCM Pulssikoodimodulaatio on menetelmä, jolla analoginen signaali muutetaan digitaaliseksi signaaliksi. PCM:ssä signaali näytteistetään tietyn ajan välein ja näytteet kvantisoidaan vastaamaan tiettyä tasoa. Alun perin PCM:ää käytettiin digitaalisissa puhelinverkoissa, mutta nykyään se on myös käytössä ammattilaisten äänenkäsittelyjärjestelmissä. Digitaaliseen puhelinverkkoon PCM-koodaus on standardisoitu G.711 koodekkiin, josta on kaksi eri variaatiota, jotka kuitenkin eroavat toisistaan vain hieman. Ero johtuu eri puolella maailmaa käytettävästä linjakoodauksesta. Pohjois-Amerikassa ja Japanissa käytetään µ-law koodausta, kun taas Euroopassa ja suurimmassa osasta muuta maailmaa käytetään A-law koodausta. Ensimmäinen PCM-koodausta käyttänyt digitaalinen puhesignaalin lähetys tapahtui liittoutuneiden toimesta toisen maailmansodan aikaan. PCM:n tietovirrassa on kaksi perustavaa attribuuttia, jotka määräävät muutetun signaalin laadun. Näytteistystaajuus määrittää kuinka monta kertaa sekunnissa otetaan alkuperäisestä signaalista näyte ja bittisyvyys joka määrittää kuinka monta kvantisointitasoa on käytettävissä. Mitä suurempi näytteistystaajuus ja pienempi bittisyvyys, sitä huonompi on PCM:n muodostaman signaalin laatu.

3 Kuva 1 Sinisignaali ja sen diskreetti esitys PCM:llä [3] Kuvassa sinisignaali on punaisella ja harmaa alue on 4-bittisellä PCM-muunnoksella saatu diskreetti esitys. PCM:n tasavälinen näytteistys näkyy kuvan alalaidassa olevilla pystyviivoilla ja 4-bittinen kvantisointi y-akselin arvoina 0-15. Lisäksi kuvan signaalia kvantisoidessa on käytetty lattiafunktiota, joka pyöristää tuloksen signaalia kvantisoidessa aina alaspäin. [3] Signaalia kvantisoidessa siihen muodostuu kvantisointivirhettä. Alkuperäinen signaali voidaan esittää kaavalla s o (n) = s(n) + q(n). (2.2), jossa s o (n) on alkuperäinen signaali, s(n) kvantisoitu signaali ja q(n) on kvantisointivirhe. Kvantisointivirhe on erotus todellisen analogisen arvon ja lähimpään kvantisoituun tasoon pyöristetyn arvon välillä. Jos signaalin dynamiikan voidaan ajatella olevan välillä [-1 1], kvantisointikohinaa voidaan mallintaa tasajakautuneesti kaavalla e q (ε) = 1/Δ, - Δ/2 ε Δ/2. (2.3), missä Δ on eli kvantisointiaskel ja R on kvantisointiin käytettävien bittien määrä. Kuitenkin parempi tapa kuvata PCM-muunnoksen laatua on laskea hyötysignaalin ja kohinan tehojen suhde eli signaali/kohinasuhde. SNR eli signal-to-noise ratio lasketaan kaavalla SNR = 10 log 10 S/E. (2.4)

4, jossa S on hyötysignaalin keskimääräinen teho ja E kohinan keskimääräinen teho. Tuloksena saatu luku esitetään desibeleissä. SNR:n ollessa logaritminen hyötysignaalin kasvaessa kymmenkertaiseksi, SNR kasvaa kymmenellä [4]. Mitä suurempi SNR, sen parempi on muunnoksen laatu. PCM-muunnosta on kehitetty vuosien mittaan ja muutama menetelmä tullaan esittämään seuraavissa kappaleissa. 2.3 DPCM Differentiaalinen pulssikoodimodulaatio eli DPCM kehitettiin PCM:n pohjalta C. Cutlerin toimesta vuonna 1950. DPCM-koodekki käyttää perustana PCM-koodekkia, mutta siihen on lisätty toiminnallisuuksia, jotka parantavat koodekin suorituskykyä ja pienentävät muutetun signaalin siirtokaistan suuruutta. [5] Toisin kuten PCM:ssä, jossa kvantisoidut näytteet lähetetään vastaanottimeen, DPCM:ssä lasketaan kvantisoitujen näytteiden erotukset ja ne lähetetään eteenpäin vastaanottimeen. Tämä pienentää kvantisointiin tarvittavien bittien määrää ja sitä kautta signaalin lähettämiseen vaadittavaa siirtokaistaa sillä oletuksella, että erotukset ovat keskimääräisesti pienempiä kuin näytteet, josta erotukset lasketaan. DPCM-koodekki voidaan toteuttaa kahdella eri tavalla; avoimessa järjestelmässä näytteestä ja sitä edeltävästä näytteestä lasketaan erotus, joka kvantisoidaan ja lähetetään vastaanottimeen. Tämä toteutus voi aiheuttaa vastaanottimessa kvantisointikohinan summautumisen ja sen kasvun mielivaltaisen suureksi. Suljetussa järjestelmässä käytetään synteesi-analyysi-menetelmää, jossa kvantisointi tehdään dekoodatulle signaalille. Kooderissa valitaan kvantisoitu näyte siten, että dekoodattu signaali olisi mahdollisimman hyvä. [4] 2.3.1 Avoin DPCM-koodekki Lasketaan kvantisoitava näyte kaavalla e[n] = x[n] x[n-1]. (2.5), jossa x[n] on viimeksi sisääntullut näyte ja x[n-1] on sitä edeltävä näyte. e q [n] on tämän erotuksen kvantisoitu näyte. Kuva 2 Avoimen DPCM-koodekin kooderin lohkokaavio Dekooderissa alkuperäinen näyte saadaan rakennettua, kun vastaanotetulle näytteelle tehdään päinvastainen toimenpide kuin kooderissa. Tähän pätee kaava [n] = e q [n] + [n-1]. (2.6), jossa [n] on dekoodattu näyte, [n-1] sitä edeltävä dekoodattu näyte ja e q [n] juuri laskettu kvantisoitu näyte.

5 Kuva 3 Avoimen DPCM-koodekin dekooderin lohkokaavio Kuten lohkokaaviosta näkee, edellinen dekoodattu näyte lisätään kvantisoituun näytteeseen, koska kvantisoitu näyte ja dekoodattu näyte sisältävät kvantisointikohinaa voi tämä johtaa kvantisointikohinan rajuun nousuun tulevilla näytteillä, jolloin koko signaali saattaa muuttua aivan liian kohinaiseksi. Suljetulla DPCM-koodekilla ei kuitenkaan tätä vaaraa ole. [5] 2.3.2 Suljettu DPCM-koodekki Suljetussa DPCM-koodekissa kohinan summautuminen estetään kvantisoimalla erotus nykyisen näytteen ja edellisen dekoodatun näytteen välillä, sen sijaan että se erotus laskettaisiin nykyisen ja edellisen näytteen välillä. Tämä tapahtuu kaavalla d[n] = x[n] [n-1]. (2.7), jossa x[n] on viimeksi saatu näyte, [n-1] on edellinen dekoodattu näyte. Tämä kuitenkin tarkoittaa sitä, että kooderissa täytyy laskea kvantisoitu näyte jota pyritään kuitenkin välttämään, koska näyte on yleensä isompi kuin kahden näytteen erotus. Kuva 4 Suljetun DPCM-koodekin enkooderin lohkokaavio Kvantisoitu erotus lähetetään edelleen dekooderille, jossa siihen lisätään edellinen kvantisoitu näyte, jotta alkuperäinen signaali saadaan muodostettua. Kuva 5 Suljetun DPCM-koodekin dekooderin lohkokaavio

6 Vaikkakin DPCM-koodaus mahdollisti signaalin koodaamisen pienemmällä bittimäärällä verrattuna PCM-koodaukseen, parannusta saatiin ottamalla käyttöön ADPCMkoodaus. 2.4 ADPCM ADPCM-koodaus kehitettiin 70-luvun alussa Bell Labs organisaation toimesta puheen koodausta varten [7]. Adaptiivinen differentiaalinen pulssikoodimodulaatio eroaa aiemmin esitellyistä pulssikoodimodulaatioista siten, että siinä pyritään ennustamaan tulevia näytteitä signaalista ja tätä kautta muokkaamaan ennustajan parametreja. Adaptiivinen ennustaja mahdollistaa pienemmän bittimäärän käytön signaalia kvantisoidessa. ADPCM-koodekki pystyy käyttämään 31, 15, seitsemää tai neljää eri tasoa kvantisoidessaan erotussignaalia. Tämä vastaavasti tarkoittaa, että kvantisoinnissa käytetään viittä, neljää, kolmea tai kahta bittiä. Jos ennustajan antama ennustus signaalista tai pikemminkin nykyisestä näytteestä signaalia on tarkka, ennustetun näytteen ja todellisen näytteen erotuksella on pienempi varianssi kuin todellisella näytteellä. Tällöin erotus voidaan kvantisoida pienemmällä määrällä bittejä kuin mitä vaatisi kvantisoida todellinen näyte. Vastaanottimessa kvantisoitu erotussignaali lisätään ennustettuun näytteeseen, jolloin saadaan rekonstruktuoitu signaali. [8] Ennustajan kertoimet täytyy tietää vastaanottimessa, jotta signaali voidaan muodostaa uudelleen. Kertoimet voidaan laskea, joko suoraan alkuperäisestä signaalista jolloin ne pitää lähettää sivuinformaationa vastaanottimeen. Tätä menetelmää kutsutaan eteenpäin-adaptoinniksi. Kertoimet voidaan myös laskea vasta vastaanottimessa jo syntetisoidusta signaalista, jolloin kyseessä on taaksepäin-adaptointi. [4, s. 13] Puheenkoodauksessa signaali voidaan jakaa kahteen eri lohkoon taajuuksien mukaan käyttämällä QMF-suodinta ennen ADPCM-muunnosta. Lohko, joka sisältää puheessa olevat taajuudet voidaan koodata suuremmalla bittimäärällä ja käyttää pienempää bittimäärää toiseen lohkoon. [7]

7 3 ÄÄNEN PAKKAAMINEN Tässä luvussa esittelen äänen häviöllisen ja häviöttömän pakkauksen menetelmiä ja eroja. Esittelen tarkemmin häviöllisistä pakkauksista MP3-formaatin ja häviöttömistä pakkauksista FLAC-formaatin. 3.1 Häviöllinen pakkaus ja MP3-formaatti Häviöllisessä pakkauksessa on tavoitteena saada pakattu signaali alkuperäistä pienempään tilaan, sen kuitenkaan menettämättä laatua huomattavasti. Tavalliset pakkausalgoritmit eivät toimi hyvin äänitiedostoille, jonka takia niitä varten on kehitetty omia algoritmeja. Sekä häviöttömät ja häviölliset pakkausalgoritmit käyttävät tiedon redundanssin poistoa hyväkseen pienentääkseen pakatun tiedoston kokoa. [9] Ihmisen kuuloaistin pohjalta luodut psykoakustiset mallit ovat edesauttaneet häviöllisten pakkausalgoritmien kehitystä ja tehokkuutta. Psykoakustiset mallit kuvaavat ihmisen kuuloaistin kykyä kuulla eri taajuuksia, sekä käyttäytymistä kovien äänien tapahtuessa. Ihminen pystyy tyypillisesti kuulemaan taajuuksia 20 Hz ja 20 KHz välillä, jonka takia audiosignaalia pakatessa näitä suuremmat ja pienemmät taajuudet voidaan jättää koodaamatta kokonaan. [10] Kuva 6 Ihmisen kuulokäyrä [10]

Ihmisen kuulo on herkin taajuuksille, jotka ovat 2000 Hz ja 4000 Hz välissä. Äänen pakkaamisessa tämä tarkoittaa sitä, että sellaiset taajuudet voidaan koodata pienemmällä bittimäärällä. Yleisesti ottaen, mitä korkeammalla käyrä on kyseisen taajuuden kohdalla, sitä enemmän on käytettävä bittejä signaalin koodaamiseen, jotta äänenlaatu ei huomattavasti laskisi. Toinen psykoakustiikan avulla huomattu ilmiö on peittoilmiö. Peittoilmiö tarkoittaa sitä, että jokin tietyn taajuuksinen ääni voi peittyä osaksi tai jopa kokonaan toisen kovemman äänen alle, mikäli äänten taajuusero on riittävän pieni. Äänen pakkaamisessa tämä tarkoittaa sitä, että tietyllä ajanhetkellä olevan tietyn taajuuksinen kovaäänisen impulssin lähellä olevat taajuudet voidaan koodata pienemmällä bittimäärällä. [11, s. 82] Vuonna 1993 julkaistu MP3-formaatti on varmasti kaikkein tutuin häviöttömän pakkauksen tiedostoformaatti. Internetin yleistyttyä 90-luvun puolivälin jälkeen MP3- tiedostojen määrä alkoi kasvaa nettisivujen ja vertaisverkkojen kautta. MP3-formaatti mahdollisti CD-laatuisten äänitiedostojen pakkaamisen 11 kertaa pienempään tilaan 128 kbit/s bittinopeudella. [12] MP3 tulee sanoista MPEG-1 Layer 3 ja formaatin kehitys alkoi Motion Picture Experts Groupin toimesta. Varsinaisen formaatin tekivät kuitenkin MPEG:n äänitiedostoihin perehtynyt aliryhmä, jossa oli useita insinöörejä eri instituuteista [13]. Ensimmäinen vedos formaattiin liittyen tehtiin vuonna 1991, se viimeisteltiin vuonna 1992 ja julkaistiin vuonna 1993. [12] Vaikka standardi ei tarkkaan kerro miten MP3:n enkoodaus tapahtuu, se antaa esimerkkejä miten se on tehty, joka on mahdollistanut useiden enkoodereiden ilmestymisen. Enkoodereiden valinta tuleekin päättää tapauskohtaisesti. Sen sijaan dekooderit ovat tarkkaan määriteltyjä standardissa, eri dekoodereiden ulostulojen pitää olla samoja tietyllä pyöristystarkkuudella. Dekoodereiden vertailu tapahtuukin niiden laskenta-ajan perusteella. [12] MP3-tiedostot voidaan luoda useilla eri bittinopeuksilla ja näytteistystaajuuksilla, jotka on esitelty taulukoissa 1 ja 2. 8

9 Taulukko 1 MP3-formaatin tuetut bittinopeudet (kbit/s) eri standardien mukaan MPEG-1 MPEG-2-8 - 16-24 32 32 40 40 48 48 56 56 64 64 80 80 96 96 112 112 128 128-144 160 160 192-224 - 256-320 - Taulukko 2 MP3-formaatin tuetut näytteistystaajuudet (Hz) eri standardien mukaan MPEG-1 MPEG-2-16000 - 22050-24000 32000-44100 - 48000 - Yleisimmin käytetty näytteistystaajuus MP3-tiedostoa luotaessa on 44100 Hz, koska se on sama näytteistystaajuus kuin CD:llä olevissa äänitiedostoissa. Lisäksi huomioitakoon bittinopeudet 128 kbit/s, 160 kbit/s ja 192kbit/s, koska niillä luodut MP3-tiedostot ovat pakkaussuhteiltaan suurin piirtein 11:1, 9:1 ja 7:1 verrattuna CD:llä olevien pakkaamattomien äänitiedostojen bittinopeuksiin. Joillakin enkoodereilla päästään jopa 640 kbit/s bittinopeuksiin, mutta standardin mukaan dekoodereiden täytyy pystyä purkamaan maksimissaan 320 kbit/s bittinopeuksilla tehdyt MP3-tiedostot. [12] Eri bittinopeuksien lisäksi MP3-tiedosto voidaan enkoodata kahdella eri tavalla. Voidaan käyttää joko samaa bittinopeutta läpi tiedoston, jolloin enkoodauksesta tulee nopeampaa ja helpompaa toteuttaa. Toinen tapa on käyttää vaihtelevaa bittinopeutta. Enkooderit, jotka käyttävät hyväkseen psykoakustisia malleja enkoodaavat äänitiedostot usein vaihtelevalla bittinopeudella. [12]

10 3.2 Häviötön pakkaus ja FLAC-formaatti Häviötön pakkaaminen tapahtuu yksinkertaistettuna kolmessa vaiheessa. Ensimmäisessä vaiheessa signaali, oli se sitten musiikkitiedosto tai puhesignaali, pilkotaan tasapituisiin lohkoihin, koska tällöin laskentatehovaatimukset pienenevät ja signaalin käsittelystä tulee nopeampaa. Jokaiseen lohkoon lisätään otsikkotiedot, joka sisältää pakkausalgoritmien parametrit, jotka muuttuvat signaalin muuttuessa. Lisäksi otsikkotietoihin voidaan lisätä tietoa lohkojen välisistä synkronoinneista ja multimediassa esim. kappaleen esittäjän tiedot. [14] Toisessa vaiheessa etsitään redundanssia näytteiden välillä lohkon sisällä. Häviöttömät pakkausalgoritmit käsittelevät stereosignaalien kanavat erillään toisistaan. Lähes kaikki häviöttömät koodekit käyttävät jonkinlaista lineaarista ennustusmallia etsiäkseen redundanssia. Lohkon näytteitä pyritään ennustamaan ja niitä verrataan alkuperäiseen signaaliin. Näiden erotuksena saadaan ennustusvirhe, joka yhdistettynä ennustajan parametreihin häviöttömästi pakattuna muodostavan lohkon signaalin. Ennustajan parametrit valitaan yleensä siten, että residuaalisignaalin keskineliövirhe olisi mahdollisimman pieni. Jotta vaadittava laskentateho ei kasvaisi liian suureksi, ennustajan kertoimet valitaan yleensä valmiista kirjastosta. Toinen tapa on käyttää alhaisella bittimäärällä tai häviöllisesti pakatun signaalin ja alkuperäisen signaalin erotusta, joka pakataan häviöttömästi, joka ei välttämättä johda hyviin lopputuloksiin. [14] Kolmannessa vaiheessa residuaalisignaaliin käytetään jotain entropiakoodausta, jolla pyritään poistamaan redundanssia entisestään. Häviöttömät koodekit käyttävät yleensä Huffman-koodausta, jakson pituuden mukaan tapahtuvaa koodausta tai Ricekoodausta [14]. Muitakin häviöttömiä pakkausalgoritmeja on olemassa ja monesti koodekit käyttävät useita häviöttömiä algoritmeja. Huffman-koodauksessa pakattava tieto esitetään symboleina ja niille muodostetaan kooditaulukko symbolien esiintymistiheyden mukaan. Mitä useammin symboli esiintyy datassa, sitä lyhyempi koodi [15]. Jakson pituuden mukaan tapahtuvassa koodauksessa datasta etsitään pitkiä sekvenssejä, jolloin siinä ei tapahdu muutoksia. Tämän perusteella muodostetaan koodi. Vaikkakin tämä algoritmi on käytössä usein tekstin tai kuvien pakkaamisessa, soveltuu se osin äänen pakkaamiseen esim. musiikkitiedostojen hiljaiset osuudet. Rice-koodaus toimii vähän samalla lailla, kuin Huffman-koodaus. Symboleille annetaan koodi esiintymistiheyden mukaan, mutta Rice-koodauksessa käytetään sitä tietoa hyväksi, että residuaalisignaali noudattaa monesti Laplacen tiheysjakamaa. Koodi muodostetaan residuaalisignaalin etumerkin, signaalin binääriesityksen vähiten merkitsevien bittien ja perättäisten nollien perusteella. [14] Koodien muodostuksen jälkeen lohko on valmis lähetettäväksi dekooderille, jossa lohko puretaan ja yhdistetään muihin lohkoihin ja täten muodostaen häviöttömästi pakatun, alkuperäistä vastaavan signaalin. FLAC:in eli Free Lossless Audio Codecin kehitys alkoi vuonna 2000 ja ensimmäinen versio siitä julkaistiin vuonna 2001. Se on häviötön audiokoodekki, jolla pystyy

pakkaamaan alkuperäisen signaalin jopa puoleen alkuperäisestä. FLAC käyttää useita eri häviöttömiä pakkausalgoritmeja muun muassa lineaarista ennustavaa koodausta ja Rice koodausta.[16] FLAC-tiedostoa luotaessa signaali jaetaan lohkoihin, jotka kaikki enkoodataan erikseen. Lohkon koko on tärkeä parametri pakkauksessa. Lohkon ollessa liian pieni, enkooderi laskee pakkaussuhdetta epäoptimaalisesti. Jos se on liian suuri, enkooderi ei osaa generoida tehokasta mallia lohkolle. FLAC-enkooderi voi myös käyttää hyväkseen kanavien välistä korrelaatiota parantaakseen pakkaussuhdetta, tämä toimii hyvin varsinkin tavallisille CD:n äänitiedostoille. [16] Lohkoihin jaon jälkeen enkooderi pyrkii ennustamaan signaalia, jotta voitaisiin laskea residuaalisignaali eli ennustetun signaalin ja todellisen signaalin erotus. Tämä siksi, että residuaalisignaalin enkoodaaminen vaatii vähemmän bittejä näytettä kohden kuin pelkän signaalin enkoodaaminen. Ennustaminen voi tapahtua kahdella eri tavalla. Enkooderi voi yrittää sovittaa polynomifunktiota signaaliin tai käyttää LPC-algoritmia eli lineaarista ennustavaa koodausta. Polynomifunktion sovittaminen on nopeampaa joskin epätarkempaa kuin LPC:n käyttö. [16] Residuaalisignaalin laskemisen jälkeen siihen käytetään Rice-koodausta, jolla etsitään optimaalinen parametri, joka noudattaa signaalin jakaumaa. Residuaalisignaali yleensä ottaen noudattaa Laplacen tiheysjakamaa ja Rice-koodaus on nopea ja tehokas tapa laskea jakauman parametri. Jakauman muuttuessa FLAC-enkooderi osaa aina laskea uuden optimaalisen parametrin. Dekooderiin lähetetään varsinaisen pakatun kehyksen lisäksi tiedot pakatun kehyksen tiedoista ja virheentarkistuskoodin. [16] FLAC-formaatti tukee näytteistystaajuuksia välillä 1 Hz 655350 Hz, jopa kahdeksaa äänikanavaa ja se käyttää 4-32 bittiä näytettä kohden[14]. Vaikkakin MP3- formaatilla on suuri tuki ohjelmisto- ja laitteistopuolella, on FLAC-formaatti kasvattamassa suosiotaan tallennuskapasiteetin noustessa ja laajakaistanopeuksien noustessa. 11

12 4 G.726 G.726-koodekki on vuonna 1990 standardisoitu puheenkoodauksessa käytetty koodekki, joka käyttää ADPCM:ää pakatakseen signaalin. G.726-koodekki on päivitetty versio vuonna 1984 standardisoidusta G.721-koodekista. Koodekki tekee muunnoksen 64 kbit/s A-law tai µ-law linjakoodatusta PCM-signaalista 16, 24, 32 tai 40 kbit/s signaaliksi. Yleisimmin käytetty bittinopeus on 32 kbit/s, koska se tuplaa tiedonsiirtokapasiteetin verrattuna G.711-koodekkiin ja silti se käyttää vain puolet siitä bittinopeudesta mitä G.711-koodekki käyttäisi. 32 kbit/s bittinopeutta käytetään kansainvälisissä puhelinverkoissa, bittinopeuksia 16 ja 24 kbit/s käytetään ylikuormittamaan DCME:tä käyttävissä laitteissa ja 40 kbit/s bittinopeutta käytetään modeemien tiedonsiirrossa. [17] Enkooderin ja dekooderin ADPCM-toiminta on esitetty luvussa 2.4. Lisäksi ennen kvantisointia, residuaalisignaalista otetaan kaksikantainen logaritmi ja siitä vähennetään jokaiselle näytteelle erikseen laskettava skaalauskerroin. Skaalauskerrointa muokataan summaamalla jokaiselle näytteelle laskettava nopean ja hitaan muutoksen muuttuja. G.726-koodekki käyttää signaalin ennustamiseen kahta suodatinta; yhtä toisen asteen suodinta ja yhtä kuudennen asteen suodinta. Kummankin suotimen kertoimia päivitetään yksinkertaistetulla gradienttialgoritmilla. Estimaatti saadaan laskemalla tulo toisen asteen suotimen kertoimien ja edellisen uudelleenmuodostettujen näytteiden kanssa ja lisäämällä tähän summa kuudennen asteen suotimen ja kvantisoidun näytteen tulosta kaavalla, missä. (4.1). (4.2) Kaavoissa a i :ssa on toisen asteen suotimen kertoimet, b i :ssa on kuudennen asteen suotimen kertoimet, d q on kvantisoitu näyte ja s r on aikaisemmilla kierroksilla uudelleen muodostettu näyte. Lopullinen näyte saadaan muodostettua summaamalla estimaatti ja kvantisoitu näyte kaavalla. (4.3)

13 5 ADPCM-KOODEKIN TOTEUTUS MATLABIL- LA Tässä luvussa esittelen tärkeimmät koodipätkät mitä tulee ADPCM-koodekin toteutukseen. Koodekki on koodattu mukaillen G.726-standardia ottaen kriittisimmät toteutukseen vaadittavat osat. Koko koodia en tässä luvussa esittele, mutta se löytyy liitteestä A. Ohjelma on toteutettu funktiona ja se käy signaalin läpi silmukassa näyte näytteeltä. Funktio ottaa käynnistysparametreiksi wav-muotoisen tiedoston joka pakataan, bittimäärän jota käytetään uudelleenmuodostetun signaalin luomiseen ja uudelleenmuodostettavan tiedoston nimen. Aluksi lasketaan estimaatti uudelle näytteelle suodinkertoimien, edellisten uudelleenmuodostettujen arvojen ja kvantisoitujen erotusten perusteella standardin määrittelemän 2-9 mukaan se(k) = 0; for i = 1:2, if ( k-i > 0) se(k) = se(k) + a_prev(i)*sr(k-i); sez(k) = 0; for i = 1:6, if ( k-i > 0) sez(k) = sez(k)+b_prev(i)*dq(k-i); se(k) = se(k) + sez(k); Algoritmi 1 Signaalin estimaatin laskeminen Muuttujaan se muodostetaan estimaatti signaalista, muuttujissa a_prev ja b_prev on suotimien kertoimet edelliseltä kierrokselta, muuttujassa sr ovat uudelleenmuodostetun signaalin arvot, muuttujaan sez lasketaan summa toisen suotimen kertoimien ja kvantisoitujen erotusten tulosta ja muuttujassa dq ovat kvantisoitujen erotusten arvot. Tämä saatu arvo vähennetään signaalin nykyisestä arvosta, josta saatu erotus muutetaan logaritmiselle asteikolle ja skaalataan skaalauskertoimella dkk = log2(abs(dk(k)))-y; Erotus kvantisoidaan tiettyyn tasoon riippuen erotuksen arvosta. Arvovälit on määritelty standardissa. Kvantisoinnin jälkeen muuttuja muutetaan takasin lineaariselle asteikolle.

14 Skaalauskerroin on merkittävä tekijä signaalia kvantisoidessa ja se muodostetaan kahden eri skaalausmuuttujan avulla. Nopea skaalausmuuttuja lasketaan standardin kaavan 2-2 mukaan yu = (1-(2^-5))*y+(2^-5)*W(I+1); Muuttuja y on skaalauskerroin, muuttuja W on taulukko nopean skaalauskertoimen laskentaan ja muuttuja I on kvantisointitason indeksi. Lyhyt skaalausmuuttuja määritellään standardin kaavan 2-3 mukaan yl = (1-(2^-6))*yl_prev+(2^-6)*yu; Muuttuja yl_prev on edellisellä kierroksella määritelty hidas skaalausmuuttuja ja yu on aikaisemmin määritelty nopea skaalausmuuttuja. Lopullinen skaalauskerroin saadaan laskemalla lyhyen ja nopean skaalausmuuttujan edellisen kierroksen arvot yhteen. Lisäksi laskennassa käytetään muuttujaa al, jonka tarkempaa toteutusta en käy tässä läpi. Muuttujasta al mainittakoon, että sen laskemiseen tarvitaan skaalaustason lyhyen ja pitkän ajan magnitudin keskiarvoa. y = al*yu_prev+(1-al)*yl_prev; Lopullinen uudelleen muodostettu signaalin arvo saadaan laskemalla estimaatti ja kvantisoitu erotus yhteen. sr(k) = se(k)+dq(k); Silmukan jokaisen kierroksen lopussa päivitetään suotimien kertoimet. Toisen asteen suotimen kertoimet päivitetään standardin kaavojen 2-10 ja 2-11 perusteella if ( k > 1) a(1) = (1-(2^-8))*a_prev(1)+(3*(2^-8))*(2*(p(k)>=0)-1)*(2*(p(k- 1)>=0)-1); else a(1) = (1-(2^-8))*a_prev(1); if ( k > 2) a(2) = (1-(2^-7))*a_prev(2)+(2^-7)*((2*(p(k)>=0)-1)*(2*(p(k- 2)>=0)-1) - fa*(2*(p(k)>=0)-1)*(2*(p(k-1)>=0)-1)); else a(2) = (1-(2^-7))*a_prev(2); Muuttuja p on laskettu etukäteen kertoimien päivitystä varten ja muuttuja fa on a(1) perusteella laskettu muuttuja. Kuudennen asteen suotimen kertoimet päivitetään standardin kaavan 2-12A mukaisesti

15 for i = 1:6 if ( k-i > 0), b(i)=(1-(2^-8))*b_prev(i)+(2^-7)*(2*(dq(k)>=0)-1)*(2*(dq(ki)>=0)-1); else b(i) = (1-(2^-8))*b_prev(i); Muuttujassa b_prev on kuudennen asteen suotimen kertoimet edelliseltä kierrokselta ja muuttujassa dq on kvantisoitujen erotusten arvot. Pääsilmukan jälkeen piirretään kuvaaja alkuperäisestä signaalista, uudelleenmuodostetusta signaalista ja skaalauskertoimen muutoksista, skaalataan uudelleenmuodostetun signaalin arvot välille [-1 1] ja kirjoitetaan nämä uuteen wav-tiedostoon. Lopuksi lasketaan ulostuloparametrit.

16 6 TULOKSET JA JOHTOPÄÄTÖKSET Tässä luvussa esittelen edellisessä luvussa esitellyllä koodilla saadut tulokset testitiedostoille ja yhteenvedon tuloksista. Taulukko 3 Koodekilla saadut testitulokset Tiedostonimi Näytteenottotaajuus (Hz) Pituus (s) Tiedostokoko (bitteinä) Pakattu tiedostokoko (bitteinä) Pakkaussuhde ENG_F.wav 8000 14 237636 118840 50 % ENG_M.wav 8000 16 264058 132052 50 % female.wav 8000 49 786740 393392 50 % male.wav 8000 51 816496 408270 50 % Looppi1.wav 44100 16 2822524 705644 25 % Runi.wav 44100 101 17915752 4478952 25 % Testi.wav 44100 151 26591332 6647846 25 % 4 ensimmäistä testitiedostoa sisälsivät englanninkielistä puhetta ja loput kolme olivat musiikinteko-ohjelmalla luotuja yksinkertaisia kappaleita, jotka sisälsivät rumpukomppeja, sähköurkuja tai pianon soittoa. Jokainen pakattu tiedosto on koodattu käyttäen kahdeksaa bittiä. Pakattujen tiedostojen äänenlaatu on hyvä, mutta kvantisoinnista johtuva kohina on huomattavaa. Kohina vaimenee käytettäessä enemmän bittejä, mutta pakkaussuhde tietenkin pienenee. Valitettavasti ajan loppuessa en ehtinyt toteuttaa suodinta joka olisi suodattanut kohinan pois. Itselleni tuli yllätyksenä kuinka hyvin koodekki pakkasi musiikkitiedostot, vaikkakin ne olivat yksinkertaisia sisällöltään.

17 Kuva 7 Tiedoston female.wav kuvaaja Kuvaajasta näkee kuinka skaalauskerroin muuttuu signaalin muuttuessa, sekä kuinka hyvin koodekki osaa luoda signaalin uudestaan. Kuva 8 Tiedoston Runi.wav 50000 ensimmäistä näytettä

Kuvasta 8 näkee, että skaalauskertoimen muutos on suurinta silloin kun signaalissa tapahtuu suuria ja nopeita muutoksia. Tämä työ oli varsin opettavainen. Olen pitkään ollut kiinnostunut äänisignaalien, varsinkin musiikkitiedostojen pakkaamisesta ja tämä työ mahdollisti tarkemman perehtymisen aiheeseen. Lisäksi työ herätti mielenkiintoa adaptiiviseen suodatukseen ja kvantisointiin, joihin aion perehtyä tarkemmin tulevaisuudessa. 18

19 LÄHTEET [1] Wikipedia, Digital recording [WWW]. [Viitattu 7.12.2010]. Saatavissa: http://en.wikipedia.org/wiki/digital_recording [2] Kester, W. The Data Conversion Handbook. 2005, Newnes. 214p [Verkkodokumentti] [Viitattu 7.12.2010]. Saatavissa: http://www.analog.com/library/analogdialogue/archives/39-06/data_conversion_handbook.html [3] Wikipedia, Pulse-code modulation [WWW]. [Viitattu 7.12.2010]. Saatavissa: http://en.wikipedia.org/wiki/pulse-code_modulation [4] Koppinen, K. SGN-4050 Puheenkoodaus, luentomoniste, s. 43, Helmikuu 2009. Saatavissa: http://www.cs.tut.fi/kurssit/sgn-4050/sgn4050.pdf [5] Wikipedia, DPCM [WWW]. [Viitattu xx.x.2010]. Saatavissa http://en.wikipedia.org/wiki/dpcm [6] Cisco Systems, Waveform Coding Techniques, Document ID: 8123, Helmikuu 2006. [Verkkodokumentti]. [Viitattu 7.12.2010]. Saatavissa: http://www.cisco.com/warp/public/788/signalling/waveform_coding.pdf [7] Wikipedia, ADPCM [WWW]. [Viitattu 12.7.2010]. Saatavissa: http://en.wikipedia.org/wiki/adaptive_dpcm [8] ADPCM Codecs [WWW]. [Viitattu 7.12.2010]. Saatavissa: http://www-mobile.ecs.soton.ac.uk/speech_codecs/standards/adpcm.html [9] Wikipedia, Audio compression (data) [WWW]. [Viitattu 7.12.2010]. Saatavissa: http://en.wikipedia.org/wiki/audio_compression_%28data%29 [10] Wikipedia, Psychoacoustics [WWW]. [Viitattu 7.12.2010]. Saatavissa: http://en.wikipedia.org/wiki/psychoacoustics [11] Huttunen, H. SGN-1251 Signaalinkäsittelyn sovellukset, opetusmoniste, s.134, Tammikuu 2010. Saatavissa: http://www.cs.tut.fi/~sigsov/moniste.pdf [12] Wikipedia, MP3 [WWW]. [Viitattu 7.12.2010]. Saatavissa: http://en.wikipedia.org/wiki/mp3 [13] Chiariglione, L., Riding the Media Bits MPEG s first Steps, Syyskuu 2009. [WWW]. [Viitattu 7.12.2010]. Saatavissa: http://ride.chiariglione.org/mpeg%27s_1st_steps.htm

[14] Hans, M., Schafer, R.W., Lossless Compression of Digital Audio, Signal Processing Magazine IEEE, Jul 2001. [Verkkodokumentti]. [Viitattu 19.11.2010]. Rajoitettu saatavuus osoitteessa: http://ieeexplore.ieee.org/stamp/stamp.jsp?tp=&arnumber=939834&user Type=inst [15] Wikipedia, Huffman coding [WWW]. [Viitattu 12.11.2010]. Saatavissa: http://en.wikipedia.org/wiki/huffman_coding [16] Coalson, J., FLAC, 2008. [WWW]. [Viitattu 12.11.2010]. Saatavissa: http://flac.sourceforge.net/ [17] G.726 [standardi]. [Viitattu 23.11.2010]. Saatavissa: http://www.itu.int/rec/t-rec- G.726/recommation.asp?lang=en&parent=T-REC-G.726-199012-I 20

21 LIITE 1: MATLAB-KOODI % Lari Kumpu 199123 % lari.kumpu@tut.fi % SGN-1970 Signaalinkäsittelyn laitoksen kandidaatintyöseminaari % ADPCM-koodekki puhesignaaleille % Parametrit: % input = pakattava tiedosto (pitää olla.wav muodossa) % N = käytettävien bittien määrä (8, 16 tai 32) % output = pakatun tiedoston tiedostonimi function adpcmconv(input, N, output) [s, fs] = wavread(input); s = s.*128; % skaalataan %taulukko nopealle skaalauskertoimelle W=[-0.75 1.13 2.56 4.00 7.00 12.38 22.19 70.13]; %taulukko adaptaationopeudelle F=[0 0 0 1 1 1 3 7]; %skaalauskerroin y = 0; %kvantisoijan ulostuloindeksi I = 0; %nopea skaalauskerroin yu = 0; yu_prev = 0; %hidas skaalauskerroin yl = 0; yl_prev = 0; %iir-suotimen kertoimet a = [0 0]; %edellisen kierroksen kertoimet tänne a_prev = [0 0]; %fir-suotimen kertoimet b = [0 0 0 0 0 0]; %edellisen kierroksen kertoimet tänne b_prev = [0 0 0 0 0 0]; %tiedoston pituus näytteissä pituus = length(s); %lyhyt adaptaationopeuden kerroin dms = 0; dms_prev = 0; %pitkä adaptaationopeuden kerroin dml = 0; dml_prev = 0; %muuttujat skaalauskertoimelle ap = 0; ap_prev = 0; al = 0; %muuttuja toisen asteen suotimen kertoimien päivitykseen fa = 0; %uudelleenmuodostettu signaali sr = zeros(1,pituus);

22 %signaalin estimaatti se = zeros(1,pituus); %muuttuja estimaatin laskemiseen sez = zeros(1,pituus); p = zeros(1,pituus); %kvantisoidut erotukset dq = zeros(1,pituus); %erotussignaalit dk = zeros(1,pituus); kvantisointitaso = zeros(1,pituus); %signaalien näytteet sl = zeros(1,pituus); skaalauskerroin = zeros(1,pituus); for k = 1:pituus %otetaan uusi näyte sl(k) = s(k); % lasketaan estimaatti se(k) edellisten suodinkertoimien avulla % ja uudelleen muodostettujen arvojen perusteella %kaava 2-9 se(k) = 0; for i = 1:2, if ( k-i > 0) se(k) = se(k) + a_prev(i)*sr(k-i); sez(k) = 0; for i = 1:6, if ( k-i > 0) sez(k) = sez(k)+b_prev(i)*dq(k-i); se(k) = se(k) + sez(k); %lasketaan nykyisen näytteen ja estimaatin erotus %kaava 2-1 standardissa dk(k) = sl(k) - se(k); %otetaan nykyisen näytteen merkki talteen dksign = (2*(dk(k)>=0)-1); %muutetaan nykyinen näyte logaritmiselle asteikolle ja skaalataan dkk = log2(abs(dk(k)))-y; %kvantisoidaan erotus if dkk >= 3.12 I = 7; d = 3.32; elseif dkk >= 2.72 && dkk < 3.12 I = 6; d = 2.91; elseif dkk >= 2.34 && dkk < 2.72 I = 5; d = 2.52; elseif dkk >= 1.91 && dkk < 2.34 I = 4; d = 2.13; elseif dkk >= 1.38 && dkk < 1.91

23 I = 3; d = 1.66; elseif dkk >= 0.62 && dkk < 1.38 I = 2; d = 1.05; elseif dkk >= -0.98 && dkk < 0.62 I = 1; d = 0.031; elseif dkk < -0.98 I = 0; d = 0; kvantisointitaso(k) = I; skaalauskerroin(k) = y; %muutetaan arvo takaisin lineaariselle asteikolle dq(k) = dksign*2^(d+y); %lasketaan nopea skaalauskerroin %kaava 2-2 standardissa yu = (1-(2^-5))*y+(2^-5)*W(I+1); %yu:n täytyy olla välillä 1.06 <= yu <= 10.00 if yu < 1.06 yu = 1.06; elseif yu > 10.00 yu = 10.00; %lasketaan skaalaustason magnitudin lyhyt ja pitkäaikainen keskiarvo dms = (1-(2^-5))*dms_prev+(2^-7)*F(I+1); dml = (1-(2^-7))*dml_prev+(2^-7)*F(I+1); %määritetään muuttuja ap if abs(dms-dml) >= (2^-3)*dml ap = (1-(2^-4))*ap_prev+(2^-3); elseif y < 3 ap = (1-(2^-4))*ap_prev+(2^-3); else ap = (1-(2^-4))*ap_prev; %jolla määritetään muuttuja al skaalauskerrointa varten if ap_prev > 1 al = 1; elseif ap_prev <= 1 al = ap_prev; %lasketaan hidas skaalauskerroin %kaava 2-3 standardissa yl = (1-(2^-6))*yl_prev+(2^-6)*yu; %skaalauskerroin lasketaan yhdistämällä hidas ja nopea skaalaus kerroin %kaava 2-4 standardissa y = al*yu_prev+(1-al)*yl_prev; %muodostetaan signaali laskemalla estimaatti ja kvantisoitu erotus %yhteen sr(k) = se(k)+dq(k); %lasketaan muuttuja p kertoimien päivitystä varten p(k) = dq(k)+sez(k);

24 %päivitetään toisen asteen suotimen kertoimet %kaava 2-10 if ( k > 1) a(1) = (1-(2^-8))*a_prev(1)+(3*(2^-8))*(2*(p(k)>=0)-1)*(2*(p(k- 1)>=0)-1); else a(1) = (1-(2^-8))*a_prev(1); %lasketaan muuttuja fa if abs(a_prev(1)) <= 2^-1 fa = 4*a_prev(1); elseif abs(a(1)) > 2^-1 fa = 2*sign(a_prev(1)); %kaava 2-11 if ( k > 2), a(2) = (1-(2^-7))*a_prev(2)+(2^-7)*((2*(p(k)>=0)-1)*(2*(p(k- 2)>=0)-1)-fa*(2*(p(k)>=0)-1)*(2*(p(k-1)>=0)-1)); else a(2) = (1-(2^-7))*a_prev(2); %stabiilisuusehdot if a(2) > 0.75 a(2) = 0.75; elseif a(2) < -0.75 a(2) = -0.75; if a(1) > 1-(2^-4)-a(2) a(1) = 1-(2^-4)-a(2); elseif a(1) <= -(1-(2^-4)-a(2)) a(1) = -(1-(2^-4)-a(2)); %päivitetään kuudennen asteen suotimen kertoimet %kaava 2-12A for i = 1:6 if ( k-i > 0), b(i)=(1-(2^-8))*b_prev(i)+(2^-7)*(2*(dq(k)>=0)- 1)*(2*(dq(k-i)>=0)-1); else b(i) = (1-(2^-8))*b_prev(i); %muuttujien arvot talteen a_prev = a; b_prev = b; yl_prev = yl; yu_prev = yu; dms_prev = dms; dml_prev = dml; ap_prev = ap; close all;

25 %piirretään alkuperäinen signaali plot(s,'b'); hold on; %piirretään pakattu signaali plot(sr, 'r'); %piirretään skaalauskerroin plot(skaalauskerroin, 'g'); leg('alkuperäinen', 'rekonstruktio', 'skaalauskerroin'); %skaalataan arvot välille -1..1 tiedostonkirjoitusta varten srr = sr/max(abs(sr)); %kirjoitetaan tiedostoon wavwrite(srr,fs,n,output);