Sunteți pe pagina 1din 34

UNIVERSITATEA POLITEHNICA DIN TIMIOARA FACULTATEA DE ELECTRONIC I TELECOMUNICAII DEPARTAMENTUL DE ELECTRONICA APLICATA

LUCRARE DE LICEN
IMPLEMENTAREA UNUI CODOR CELP

DRAGOMIR STEFAN

Conductor tiinific

Conf.dr.ing.Septimiu Mischie

TIMIOARA 2010

2010

Page 1

Subsemnatul Dragomir Stefan declar pe proprie rspundere c lucrarea de fa este rezultatul muncii mele, pe baza cercetrilor mele i pe baza informaiilor obinute din surse care au fost citate i indicate, conform normelor etice, n note i n bibliografie. Declar c lucrarea nu a mai fost prezentat sub aceast form la nici o instituie de nvmnt superior n vederea obinerii unui grad sau titlu tiinific ori didactic.

Semntura autorului

2010

Page 2

Cuprins
INTRODUCERE .....00 CAPITOLUL 1.CELP..00 1.1.Funcionare ..00 1.2AnalizA..00 1.2.1Filtru A(z).....00 1.2.2 Filtru P(z).........00 1.2.3 Stabilitate.........00 1.3SintezA..00 1.4 Filtrare zgomot.00 1.5 Dicionar...00 CAPITOLUL 2.IMPLEMENTAREA CODORULUI......00 2.1 Creerea dicionarului....00 2.2 Codarea..00 2.3 Rezultate...00 2.3.1 Semnale de excitaie.....00 2.3.2 Eliminarea Zgomotul....00 2.3.3 Stabilizarea P(z)....00 2.3.4 Exemple semnale codate..00 CONCLUZII...00 ANEX...00

2010

Page 3

INTRODUCERE
Lucrarea de fa i propune implementarea unui codor CELP cu ajutorul mediului de programare Matlab.Codorul va trebui s primeasc un semnal vocal preluat dintr-un fiier i va calcula parametri necesarii transmiterii semnalului pe un canal de comunicaie.Calitatea semnalului decodat trebuie s permit utilizatorului ntelegerea sunetelor emise. Metodele de codare caut s minimizeze rata de transfer a unui semnal vocal eantionat i cuantizat fr o degradare a calitaii acestuia.O bun calitate este obinut la rate mici de transfer prin utilizarea redundanei semnalului i prin cunoaterea faptului c anumite distorsiuni nu sunt percepute de urechea uman, fiind mascate de alte semnale.Modelele de redundan i mascare a distorsiunilor au devenit n timp foarte complexe ducnd la rate foarte sczute de transfer i calitate exepional a semnalului. Metodele de codare vocal se pot mprii n dou mari categorii.Prima reprezint codoarele ce ncearc s recreeze semnalul ct mai fidel posibil n timp ,iar cea de-a doua sunt metodele de codare denumite vocodere care pstreaz anumite caracteristici spectrale ale semnalului.Algoritmii de codare n timp recreaz semnalul vocal de foarta bun calitate la rate de transfer relativ mari, n timp ce vocoderele reproduc semnalul vocal la rate foarte mici de transfer nsa calitatea are de suferit. n cazul vocoderelor semnalul este mprit n benzi de frecven (un numr mare de benzi implic o analiz mai bun), apoi este aflat nivelul de energie a semnalului n benzile respective.n loc s fie memorate valorile eantioanelor este memorat nivelul energetic al benzii analizate. Pentru a recrea semnalul vocal se inverseaza procesul.Un aspect important este c informaiile despre frecvenele instantanee sunt pierdute.Din acest motiv vocoderele nu sunt eficiente n transmisii de bun calitate ele fiind des folosite n transmisii digitale de rate foarte scazute de transfer sau efecte speciale impuse vocii.

2010

Page 4

Metode de codare vocal: -LPC-line prediction coding -PCM-pulse code modulation -CELP-code exited line prediction -ADPCM-adaptive differential pulse code modulation

CAPITOLUL 1

CODE EXITED LINE PREDICTION


1.1 SCHEMA GENERAL
CELP este una dintre cele mai populare metode de codare folosite in sistemele de comunicaii.Metoda are un bun echilibru ntre cele 4 aspecte ale codrii vocale: -rata de codare -calitatea -ntrziere -complexitatea n aplicaii cu banda limitat rata de codare este un parametru important , in timp ce n aplicaiile n timp real complexitatea este cel mai important parametru.Complexitatea poate duce la ntrzieri ce nu sunt tolerate in aplicaii sensibile la timp.ntarzierea este unul dintre impedimentele pe care o intalneste metoda in implementarea sa intr-un sistem de

comunicatii.Aplicaiile moderne n timp real cum ar fi VoIP,telefonia prin internet,conferinele video ,telefonia de band larg, au nevoie de codoare de calitate nalt i ntrziere mica.

2010

Page 5

Fig.1.1.Schema general a unui codor CELP CELP(code exited line prediction) este o metod de codare a semnalului vocal ce const n utilizarea unui dicionar prestabilit de coduri pentru a reconstrui la recepie semnalul transmis.CELP este o metod eficient de codare vocal la rate mici de transmisie.Se transmit indicii codurilor din dicionar impreun cu 2 serii de coeficieni ale filtrului LPC si filtrului pitch. Semnalul vocal s[n] ce urmeaz s fie codat este imparit in cadre de 200 sau 240 eantioane.Aceste cadre vor trece prin 2 filtre de eliminare a corelaiei pe termen scurt i lung ntre eantioane.Primul dintre ele este un filtru LPC care elimin corelaia intre esantioanele alturate.Cel de-al doilea filtru este filtrul pitch i elimina corelaia la o distant M egal cu frecvena pitch masurat n numr de eantioane.Semnalul ce se obine la ieirea celor doua filtre este foarte asemntor cu un zgomot.Din dicionar pe rnd fiecare cod va fi amplificat i trecut prin 2 filtre ce au rolul de a reintroduce corelaia ntre eantioane.Coeficienii celor doua filtre sunt identici cu cei ale celor dou filtre folosite pentru semnalul vocal.Funciile de transfer ale filtrelor dicionarului sunt inversele funciilor de transfer ale filtrelor folosite pentru semnalul vocal. Pentru a decide care dintre codurile c[n] ale dicionarului este cel mai apropiat de semnalul decorelat sp[n], se obine semnalul eroare e[n]=sp[n]-sp[n] .

2010

Page 6

1.2 ANALIZA
Prima etap n codarea semnalului vocal este analiza acestuia.Analiza const n 2 pai, trecerea prin filtrul A(z) pentru eliminarea corelaie ntre eantioanele consecutive,iar apoi trecerea printr-un filtru P(z) pentru eliminarea corelaiei determinate de perioada pitch.Aceste decorelri vor duce la obinerea unui semnal asemntor cu un zgomot la ieirea ultimului filtru. Coeficienii celor 2 filtre sunt importani deoarece ei vor fi transmisi impreuna cu indicele din dicionar pe canalul de transmisie.Deasemenea codurile coninute de dictionar sunt si ele la randul lor cadre ce au fost trecute prin cele dou filtre, deci la reconstrucia semnalului din dicionar coeficienii celor 2 filtre vor fi folosii in dou alte filtre inverse lor.

Fig. 1.2 Schema bloc a poriunii de analiz.

1.2.1 FILTRUL A(z) Primul pas n creerea semnalului rezidual este eliminarea corelaie ntre eantioanele alturate.Coeficienii filtrului A(z) sunt alei pentru a minimiza eroarea medie patratic. A(z)= (1.1)

Energia rezidual a semnalului va fi de forma: (1.2)

Aceasta valoare va fi minimizat n urma alegerii coeficienilor potrivii.Pentru aceasta se va folosi metoda covarianei care va duce la obinerea unei ecuaii matriciale de forma:

2010

Page 7

( ( (

) )

( (

) ) ) ( )=(

( (

) ) ) (1.3) ) are

In ecuatia de mai sus N reprezint numrul de coeficieni sau ordinul de predictie, iar ( forma: ( ) . (1.4)

Filtrul A(z) nu prezint mari probleme in cazul stabilitaii.Acestea exist ns sunt rare i nu influeneaza puternic semnalul de ieire.

1.2.2 FILTRUL P(z)

Semnalul ce provine de la ieirea filtrului A(z) nca prezint o periodicitate datorat perioadei pitch.Scopul celui de-al doilea filtru este eliminarea acestei periodicitai redundante.Pentru a determina perioada pitch este necesar calcularea funciei de autocorelaie a semnalului s[n] de la intrarea filtrului A(z).Funcia de autocorelaie poate avea 2 forme.Una dintre forme este cea a unui cadru sonor,iar cea de-a doua este a unui cadru nesonor.

Fig.1.3a Figura 1.3a exemplu de funcie de autocorelaie a unui cadru sonor. Figura 1.3b-exemplu de cadru sonor.

Fig.1.3b

2010

Page 8

Fig 1.4a

Fig.1.4b

Figura 1.4a exemplu de funcie de autocorelaie a unui cadru nesonor. Figura 1.4b-exemplu de cadru nesonor.

n ambele cazuri se poate observa c funciile prezint maximul n origine nsa doar pentru funcia de autocorelaie asociat cadrelor sonore apar i vrfuri secundare care se repet cu frecvena pitch.astfel putem trage concluzia c filtrul P(z) va fi folosit doar pentru cadre sonore deoarece cadrele nesonore nu vor avea perioad pitch.Perioada este definit ca distanta in numr de eantioane ntre dou vrfuri consecutive. Odat aflat perioada pitch se va folosi in calculul coeficienilor filtrului P(z). P(z)= unde (1.5) sunt coeficienii filtrului.

N are ordinul 8 sau 16 in mod obinuit. Filtrul poate avea 1 ,2 sau 3 coeficieni diferii de zero.Astfel P(z) mai poate fi exprimat in felul urmator: P(z)={
( ) ( ) ( )

(1.6)

unde 1, 2, 3 sunt coeficienii diferii de zero ai filtrului,iar M este perioada pitch. Coeficienii se gsesc prin minimizarea erorii medie patrate.Metoda va duce la o ecuaie liniar matricial de forma. (1.7) unde este matricea coloana ce conine coeficienii filtrului.

2010

Page 9

Pentru a calcula matricea Funcia ( ( ( ( ( ) ) (

se folosete relaia 1.4.

) exprim corelaia eantioanelor pe termen lung. ) ( ( ) ) ( ) ( ( ) ) ) ( ) )=( ( ( ( ) ) ) ) (1.8)

Ecuaia matriceal mai poate fi scris sub forma:

La ieirea filtrului P(z) semnalul va fi decorelat i foarte asemntor unui zgomot. n figura 2.3a se poate observa semnalul de la ieirea filtrului A(z).Acesta prezint o periodicitate datorat perioadei pitch ns la ieirea filtrului P(z) se poate observa c semnalul este complet decorelat.

Fig.1.5a exemplu semnal sa[n]

Fig.1.5b exemplu semnal sp[n]

Ecuaia matricial prezentat mai sus este formula de covariant folosit pentru determinarea coeficienilor lui P(z) si are scopul principal s minimizeze eroarea mediei patratica. ( ) (1.9)

Formula de mai sus reprezint expresia mediei patratice pentru filtrul P(z).n cazul unui filtru perfect care minimizeaz eroarea, expresia ia forma: ( ) (1.10) tiind expresia erorii minime putem calcula catigul ca fiind raportul ntre energia semnalului la intrare i energia semnalului de la ieirea filtrului.

2010

Page 10

1.2.3 STABILITATE

Formula de calcul folosit pentru determinarea coeficienilor filtrului P(z) nu asigur obinerea unui filtru stabil.De aceea trebuie luate msuri suplimentare pentru asigurarea stabilitii.O condiie necesar i suficient pentru ca filtrul s fie stabil este poziionarea polilor lui P(z) n interiorul cercului unitar.Ordinul filtrului este ridicat ns numrul coeficienilor diferii de zero este mic.

Fig.1.6 exemplu de semnal trecut printr-un filtru P(z) instabil Vom considera numitorul lui P(z) notat cu D(z) de forma: ( ) unde ( ) ( ) ( ) | | ( ( )| )| | ( )| ( ) ( (1.12) ( )) ( ) (1.11)

Putem scrie n continuare: (1.13)

Atunci condiia de stabilitate este: (2.14) (2.15) (2.16) | | | | | | | | (1.17)

Din cele de mai sus putem trage concluzia c o condiie necesar i suficient ca filtrul s fie stabil este ca suma n modul a coeficienilor s fie mai mic dect unu. | | | | pentru filtrul cu un coeficient. | | pentru filtrul cu 2 coeficieni.

2010

Page 11

| |

| |

pentru filtrul cu 3 coeficieni. predictor P(z) sunt calculai prin

n fiecare cadru din semnal, coeficieniifiltrului

utilizarea formulei covarian. Apoi,testul de stabilitate este folosit pentru a determina dac acesta este stabil.Dac filtrul este stabil nici o modificare nu este adusa coeficienilor.ns dac se descoper c filtrul este instabil coeficienii trebuie recalculai folosind o metod de stabilizare.Aceti coeficieni ai lui P(z) sunt folosii i n stadiul de sinteza a semnalului deci ctigul va fi modificat. O prim metod de stabilizare este catigul.Acesta va fi modificat pentru a stabiliza filtrul.mulirea semnalului cu un ctig diferit este echivalent cu nmulirea fiecrui coeficient din expresia filtrului cu o valoare c.nmulirea va face ca polii filtrului s i modifice poziia.Dup nmulire trebuie verificat din nou stabilitatea. Prin nmulirea coeficienilor cu c se vor obine noi coeficieni: (1.18) Filtrul rezultat nu va minimiza perfect eroarea medie patratic care va avea expresia: ( ) (1.19)

Termenul perfect.tiind c ( ) (

reprezint energia rezidual obtinut n urma nefolosirii unui filtru ) putem scrie energia rezidual ca fiind: (1.20)

Daca c>1 catigul va crete foarte mult i din aceast constatare putem impune condiia de aflare a lui c: 0<c<1 (1.21) Metoda de stabilizare prin nmulirea coeficienilor face ca polii sa i modifice pozitia liniar.O alt metod de stabilizare este modificarea radial a poziiei polilor.Pentru o modificare radiaa a pozitie se va nmulii variabila complex z. ,r Gasirea lui r se face iterativ.Vom considera cazul unui filtru P(z) cu 3 coeficieni diferii de zero.
( )

(1.22)

Metoda de poziionare radial este una complex implicnd multe calcule iterative, rezultatele fiind asemntoare n practic cu prima metod prezentat.
2010 Page 12

1.3 SINTEZA
Sinteza este etapa n care coeficienii calculaii n etapa de analiz sunt folosii n filtrele 1/A(z) si 1/P(z).Cele dou filtre reintroduc corelaia pe termen lung i scurt n vectorul de eantioane selectat din dicionar.

Fig.1.6. Etapa de sintez Semnalul sp[n],semnalul reconstruit, nu este filtrat cu seria de coeficieni care au fost folosii la codare,n concluzie el va avea o variaie puin diferit de cel original.Aceast problema este corectat printr-un filtru W(z).

1.4 FILTRARE ZGOMOT


n urma folosirii diferitelor filtre ce pot modifica spectrul semnalului vocal iniial, semnalul poate prezenta zogomot.Filtrul W(z) este folosit pentru a reduce intensitatea zgomotului.S-a observat c urechea uman este mult mai sensibil la zgomote n jurul frecvenelor formante (frecvenele n care filtrul A(z) prezint atenuare maxim.).Filtrul W(z) va profita de acest fapt i va incerca s reduc zgomotul n aceste regiuni. ( ) Valoarea parametrului atenuare mai mare. W(z) poate fi introdus dup compararea semnalului de sintez cu cel de analiz sau poate fi introdus n cele doua etape.
( ) ( )

(1.23) va duce la o

variaz ntre 0.5 i 0.95.Valoarea ridicat pentru

2010

Page 13

Fig.1.7 Implementare 1 a filtrului W(z)

Fig.1.8 Implementare 2 a filtrului W(z) n figura 2.7 este exemplificat primul mod de implementare a filtrulu W(z) n care semnalul de eroare ,obinut prin scaderea din semnalul sp[n] a semnalului sp[n], este filtrat pentru zgomot. n figura 2.8 este exemplificat a doua metod de implementare a filtrului W(z).n acest caz filtrul este imprit ,n etapa de sinteza se folosete filtrul A( ), iar n etapa de analiz este folosit filtrul A(z).n final se compar dou semnale filtrate deja pentru zgomot.

1.5 DICIONAR
Dicionarul este cel mai important element n lanul de codare CELP.Acesta conine vectori de valori care sunt folosii n etapa de sinteza pentru a recrea semnalul vocal.Fiecare cod este amplificat cu un catig G calculat n etapa de analiz prin minimizarea erorii. Principalele probleme ntampinate n folosirea dicionarului este creerea sa i cutarea vectorilor potrivii pentru codare.Dicionarele conin foarte multe secvene de coduri, iar numrul de intruciuni necesare cutrii este foarte mare.O prim tentativ de a reduce timpii de cutare a fost n implementarea unei structuri speciale pentru dicionar.Momentan exist urmatoarele tipuri de dicionare: adaptive, ponderate, suprapuse i dictionare algebrice deterministe.

2010

Page 14

Fig.1.9 Implementare CELP cu dicionar adaptiv. Unul dintre cele mai utilizate structuri folosite pentru dicionare este cel adaptiv.Schema bloc a unui codor CELP cu dicionar adaptiv este prezentat n figura 1. Semnalului de excitaie este dat de suma dintre un semnal scalat din dicionarul adaptiv i un semnal de la un dicionar fix de mari dimensiuni. Parametrii dicionarului sunt alei pentru a minimiza eroarea ponderat ntre semnalul reconstruit i semnalul original . Aceast structur n mare msur cu bucl nchis este folosit pentru a produce un semnal reconstruit, care este ct mai aproape de cel original cu un timp de cutare acceptabil. Parametrii pentru cele dou dictionare nu sunt calculate mpreun.Prima dat semnalul dicionarului fix este considerat zero i sunt calculai parametrii pentru dicionarul adaptiv,Pe urm sunt aflai i parametrii dicionarului fix.Aceast metod ,care nu asigur un semnal reconstruit optim, este eficient din punct de vedere a reducerii timpului de cutare i numrului de instruciuni necesare.

2010

Page 15

CAPITOLUL 2

IMPLEMENTAREA CODORULUI
2.1.CREEREA DICIONARULUI
Dicionarul de coduri reprezint o matrice cu vectori de coduri pe linii.Cel folosit n program conine 1024 de secvene de cod.Codurile sunt formate din vectori cu dimensiunea 200 de eantioane.Eantioanele sunt obine din o serie de semnale vocale.n prima etapa s-au ales sunetele din alfabetul romn.Aceste semnale vocale sunt imprite n cadre i trecute prin filtrele A(z) i P(z) pentru eliminarea corelaie pe termen lung i scurt.Filtrul P(z) este un filtru cu 3 coeficieni diferii de zero.S-a ales aceast implementare din cauza mai bunei performane al acestui filtru.A doua etap implic selectarea unui numr mare de cuvinte uzuale din limba romn,acestea urmnd i ele s fie decorelate.Dicionarul obinut va conine 1800 de vectori cu 200 de eantioane.

Fig.2.1 Schema procedeului de obinere a dicionarului de coduri.

Dintre aceti 1800 de vectori doar 1024 vor fi pastrai.Pentru a selecta vectorii cei mai reprezentativi se va folosi o funcie vqtrain.Principiul dup care funcia selecteaz vectorii este urmatorul: -se selecteaz aleator un numar fix de vectori reprezentativi;

2010

Page 16

-utiliznd vectorii vecini acestori vectori reprezentativi se formeaz clustere; - se pastreaz un singur vector din fiecare cluster vectorul reprezentnd o medie aritmetica a vectorilor din cluster; Dicionarul nou obinut va prezenta aceleai rezultate ca cel necomprimat. Programul principal de generare dictionarului de coduri este fiierul Matlab creare_dictionar.m.Prima etapa n program este citirea fiierul de tip .wav ce conin semnalele audio pentru sunete inregistrate.n continuare se formeaz primul dicionar ce va conine doar cadre de 200 de eantioane din semnalele vocale.Folosind funcia filter_celp.m se filtreaza fiecare cadru cu filtrele A(z) i P(z) aferente. Dicionarul nou obinut poate fi folosit ns timpul de cutare ar fi mult prea mare din cauza dimensiuni mari.Din acest motiv se folosete funcia vqtrain.m pentru comprimarea dictionarului. Dicionarul final este memorat in fiierul codebook.mat pentru a fi folosit n codare si decodare.n creerea dicionarului au fost folosite 2 funcii: -pitch.m -filter_celp.m Funcia pitch.m primete ca parametru un vector de eantioane i returneaza perioada pitch masurat n numr de eantioane ale semnalului format din respectivele eantioane.Pentru a afla perioada pitch prima dat se calculeaz functia de autocorelaie.Perioada pitch este definit ca distana ntre 2 maxime.Se afl maximul perioadei pitch i se memoreaz n variabila imax1.Pasul urmtor este anularea maximului current.Pentru aceasta trebuie aflate minimele de la dreapta i stanga maximului.Se parcurge vectorul de eantioane la stanga i dreapta maximului ,iar cnd valoarea anterioar este mai mica dect valoare curent nseamn c sa gasit minimul.Poziiile celor doua minime se rein n variabilele imindr i iminst.ntre poziiile celor 2 minime toate eantioanele se nlocuiesc cu zero.Se calculeaz noul maxim ,iar diferena ntre poziia acestuia i pozitia primului maxim este valoarea perioadei pitch.

2010

Page 17

Fig.2.2 Exemplu functie autocorelaie

Fig.2.3 Exemplu de eliminare a maximului din funcia de autocorelaie. Odat aflata perioada pitch putem utiliza funcia filter_celp pentru

determinarea coeficienilor filtrelor utilizate.Funcia primete ca parametru o secven de eantioane i returneaz secvena respectiv filtrat cu A(z) i P(z).Coeficienii filtrului A(z) sunt calculai cu funcia de predicticie lpc.m i filtrai cu funcia filter.m.Pentru coeficienii P(z) se calculeaz perioada pitch care se folosete n rezolvarea ecuaiei matriciale prezentate n paragraful 1.2.2.naintea calculrii coeficienilor se pune o condiie ,ca perioada pitch sa fie mai mare de 2.Aceast condiie asigura c funciae va

2010

Page 18

calcula coeficieni doar pentru cadre sonore,deoarece aceasta returneaza valorile 0 ,1 sau 2 pentru cadre nesonore. Pe lng cele doua funcii folosite n creerea dicionarului se mai folosete un program pentru determinarea stabilitaii filtrului P(z).Programul calculeaz condiia 1.17.Folosind rezultate oferite de program se pot lua msuri n stabilizarea filtrului.Masura luata este prima metod de stabilizare prezentat n paragraful 1.2.3.Dac se gasete c filtrul calculat este instabil toi cei 3 coeficieni ai filtrului P(z) sunt nmulii cu valoarea 0.3 pentru a reintroduce zerourile funciei de transfer n interiorul cercului unitar.

2.2 CODAREA
Programul principal de codare celp.m codeaz semnalul vocal preluat dintr-un fiier de tip wav.Dup citirea i memorarea eantioanelor din semnalul vocal este memorat dicionarul de coduri din fiierul codebook.mat.Semnalul vocal este prelevat la frecvena de 8kHz, mono cu valoarea de 16 bii pe eantion.Cadrele sunt memorate ntr-o matrice care este parcurs pentru a calcula coeficienii filtrelor A(z) i P(z) cu ajutorul funciei calcul_coef.m.Etapa urmatoare este gasirea cadrelor potrivite pentru sintetizarea semnalului.Se parcurge dicionarul lund fiecare cod i filtrnd-ul cu filtrele 1/A(z) i 1/P(z) pentru a reintroduce corelatia .Cele doua semnale cel original i cel obinut din dictionar se scad ,iar ce se obine este semnalul eroare. Acest semnal este filtrate pentru zgomote ce pot rezulta n urma procesrii anterioare.Filtrul folosit este de forma A(z)/A(z).Unde ia valoarea 0.8.Folosind noul semnal de eroare se calculeaz norma euclidian.Codul din dicionar ce obine norma euclidian cea mai mic este cadrul a crui indice va fi memorat.Procednd astfel pentru fiecare cadru al semnalului vocal se obine un vector de indici ai dicionarului i dou matrici ce vor conine coeficienii filtrelor A(z) i P(z) folosite.

2010

Page 19

2.3 REZULTATE

2.3.1 SEMNALE DE EXCITAIE

2.3.2 ELIMINARE ZGOMOT Problema zgomotului este trata cu ajutorul filtrului W(z) introdus dupa calcularea semnalului de eroare.

Fig.2.6Exemplu de semnal eroare nainte i dup filtrare cu W(z) cu =0.8 n figur se poate vedea un exemplu de semnal eroare obinut prin scderea ntre semnalul vocal i vectorii de eantioane din dictionar, filtrate cu 1/A(z),1/P(z).Prima imagine
2010 Page 20

este semnalul nainte de trecerea lui prin W(z).Semnalul este afectat de zgomot produs de codrile anterioare.Dupa filtrare ,semnalul este mai neted. Parametrul poate lua valori ntre 0.5 i 0.95.n figura 2.6 s-a ales valoarea pentru = 0.8.O valoare sczut pentru v-a atenua mult semnalul nsa o valoare ridicata nu va filtra suficient zgomotul.

Fig.2.7 Exemplu de semnal eroare: -iniial -filtrat cu W(z),=0.95 -filtrat cu W(z), =0.5

2.3.4 EXEMPLE SEMNALE CODATE n urma implementrii programului s-au obinut 2 tipuri de rezultate:
2010 Page 21

a) cnd semnalul ce urmeaza a fi codat are cadrele deja existente in dictionar b) cnd semnalul ce urmeaza a fi codat nu are nici un cadru in dictionar.

Cazul a): Daca semnalul vocal ce urmeaz s fie codat este imparit n cadre ,iar cadrele sunt deja existente n dicionar n sensul ca au fost folosite de programul creere_dictionar n formarea dicionarului, atunci semnalul ce va fi codat i apoi decodat va fi perfect asemntor cu cel iniial.Acest simplu test poate fi folosit n determinarea bunei functionri a codorului.

Fig.2.8 Semnalul vocal ra.wav initial si decodat. n figura 2.4 se poate observa cuvantul ra prelevat cu freventa de 8kHz.Cuvantul este folosit in formarea dictionarului de coduri.Cadrele sale de lungimea 200 de esantioane sunt codate cu filtrele A(z) ,P(z) si introduce in dictionar.La codarea cuvantului programul va gasi

2010

Page 22

exact cadrele sale pentru transmiterea pe canalul de comunicatii.Fiind folosite exact cadrele sale la decodare se poate observa ca semnalul este perfect identic cu cel initial.

Cazul b): Semnalul folosit in cazul b) este un semnal aleator a carui cadre nu au fost folosite in formarea dicitonarului.

Fig.2.5 Semnalul vocal tastatur initial si decodat.

2010

Page 23

Fig.2.5 Semnalul vocal carte iniial i decodat. n figura 2.5 i 2.6 se poate observa c n al doilea caz semnalul decodat nu este perfect identic cu cel iniial codrii.Aceast diferen n forma semnalului se va resimi n calitatea vocii.Cadrele semnalului iniial nu sunt n dictionar.Codorul a trebuit s gseasc cadre care s ndeplineasc condiiile de minimizare a normei euclidiene pentru a reconstrui semnalul.Cu toate acestea se poate inelege cuvntul clar ,nsa este de calitate slab i afectat de zgomote.

2010

Page 24

ANEXA

1.creare_dictionar.m %CITIRE ESANTIOANE dataA=wavread('a.wav'); dataB=wavread('b.wav'); dataC=wavread('c.wav'); dataD=wavread('D.wav'); dataE=wavread('e.wav'); dataF=wavread('f.wav'); dataG=wavread('g.wav'); dataH=wavread('h.wav'); dataI=wavread('i.wav'); dataJ=wavread('j.wav'); dataL=wavread('l.wav'); dataM=wavread('m.wav'); dataN=wavread('n.wav'); dataO=wavread('o.wav'); dataP=wavread('p.wav'); dataR=wavread('r.wav'); dataS=wavread('s.wav'); dataSH=wavread('sh.wav'); dataT=wavread('t.wav'); dataTH=wavread('th.wav'); dataU=wavread('u.wav'); dataV=wavread('v.wav'); dataZ=wavread('z.wav');

dataCH=wavread('ch.wav'); dataGH=wavread('gh.wav'); datarata=wavread('rata.wav'); datad1=wavread('d1.wav'); datad2=wavread('d2.wav'); datad3=wavread('d3.wav'); datad4=wavread('d4.wav'); datad5=wavread('d5.wav'); datad6=wavread('d6.wav'); datad7=wavread('d7.wav'); datad9=wavread('d9.wav'); datad10=wavread('d10.wav'); datad11=wavread('d11.wav'); datad12=wavread('d12.wav'); datad13=wavread('d13.wav'); datad14=wavread('d14.wav'); datad15=wavread('d15.wav'); datad16=wavread('d16.wav'); datad17=wavread('d17.wav'); %formare dictionar cadre=imp_cadre(dataA,200); dictionar=cadre; cadre=imp_cadre(dataB,200); dictionar=[dictionar;cadre]; cadre=imp_cadre(dataC,200); dictionar=[dictionar;cadre]; cadre=imp_cadre(dataD,200);

2010

Page 25

dictionar=[dictionar;cadre]; cadre=imp_cadre(dataE,200); dictionar=[dictionar;cadre]; cadre=imp_cadre(dataF,200); dictionar=[dictionar;cadre]; cadre=imp_cadre(dataG,200); dictionar=[dictionar;cadre]; cadre=imp_cadre(dataH,200); dictionar=[dictionar;cadre]; cadre=imp_cadre(dataI,200); dictionar=[dictionar;cadre]; cadre=imp_cadre(dataJ,200); dictionar=[dictionar;cadre]; cadre=imp_cadre(dataL,200); dictionar=[dictionar;cadre]; cadre=imp_cadre(dataM,200); dictionar=[dictionar;cadre]; cadre=imp_cadre(dataN,200); dictionar=[dictionar;cadre]; cadre=imp_cadre(dataO,200); dictionar=[dictionar;cadre]; cadre=imp_cadre(dataP,200); dictionar=[dictionar;cadre]; cadre=imp_cadre(dataR,200); dictionar=[dictionar;cadre]; cadre=imp_cadre(dataS,200); dictionar=[dictionar;cadre]; cadre=imp_cadre(dataSH,200); dictionar=[dictionar;cadre]; cadre=imp_cadre(dataT,200); dictionar=[dictionar;cadre]; cadre=imp_cadre(dataTH,200);

dictionar=[dictionar;cadre]; cadre=imp_cadre(dataU,200); dictionar=[dictionar;cadre]; cadre=imp_cadre(dataV,200); dictionar=[dictionar;cadre]; cadre=imp_cadre(dataZ,200); dictionar=[dictionar;cadre]; cadre=imp_cadre(dataCH,200); dictionar=[dictionar;cadre]; cadre=imp_cadre(dataGH,200); dictionar=[dictionar;cadre]; cadre=imp_cadre(datarata,200); dictionar=[dictionar;cadre]; cadre=imp_cadre(datad1,200); dictionar=[dictionar;cadre]; cadre=imp_cadre(datad2,200); dictionar=[dictionar;cadre]; cadre=imp_cadre(datad3,200); dictionar=[dictionar;cadre]; cadre=imp_cadre(datad4,200); dictionar=[dictionar;cadre]; cadre=imp_cadre(datad5,200); dictionar=[dictionar;cadre]; cadre=imp_cadre(datad6,200); dictionar=[dictionar;cadre]; cadre=imp_cadre(datad7,200); dictionar=[dictionar;cadre]; cadre=imp_cadre(datad9,200); dictionar=[dictionar;cadre]; cadre=imp_cadre(datad10,200); dictionar=[dictionar;cadre]; cadre=imp_cadre(datad11,200);

2010

Page 26

dictionar=[dictionar;cadre]; cadre=imp_cadre(datad12,200); dictionar=[dictionar;cadre]; cadre=imp_cadre(datad13,200); dictionar=[dictionar;cadre]; cadre=imp_cadre(datad14,200); dictionar=[dictionar;cadre]; cadre=imp_cadre(datad15,200); dictionar=[dictionar;cadre]; cadre=imp_cadre(datad16,200); dictionar=[dictionar;cadre]; cadre=imp_cadre(datad17,200); dictionar=[dictionar;cadre];

save codebook dictionar

2.pitch.m

function ptch=pitch(data); %ptch=pitch(data); %parametrii: o secventa de esantioane %returneaza: perioada pitch R=xcorr(data); dimR=length(R); max=0; imax=1; %gasire maxim

D=size(dictionar); dimD=D(1);

for i=1:dimR if R(i)>max max=R(i);

D=size(dictionar); dimD=D(1); dictP=zeros(dimD,D(2)+1); for i=1:dimD

imax=i; end; end; %gasire minim dreapta c=0;

[dictionar2(i,:),FA(i,:),FP(i,:)]=filter_celp(di ctionar(i,:)); end; dictionar=dictionar2; save dict dictionar FA FP %comprimare dictionar dictionar_trans=trans_M(dictionar); dictionar=vqtrain(dictionar_trans,1024); dictionar_trans=trans_M(dictionar); dictionar=dictionar_trans;

imindr=2; for i=imax:dimR-1 if R(i)<R(i+1) if c==0 imindr=i; c=1; end; end; end; %gasire minim stanga

2010

Page 27

c=0; i=imax; iminst=2; while i>1 if R(i)<R(i-1) if c==0 iminst=i; c=1; end; end; i=i-1; end; %reducere la 0 a varfului principal for i=iminst:imindr R(i)=0; end; % gasire maxim nou max=0; imax2=0; for i=1:dimR if R(i)>max max=R(i); imax2=i; end; end; ptch=abs(imax-imax2);

%returneaza:secventa filtrata de A(z) si P(z)

p=14; %-------------Coeficienti A(z)----------------A=lpc(cod,p); A=real(A); %-------------Filtrare cod-----------------------cdFA=filter(A,1,cod); %-------------Autocorealatie pt A(z)-------------R=xcorr(cod); %--------------Perioada Pitch---------------------Pitch=pitch(cod); %---------------Coeficienti P(z)-------------------if Pitch>2 s=0; M=Pitch; Rpz1=0; Rpz2=0; Rpz3=0; Rpz4=0; Rpz5=0; Rpz6=0; Rpz7=0; Rpz8=0;

3.filter_celp.m

Rpz9=0; Rpz10=0;

function [cdFP,A,P]=filter_celp(cod); %[cdFA]=filter_celp(cod); %parametrii:o seventa de esantioane

Rpz11=0; Rpz12=0;

2010

Page 28

i=[M-1 M-1 M-1 M M M M+1 M+1 M+1 0 0 0]; j=[M-1 M M+1 M-1 M M+1 M-1 M M+1 M-1 M M+1]; for n=M+2:length(cod) Rpz1=Rpz1+cod(n-i(1))*cod(n-j(1)); Rpz2=Rpz2+cod(n-i(2))*cod(n-j(2)); Rpz3=Rpz3+cod(n-i(3))*cod(n-j(3)); Rpz4=Rpz4+cod(n-i(4))*cod(n-j(4)); Rpz5=Rpz5+cod(n-i(5))*cod(n-j(5)); Rpz6=Rpz6+cod(n-i(6))*cod(n-j(6)); Rpz7=Rpz7+cod(n-i(7))*cod(n-j(7)); Rpz8=Rpz8+cod(n-i(8))*cod(n-j(8)); Rpz9=Rpz9+cod(n-i(9))*cod(n-j(9)); Rpz10=Rpz10+cod(n-i(10))*cod(n-j(10)); Rpz11=Rpz11+cod(n-i(11))*cod(n-j(11)); Rpz12=Rpz12+cod(n-i(12))*cod(n-j(12)); end; teta1=[Rpz1 Rpz2 Rpz3;Rpz4 Rpz5

B(M)=beta(2); B(M+1)=beta(3); %-----------------------------Filtrare P(z)-----------------------cdFP=filter(B,1,cdFA); else cdFP=cdFA; B=zeros(1,length(cod)+1); B(1)=1;

end; P=B;

4.trans_M.m

function M=trans_M(matr); %transforma liniile in coloane a unei matrici matr d=size(matr); for i=1:d(1) M(:,i)=matr(i,:); end;

Rpz6;Rpz7 Rpz8 Rpz9]; teta2=[Rpz10; Rpz11; Rpz12;]; beta=inv(teta1)*teta2; s=abs(beta(1))+abs(beta(2))+abs(beta(3)); c=0.3; if s>1 beta(1)=c*beta(1); beta(2)=c*beta(2); beta(3)=c*beta(3); end; B=zeros(1,length(cod)+1); B(1)=1; B(M-1)=beta(1);

5.imp_cadre.m

function cadre=imp_cadre(data,dimcadru); %cadre=imp_cadre(data,dimcadru); %imparte o secventa de esantioane in cadre de dimensiunea dimcadru dim=length(data); nr_cadre=dim/dimcadru;

2010

Page 29

for i=1:nr_cadre k=1; for j=(((i-1)*dimcadru)+1):(i*dimcadru); cadre(i,k)=data(j); k=k+1; end; end;

%parametrii:o seventa de esantioane %returneaza:coef A(z) si P(z) %folosit in codor % p=14; %-------------Coeficienti A(z)----------------A=lpc(cod,p);%calcul coeficienti filtru A(z) A=real(A);

6.determinare_stabilitate.m

%-------------Autocorealatie pt A(z)--------------

load dict; for i=1:375 k=1; for j=1:200 if abs(fP(i,j))>0 c(i,k)=fP(i,j); k=k+1; end; end;

R=xcorr(cod);%calcul functie autocorelatie %--------------Perioada Pitch---------------------Pitch=pitch(cod);%apelare functie pitch care calculeaza perioada pitch %---------------Coeficienti P(z)-------------------if Pitch>2%daca perioada pitch este mai mare de 2 se calculeaza parametrii functiei P(z)

end s=zeros(375,1); for i=1:375 for j=2:4 s(i)=s(i)+abs(c(i,j));% vector cu valorile sumei in modul a coeficientilor end; end;

s=0; M=Pitch; Rpz1=0; Rpz2=0; Rpz3=0; Rpz4=0; Rpz5=0; Rpz6=0; Rpz7=0;

7.calcul_coef.m function [A,P]=calcul_coef(cod); %[A,P]=calcul_coef(cod);

Rpz8=0; Rpz9=0; Rpz10=0;

2010

Page 30

Rpz11=0; Rpz12=0; i=[M-1 M-1 M-1 M M M M+1 M+1 M+1 0 0 0]; j=[M-1 M M+1 M-1 M M+1 M-1 M M+1 M-1 M M+1]; for n=M+2:length(cod) Rpz1=Rpz1+cod(n-i(1))*cod(n-j(1)); Rpz2=Rpz2+cod(n-i(2))*cod(n-j(2)); Rpz3=Rpz3+cod(n-i(3))*cod(n-j(3)); Rpz4=Rpz4+cod(n-i(4))*cod(n-j(4)); Rpz5=Rpz5+cod(n-i(5))*cod(n-j(5)); Rpz6=Rpz6+cod(n-i(6))*cod(n-j(6)); Rpz7=Rpz7+cod(n-i(7))*cod(n-j(7)); Rpz8=Rpz8+cod(n-i(8))*cod(n-j(8)); Rpz9=Rpz9+cod(n-i(9))*cod(n-j(9)); Rpz10=Rpz10+cod(n-i(10))*cod(n-j(10)); Rpz11=Rpz11+cod(n-i(11))*cod(n-j(11)); Rpz12=Rpz12+cod(n-i(12))*cod(n-j(12)); end; teta1=[Rpz1 Rpz2 Rpz3;Rpz4 Rpz5

B(1)=1; B(M-1)=beta(1); B(M)=beta(2); B(M+1)=beta(3); %-----------------------------Filtrare P(z)-----------------------else%daca perioada pitch este mai mica de 2 vom lasa parametrii filtrului pitch 0 inafara de primul. B=zeros(1,length(cod)+1); B(1)=1; end; P=B;

8.inv_filter_celp.m

function cod=inv_filter_celp(cdFP,A,P); %[cod]=filter_celp(cdFP,A,P); %parametrii:o seventa de esantioane coef A(z) sicoef P(z) %returneaza:secventa filtrata de 1/P(z) apoi de 1/A(z) cod=filter(1,P,cdFP); cod=filter(1,A,cod);

Rpz6;Rpz7 Rpz8 Rpz9]; teta2=[Rpz10; Rpz11; Rpz12;]; beta=inv(teta1)*teta2; s=abs(beta(1))+abs(beta(2))+abs(beta(3)); c=0.3; if s>1 beta(1)=c*beta(1); beta(2)=c*beta(2); beta(3)=c*beta(3); end; B=zeros(1,length(cod)+1);

9.vqtrain.m

function

codebook=vqtrain(DB,

SIZE,

NOITER, STARTSTEP, VERBOSE) if nargin<5

2010

Page 31

VERBOSE=1; end; if nargin<4 STARTSTEP=0.1; end; if nargin<3 NOITER=200000; end; STARTSTEP2=0.0;

break; end; end; if s<mins mins=s;mini=i; end; end;

D=D+mins; codebook(:,mini)=(1-

d=size(DB,1); codebook=DB(:,ceil(rand(1,SIZE)*length(D B))); if VERBOSE==1 disp('Training VQ...') ; end; D=0; tic;

step)*codebook(:,mini)+step*x; end if VERBOSE==1 D=0; tic; end; end; D=0; for n=1:length(DB)

for n2=1:NOITER/20000; for n3=1:20000 n=n2*20000+n3; step=max(0,STARTSTEP*(1.0n/NOITER)); x=DB(:,ceil(rand*length(DB))); mins=1E20; mini=1; for i=1:SIZE s=(codebook(1,i)-x(1))^2; for j=2:d s=s+(codebook(j,i)-x(j))^2; if s>mins

x=DB(:,n); mins=1E20; mini=0; for i=1:SIZE s=(codebook(1,i)-x(1))^2; for j=2:d s=s+(codebook(j,i)-x(j))^2; if s>mins break; end; end; if s<mins mins=s;

2010

Page 32

mini=i; end; end; D=D+mins; end;

);%trecerea codurilor din dictionar prin inversele filtrelor eroare=cadre(i,:)-cadre_sint;%diferenta intre cadrul vocal si codul din dicitonar Agama(1)=1; for e=2:length(A);

10.celp.m

Agama(e)=A(e)*gama^(e-1); end;

data=wavread('dulap.wav'); load coduri dictionar2=trans_M(dictionar); dictionar=dictionar2; cadre=imp_cadre(data,200);%apelare functie de impartire in cadre codebook;%incarcare dictionar de

eroare2=filter(Agama,A,eroare); eroare=eroare2;

norma_euclidiana(j)=sqrt(sum(eroare.^2));% calcul norma eucliadana end;

[norma_min,jmin]=min(norma_euclidiana); dim=size(cadre); dim=dim(1); dimD=size(dictionar); dimD=dimD(1); gama=0.8;% valori intre 0.5 si 0.95; d=length(data); x=zeros(1,d); for i=1:dim;%parcurgere cadre ale x=[0 0]; for i=1:dim%reconstructie semnal vocal folosind codurile din dictionar l=1; [A,P]=calcul_coef(cadre(i,:)); end; index(i)=jmin;%cautare si memorare

codurile din dictionar cu eroare minima

semnalului vocal [A,P]=calcul_coef(cadre(i,:));%gasire coeficienti filtru pentru cadrul actual for j=1:dimD;%parcurgere dictionar

pentru cautarea codului asemanator y(i,:)=inv_filter_celp(dictionar(index(i),:),A, cadre_sint=inv_filter_celp(dictionar(j,:),A,P P); x=[x y(i,:)];

2010

Page 33

end; subplot(2,1,1);plot(data); subplot(2,1,2);plot(x); sound(x,8000);

2010

Page 34

S-ar putea să vă placă și