Industria y Materiales


Codificació de veu


PRÀCTICA 2

CODIFICACIÓ DEL SENYAL DE VEU

Codificació de veu

1.- EFECTES DE L'EMMASCARAMENT EN EL PROCÉS AUDITIU

Per tal de poder explicar que és l'emmascarament en el procés auditiu ens cal explicar quines característiques té la veu i quines propietats té l'oïda humana.

1.1 CARACTERÍSTIQUES DESCRIPTIVES DEL SENYAL DE VEU

La veu, com qualsevol estímul auditiu, queda definida per els paràmetres de freqüència, amplitud i duració. La senyal de veu està composta per fonemes de tal manera que podem descriure la parla com una successió temporal de fonemes. Es defineix el fonema com la unitat mínima de so que serveix per distingir significats. Per tal de “descobrir” els fonemes d'una llengua tant sols ens cal pensar en paraules que siguin iguals i que només es diferenciïn per un d'aquests fonemes i tinguin significats diferents, per exemple: CARA, CALLA, CASA... d'on se n'extreu que R, LL, S són fonemes. Els diferents fonemes es poden caracteritzar en diferents nivells com són l'articulatori, l'acústic i el lingüístic.

Caracterització a nivell articulatori:

Aquesta caracterització depèn de les diferents formes de modificar el flux de l'aire. La distinció més visible i important en els diferents sons que formen el llenguatge és la distinció consonant - vocal.

Les consonants es poden classificar en funció del mode d'articulació (explosives, fricatives, africades...), segons la sonoritat (sonores o sordes) i segons el punt d'articulació (dental, interdental, alveolar, palatal, velar...). Per altre banda les vocals per la seva naturalesa són sempre sonores i es classifiquen en funció de la localització de la base de la llengua (anteriors o posteriors) i en el seu grau d'obertura (altes, mitges o baixes).

L'origen del senyal de veu:

L'origen del senyal de veu es basa en l'existència d'una font de so que és la laringe (cordes vocals) i un filtre que és el conducte bucal (faringe, boca, dents, llavis, nas). Al expulsar aire a través de la laringe tenim que les cordes vocals vibren i produeixen so. Per tal de poder realitzar els diferents sons de la llengua modifiquem el conducte vocal movent la boca, la llengua... i d'aquesta forma podem produir els diferents fonemes. Així doncs, podem modelar l'origen de la veu humana com una font, que està constituïda pel pas de l'aire a través de les cordes vocals, i per un filtre del que en podem modificar la resposta espectral per tal de realitzar els diferents fonemes. El filtre bucal està format per tres cavitats ressonants: la faringe, la cavitat bucal i la cavitat nasal. La cavitat de la faringe es troba en sèrie amb la cavitat nasal o amb la cavitat bucal de tal forma que qualsevol fonema que pronunciem estarà compost per dos formants que corresponen al filtre de la cavitat de la faringe i el filtre de la cavitat nasal o la bucal en funció del tipus de fonema ( nasal o bucal).

Així doncs, si observem l'espectre de diferents fonemes tenim:

Codificació de veu

Així doncs, en funció del fonema que estem pronunciant tenim que la potència de la senyal té més potència en una banda de freqüències o en una altre en funció dels formants del fonema.

Una manera molt usual de representar el senyal de veu és mitjançant una gràfica espai - freqüència. Aquesta es realitza fent segments temporals del senyal de veu corresponents a cada fonema i fent segments de freqüència corresponents a les bandes de cada formant possible.

En la següent gràfica podem observar la paraula hola representada en una gràfica espai -freqüència:

Codificació de veu

Com hem vist en les gràfiques de la transformada de Fourier del fonema /a/ teníem una formant en la banda dels 100Hz i l'altre d'una amplitud molt inferior però d'una amplada superior a la banda de 1KHz. Si observem en la gràfica espai - freqüència el fonema /a/ observem que hi ha la primera formant entorn els 100Hz i la segona formant que es troba entre els 500Hz i 1KHz.

1.2 CARACTERÍSTIQUES DESCRIPTIVES DE L'OÏDA

Un cop coneixem les característiques de la senyal de veu ens cal comprendre com nosaltres percebem aquest senyal mitjançant l'aparell auditiu.

Aparell auditiu extern:

Quan les ones de pressió arriben a la part exterior de la orella es troben amb el canal auditiu que és una estructura en forma de tub d'uns 3 cm de longitud que té una funció de protegir l'aparell auditiu de les agressions del món exterior. El canal auditiu protegeix la membrana timpànica situada al final d'aquest conducte i, a més a més, li proporciona una temperatura constant. L'orella i el canal auditiu tenim que fan un ressonador amb una freqüència central de 3.400Hz i s'ha demostrat que hi ha una amplificació moderada a la banda de 2KHz a 5KHz.

Aparell auditiu intern:

Les ones de pressió s'han convertit en vibracions mecàniques i, un cop han passat per la finestra oval , afectaran a la coclea que és una estructura de l'aparell auditiu intern plena de líquid. La coclea és una estructura en forma de cargol. A l'interior de la coclea hi ha uns petits cilis (o pels) que són el destí de les vibracions en funció de la zona de la coclea que vibra es transfereix al cervell la senyal.

1.3 EMMASCARAMENT TEMPORAL

El concepte bàsic és que un so d'una potència donada ens pot fer que sons d'una potència inferior que es produeixen en una finestra temporal entorn aquest so no els podem sentir.

Aquest efecte es coneix amb el nom de `efecte de precedència'. Aquest fenomen va ésser extensament estudiat per Hans Wallach . En Wallach va demostrar l'efecte de la precedència fent que un subjecte escoltés música procedent de dos altaveus a la mateixa distància del subjecte. Quan la música provenia simultàniament dels dos altaveus, el subjecte escoltava la música com si provingués dels dos altaveus, mentre que si la música es reproduïa amb un retard entre els altaveus, el subjecte informava de que la música tant sols semblava provenir de l'altaveu que primer reproduïa la música. Així doncs, Wallach va concloure que sentim tant sols el primer so que arriba a l'oïda i que són eliminats tots els sons de potència inferior que arriben en els 70 ms posteriors.

Segons la meva opinió crec que aquest efecte és fruit de l'evolució de l'oïda humana i ens permet poder discriminar els sons provinents de la font de forma directa als sons que ens provenen de rebots (reverberància). Com es pot veure en el següent dibuix tenim que quan parlem a una altre persona a aquesta li arriba la senyal de forma directa i la mateixa senyal retardada i amb menor potència degut als rebots (reverberància). La senyal que arriba de forma directa és la que té més potència, mentre que la que arriba un cop ha rebotat amb qualsevol superfície arriba retardada i amb menor potència degut al major recorregut que ha efectuat la ona de pressió en l'aire.

Un altre efecte que es pot observar en l'emmascarament temporal és que quan tenim un so potent precedit en un interval de temps petit per un so menys potent tenim que aquest so menys potent queda emmascarat. Si bé es evident que hem enregistrat aquest primer so menys potent, tenim que un cop ens arriba el de major potència oblidem el so de menys potència que hem sentit anteriorment.

Podem representar els dos efectes de l'emmascarament temporal mitjançant una màscara entorn un so potent que indica que els sons que tinguin una potència inferior a la de la màscara seran emmascarats, és a dir, no els sentirem.

Codificació de veu

L'efecte de l'emmascarament temporal és clarament superior en els sons que precedeixen el so potent que en els sons que es produeixen abans del so potent.

1.3 EMMASCARAMENT FREQÜENCIAL

Al igual que en l'emmascarament temporal tenim un efecte d'emmascarament en freqüència. Aquest efecte es manifesta quan tenim un so potent a una certa freqüència que fa que sons menys potents a freqüències properes quedin emmascarades i per tant no es percebin si tenen una potència inferior a la de la màscara.

Podríem dir que tot el comportament de l'oïda és `logarítmic' ja que, per exemple, per passar d'una nota musical a la següent ens cal multiplicar per dos la seva freqüència. En aquest cas les màscares en freqüència també són logarítmiques, és a dir, la seva amplada de banda augmenta de forma logarítmica en funció de la freqüència del so que genera la finestra d'emmascarament.

Tot això es pot observar en el següent gràfic on es pot veure tres sons amb la seva corresponent màscara i, a més a més, podem veure que al augmentar la freqüència del so l'amplada de banda de la màscara augmenta de forma logarítmica.

Codificació de veu

1.4 CÀLCUL DE LA RELACIÓ SENYAL-SOROLL

Les peculiaritats del senyal de veu i de l'oïda humana ens fan notar que podem aprofitar aquests efectes per tal d'obtenir resultats òptims en la codificació de la veu.

Així doncs, tenim que utilitzar la relació senyal - soroll estàndard en la mesura de qualitat d'un sistema de codificació de veu no és del tot vàlida ja que, tot i tenir la mateixa potència de soroll, en funció de la forma que tingui el soroll percebrem el senyal amb més qualitat o menys. Si aconseguim posar tot el soroll dins les màscares obtindrem que la qualitat subjectiva (la qualitat percebuda) del senyal augmentarà considerablement. Per posar tot el soroll dins les màscares cal conformar el soroll amb el senyal, és a dir, aconseguir que el soroll tingui la forma del senyal. Si el soroll té la forma del senyal tindrem que quan el senyal tingui una amplitud gran, el soroll també tindrà una amplitud gran però quedarà emmascarat i quan el senyal tingui una amplitud petita el soroll també serà petit i també romandrà emmascarat pel senyal.

A continuació podem veure un senyal de veu codificat amb un quantificador lineal i amb un quantificador delta del mateix nombre de bits:

Codificació de veu

Com es pot observar, utilitzant un sistema de codificació lineal tenim que el soroll de quantificació sempre té la mateixa amplitud independentment de l'amplitud del senyal i per tant en els llocs on el senyal és molt dèbil tenim que hi ha més soroll que senyal, mentre que en els llocs a on el senyal és potent tenim molt més senyal que soroll.

Utilitzant una codificació que conforma el soroll amb el senyal tenim que quan el senyal és dèbil el soroll també ho és i quan el senyal és potent, el soroll també és potent. Així doncs tenim que la SNR es manté més o menys de manera constant al llarg del temps utilitzant aquesta codificació, mentre que en l'altre codificació tenim llocs on la SNR és molt gran i llocs a on la SNR és molt petita.

A continuació podem veure l'espectre d'un senyal de veu i els sorolls de quantifiació utilitzant un quantificador lineal i un quantificador delta del mateix nombre de bits:

Codificació de veu

Com es pot observar en el quantificador lineal tenim un soroll blanc i per tant de potència constant a totes les freqüències. En canvi, el sistema que conforma el soroll (quantificador delta) tenim que té una densitat espectral de potència de soroll que està fortament correlada amb la densitat espectral de potència del senyal. Així doncs tenim que en el cas del sistema de codificació que conforma el soroll s'aprofita al màxim l'emmascarament freqüencial. En canvi, en el quantificador lineal tenim que la potència de soroll és constant a totes les freqüències i, per tant, la relació senyal - soroll és bona a les freqüències on el senyal és potent, però és molt baixa a les freqüències on el senyal és dèbil.

SNR ESTÀNDARD

La relació senyal - soroll calculada de forma estàndard, és a dir, potència de senyal dividit per potència de soroll no és un bon mètode de mesura de la qualitat subjectiva d'un sistema de codificació. Al utilitzar la SNR estàndard tenim que, si el soroll no està conformat amb el senyal, no contemplem els llocs a on la SNR local és molt baixa i efecte sensiblement a la intel·ligibilitat del missatge, sinó que simplement calculem la potència del senyal, calculem la potència del soroll i en fem la divisió.

Codificació de veu
Codificació de veu

SNR SEGMENTAL

El concepte de la relació senyal - soroll segmental és senzill i es basa en fer segments temporals i freqüencials de la senyal per calcular-ne la SNR estàndard en aquests segments. Per calcular la SNR segmental només ens cal fer la mitja de totes les SNR calculades en cada segment de temps i de freqüència.

Usualment els segments en freqüència s'agafen de forma que augmenten logarítmicament, mentre que els segments temporals s'agafen de valor constant i que continguin un fonema cada bloc (uns 25 ms). D'aquesta manera aconseguim tenir en les mostres d'un bloc una ona amb característiques aproximadament homogènies durant tot el bloc.

El càlcul de la relació senyal soroll segmental es pot representar com un enreixat del tipus:

Codificació de veu

Així doncs, la SNR segmental es calcula com la mitja de les SNR estàndard calculades en cada una de les bandes freqüencials i per cada segment temporal.

Codificació de veu

On iMax és el nombre total de segments temporals i iMax el nombre total de bandes de freqüències.

He realitzat una funció anomenada SNRseg que realitza aquesta mitja:

Function y =SNRseg(SNR)

SNRseg=0;

[iMax jMax]=size(SNR); %Obté les mides del array a calcular-ne la mitja

for i=1:iMax

for j=1:jMax

SNRseg=SNRseg+SNR(i,j); %Acumula tots els valors de l'array

end

end

SNRseg=SNRseg/(iMax*jMax); %Normalitza pel numero de punts de l'array

y=SNRseg;

La forma d'obtenir un enreixat amb el càlcul de la SNR estàndard en cada segment per qualsevol senyal és mitjançant la funció PotSegTF que comentada és la següent:

function [Espec, Freq] = PotSegTF(x, LngVnt,NumBnd, FM)

% function [Espec, Freq] = PotSegTF(x, LngVnt,NumBnd, FM)

%PotSegTF Calcula la SNR d'un senyal en finestres temporals i freqüencials

% PotSegTF(A,B,C,D), a on A és el vector d'entrada, B és la longitud de les

% finestres temporals en numero de mostres, C és el numero de bandes de

% freqüència que volem segmentar i D és la freqüència de mostreig del senyal

% La funció retorna Espec que és la matriu de SNR calculades a cada finestra

% i Freq que conté els valors de les freqüències de les bandes utilitzades

% See also CalcFlog

if nargin==3 %Si no entrem argument de FM la definim a 8KHz

FM = 8000;

end

BndIni = CalcFLog(LngVnt, NumBnd, FM); %Calculem progressió geomètrica de bandes freq.

Freq = BndIni * FM / LngVnt; %Calculem les freqüències de cada banda

NumTrm=floor(length(x) / LngVnt); %Calculem numero màxim de segments temporals

Espec=zeros(NumTrm, NumBnd); %Definim matriu de mida com:

%[Nº segments temporals, Nº seg. freqüencials]

for Trm = 1:NumTrm %Calculem per tots els segments temporals

SenTrm = x((Trm-1)*LngVnt+1:Trm*LngVnt); %SenTrm = Tros del senyal que està en el segment

FFTTrm = fft(SenTrm); %Calculem espectre de SenTrm

NoCero = find(abs(FFTTrm) > 0);

MinVal = min(abs(FFTTrm(NoCero))); %MinVal = mínim valor diferent de zero FFTTrm

FFTTrm =FFTTrm+0.01*MinVal*ones(1,LngVnt); %Sumem a tota la FFTTrm MinVal*0.01

% per treure zeros

for Bnd = 1:NumBnd %Calculem per tots els segments freqüencials

FFTBnd=FFTTrm(BndIni(Bnd):BndIni(Bnd + 1));%FFTBnd = banda freqüencial Bnd del interval

% temporal Trm del senyal

%Calculem la potència en dB de la finestra

Espec(Trm,Bnd)=10*log10(FFTBnd*FFTBnd'/length(FFTBnd));

end

end

En tots els programes utilitzo la funció PotSegTF amb una longitud de segment temporal de 200 mostres ja que aquesta correspon a 25 ms si la freqüència de mostreig és de 8KHz i per altre banda utilitzo 12 bandes per tal de simplificar el procés de càlcul.

En primer lloc representem la potència de senyal en un gràfic temps - freqüència:

Codificació de veu

Com es pot observar en l'eix vertical tenim que la màxima potència de la senyal està compresa en les bandes freqüencials 3 - 8 que corresponen a 200Hz - 880Hz. Per altre banda tenim que la potència de la senyal és molt elevada en alguns blocs temporals que corresponen a vocals sonores, mentre que els blocs temporals amb potència baixa corresponen als silencis entre paraules.

A continuació tenim un gràfic temps - freqüència amb la potència de soroll per un quantificador lineal:

Codificació de veu

Com es pot observar tenim que la potència de soroll és totalment uniforme en qualsevol segment temporal o freqüencial, és a dir, tenim un soroll completament blanc tant en temps com en freqüència. En realitat, el soroll vist des del punt de vista temporal no serà quasi mai uniforme, ja que com vàrem veure en la pràctica anterior tindrem soroll de underflow quan el senyal sigui molt feble (silèncis) i soroll de overflow quan la potència de senyal sigui superior al fons d'escala escollit.

Si observem en un gràfic temps - freqüència la potència de soroll per un quantificador delta:

Codificació de veu

En aquest cas podem veure que freqüencialment el soroll està conformat, ja que és major a baixes freqüències que a altes (com el senyal) i per altre banda tenim que el soroll està conformat en temps, ja que tenim algunes línies verticals amb una potència de soroll molt inferior que corresponen als silencis existents entre paraules.

2.- ESQUEMES DE CODIFICACIÓ DE LA SENYAL DE VEU

Com hem observat en el primer apartat tenim que la codificació utilitzant un quantificació linial (PCM) no és gaire eficaç, ja que no aprofita els efectes del emmascarament en temps ni en freqüència. Per tal d'aprofitar aquestes característiques de l'oïda humana apareixen uns nous esquemes de quantificació que permeten conformar el soroll amb la forma del senyal tant temporalment com freqüencialment. Aquests esquemes, tot i aconseguir una SNR estàndard igual o inclus pitjor a la codificació PCM tenim que aprofiten al màxim els efectes de l'emmascarament i obtenen per un mateix numero de bits una SNR segmental molt superior que en el cas de la codificació PCM i, per tant, obtenim una millora subjectiva de la qualitat en el senyal codificat.

Les maneres d'aconseguir conformar el soroll amb el senyal són diverses i es basen en dues estratègies bàsiques: tenim un tipus de codificacions que basen el seu funcionament en variar el pas de quantificació del quantificador linial en funció de l'amplitud del senyal (logarítmics, adaptatius...) i per altre banda tenim els codificadors que es basen en un quantificador linial precedit d'un filtre amb coeficients variables que modifica les característiques del senyal d'entrada per tal de mantenir-ne la variança constant (predictius)

EL QUANTIFICADOR DE FONS D'ESCALA ADAPTAT A LA POTÈNCIA

Com hem vist en el quantificador linial, tenim un dilema en la quantificació de senyal de veu. Per una banda volem un pas de quantificació el suficientment gran com per poder tractar tot el marge dinàmic pic a pic del senyal. Per altre banda volem tenir un pas de quantificació el petit per tal de reduir el soroll de quantificació. Això és inherent al senyal de veu, ja que tenim fortes variacions en l'amplitud del senyal en funció de la persona que emet la veu, el soroll en l'entorn i els moments entre que hi ha veu i els silencis entre paraules.

La idea bàsica dels quantificadors amb fons d'escala adaptat a la potència estimada del senyal és la de fer variar el fons d'escala d'un quantificador linial per tal d'adaptar-se a la variança del senyal d'entrada. El codificador varia el fons d'escala per tal d'ajustar-lo continuament a quatre vegades la desviació típica del senyal d'entrada del moment que és a on obtindrem un màxim de SNR amb un quantificador linial i per tant obtindrem una SNR òptima en tot moment.

Per tal de poder ajustar el fons d'escala en funció de la potència de senyal ens cal conèixer la potència del senyal d'entrada en tot moment i això hi volem fer sense haver de fer gaires càlculs i per tant:

Codificació de veu

Així doncs, tenim que només ens cal emmagatzemar la potència del senyal en la mostra anterior i calcular el quadrat de la mostra actual per tal de poder tenir la variança a la mostra actual

Aquest mètode tenim que per el càlcul de la variança a la mostra actual té per igual consideració a les n mostres anteriors i per tant tenim que si considerem moltes mostres anteriors el sistema s'adaptarà d'una manera molt lenta, mentre que si tenim en consideració per al càlcul de la potència un número de mostres reduït el sistema s'adaptarà molt ràpidament, però cal anar en compte en no adaptar-se al soroll. Així doncs, hem de triar un sistema que s'adapti a les variacions macroscòpiques del senyal que són degudes als diferents fonemes, però no volem que se'ns adapti al soroll.

Com que cada fonema dura uns 100 ms tenim que el nostre sistema s'ha d'adaptar a aquestes variacions, però no s'ha d'adaptar a les variacions microscòpiques degudes a la modulació d'un so (peech). Una solució de compromís és utilitzar els darrers 25 ms per tal d'adaptar el senyal.

Codificació de veu

En el nostre cas que utilitzem una freqüència de mostreig de 8KHz implica considerar 200 mostres per al càlcul de la variança actual del senyal. Usualment s'utilitza una finestra exponencial de tal forma que tenen més importància les darreres mostres per al càlcul de la potència de senyal que les primeres.

2.1.- EL QUANTIFICADOR ADAPTAT MOSTRA A MOSTRA

Aquest esquema de codificació millora la quantificació adaptada a l'estimació de la potència de senyal ja que en l'esquema anterior a vegades es produïa saturació. El concepte bàsic d'aquesta codificació és la d'augmentar el fons d'escala quan hi ha hagut saturació i reduir el fons d'escala quan no n'hi ha hagut.

Per tal d'implementar el quantificador només ens cal definir una taula per la qual multipliquem el fons d'escala en funció de si hi ha hagut saturació o no i quin és el valor de quantificació al que ens trobem. Per tal de descodificar la senyal només ens caldrà tenir en compte el valor del fons d'escala en el que s'ha quantificat la mostra i ja obtindrem la senyal descodificada.

El programa utilitzat per realitzar aquest quantificador és:

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

% %

% QUANTIFICADOR ADAPTATIU MOSTRA A MOSTRA %

% %

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

Function xdq = StpByStp(Entrada, Vector, Bits, Fs);

% StpByStp: Aquesta funció realitza una codificació adaptativa mostra a mostra

% xdq = StpByStp(Entrada, Vector, Bits, Fs);

% Entrada = Senyal d'entrada a codificar

% Vector = vector de factors multiplicatius del fons d'escala de longitud 2^(Bits-1)

% Bits = Numero de bits a la que es vol fer la codificació

% Fs = Freqüència de mostreig

If nargin == 3

Fs=8000;

End;

Nivells=2^(Bits-1); % Defineix el numero de nivells del quantificador linial

FS=zeros(length(Entrada),1);

xdq=zeros(length(Entrada),1);

FS(1)=max(abs(Entrada)); % Fons d'escala d'inici

for i=1:length(Entrada)

%Realitzem la quantificació linial sense pas per zero

Delta=FS(i)/Nivells;

y=round((Entrada(i)/Delta)-0.5); % Realitzem la quantificació

Dummy=find(y>=Nivells-0.5); % Busquem posicions que passen del fs

y(Dummy)=(Nivells-0.5)*ones(length(Dummy),1); % Saturem valors a fs

Dummy=find(y<=(0.5-Nivells)); % Busquem posicions que passen de -fs

y(Dummy)=(0.5-Nivells)*ones(length(Dummy),1); % Saturem valors a -fs

xq=y;

%Realitzem la dequantificació sense pas per zero

xdq(i)=(xq+0.5)*Delta; % Realitzem la quantificació

%Calculem seguent valor de FS per adaptar

FS(i+1)=FS(i)*Vector(abs(xq)+0.5);

end

Totes les gràfiques d'aquesta pràctica els he aconseguit mitjançant un vector d'adaptació del fons d'escala amb tots els seus elements igual a 0.8 excepte el darrer que l'hi he assignat el valor de 2 per tal de evitar la saturació del sistema enfront un canvi molt brusc en l'envolvent de la senyal.

A continuació tenim una gràfica a on podem veure l'evolució temporal del senyal i del soroll de quantificador per un quantificador linial de 3 bits i per un quantificador adaptatiu mostra a mostra amb el mateix numero de bits i amb un vector d'adaptació [2 0.8 0.8 0.8 0.8 0.8 0.8 2] :

Codificació de veu

Com podem observar el quantificador adaptatiu conforma temporalment el soroll amb la senyal de tal forma que hi ha una forta correlació entre el senyal i l'error de quantificació. Així doncs, tenim que quant el senyal és potent el soroll també, mentre que quan el senyal és dèbil el soroll també i per tant estem aprofitant al màxim l'efecte d'emmascarament temporal.

A continuació tenim una gràfica amb l'espectre de potència de la senyal d'entrada i del soroll de quantificació per al quantificador adaptatiu:

Codificació de veu

Com es pot observar l'espectre de soroll del quantificador adaptat mostra a mostra és totalment plà i per tant tenim que no hi ha cap mena de conformació freqüencial del soroll amb el senyal i per tant aquest esquema de codificació no aprofitarà els efectes de l'emmascarament freqüencial.

A continuació anem a visualitzar calcular la SNR estàndard i segmental per al quantificador adaptatiu mostra a mostra. Si visualitzem la SNR segmental per un quantificador adaptatiu mostra a mostra de 3 bits tenim:

Codificació de veu

Podem observar que el soroll ha quedat conformat amb la forma del senyal i per tant obtindrem una millora de la qualitat en el senyal codificat de manera adaptativa que en la quantificació linial, ja que aprofitem els efectes de l'emmascarament.

Si calculem la SNR estàndard per diferents números de bits i per al quantificador linial i l'adaptatiu obtenim la següent gràfica:

Codificació de veu

Com podem observar tenim que, pel què fa a la SNR estàndard, el quantificador adaptat mostra a mostra és clarament millor quan el nombre de bits utilitzat és inferior a 5 (zona I). Si el nombre de bits és superior a 5 (zona II) tenim que és millor utilitzar un quantificador linial. Aquest efecte és degut a que al augmentar molt el numero de bits tenim que el quantificador linial disminueix la potència de soroll en 6 dB per cada bit, mentre que el quantificador adaptat mostra a mostra tenim que per molt que augmentem el numero de bits si fem una adaptació no perfecte al fons d'escala no és l'adequat i això ens repercuteix negativament amb la potència de soroll.

Si realitzem el mateix gràfic per la SNR segmental tenim:

Codificació de veu

Observem que el codificador adaptatiu mostra a mostra és millor mentre el numero de bits utilitzats sigui inferior a 6 (Zona I). Per altre banda podem observar que el fet de calcular la SNR segmental hem penalitzat molt el quantificador linial, ja que hem passat per exemple de una SNR estàndard de 1 dB a una SNR segmental de -7dB per a 3 bits. Per altre banda tenim que el codificador adaptat mostra a mostra no ha estat gens castigat pel fet de calcular la SNR de forma estàndard o segmental ja que té la potència de soroll conformada amb el senyal.

El programa utilitzat per realitzar aquestes gràfiques ha estat:

%Lectura del senyal d'entrada

Entrada=wavread('golpe8.wav');

Entrada=Entrada(50:length(Entrada)-50);

Entrada=Entrada-mean(Entrada);

%Definició de constants:

Fs=8000;

Ts=1/Fs;

Bits=9;

f=Fs/length(Entrada):Fs/length(Entrada):Fs;

t=Ts:Ts:length(Entrada)*Ts;

SNR_Adaptat=zeros(Bits,1);

SNR_linial=zeros(Bits,1);

SNRsegmental_Adaptat=zeros(Bits,1);

SNRsegmental_linial=zeros(Bits,1);

for Bits=3:9

Nivells=2^(Bits-1);

Vector=0.8*ones(2^(Bits-1),1); %Definim vector de coeficients de FS

Vector(length(Vector))=2;

FS=max(abs(Entrada));

xdq = StpByStp(Entrada, Vector, Bits, FS);

%Quantificador adaptatiu

Soroll=Entrada-xdq;

SNR_Adaptat(Bits) =10*log10( (Entrada'*Entrada)/(Soroll'*Soroll));

[EspecS, Freq] = PotSeg(Entrada',200,12);

[EspecN, Freq] = PotSeg(Soroll',200,12);

SNRsegmental_Adaptat(Bits)=SNRseg(EspecS'-EspecN');

%Quantificador linial

y=QuanLin(Entrada,max(abs(Entrada)),Bits,1);

z=DeQuan(y,max(abs(Entrada)),Bits,1);

Error=Entrada-z;

SNR_linial(Bits) = 10*log10((Entrada'*Entrada)/(Error'*Error));

[EspecS, Freq] = PotSeg(Entrada',200,12);

[EspecN, Freq] = PotSeg(Error',200,12);

SNRsegmental_linial(Bits)=SNRseg(EspecS'-EspecN');

end

NBits=1:1:9;

figure(1);

plot(NBits(3:9),SNR_linial(3:9)); %Pintem corba de SNR estàndard vs Bits

hold on

plot(NBits(3:9),SNR_Adaptat(3:9),'b');

xlabel('Numero de bits');

ylabel('SNR (dB)');

figure(2); %Pintem corba de SNR segmental vs Bits

plot(NBits(3:9),SNRsegmental_linial(3:9));

hold on

plot(NBits(3:9),SNRsegmental_Adaptat(3:9),'b');

xlabel('Numero de bits');

ylabel('SNR (dB)');

2.2.- EL QUANTIFICADOR DELTA

El quantificador delta és un cas particular dels quantificadors predictius i per tant ens cal entendre els quantificadors predictius per tal de poder comprendre el quantificador delta.

ELS QUANTIFICADORS PREDICTIUS

Els quantificadors predictius basen el seu funcionament en la predictivilitat de la senyal d'entrada. La predictivilitat d'un senyal ens ve donat per la forma del seu espectre.

Posem, per exemple, el cas el soroll blanc que com tots sabem té espectre pla. En aquest cas tenim que no es pot realitzar cap predicció sobre quin serà el següent valor, ja que aquest és totalment aleatori o, el què és el mateix, és totalment independent de les mostres anteriors.

Si agafem un senyal que no tingui espectre pla si que podrem fer una predicció (més o menys encertada) del següent valor en funció de les mostres anteriors, ja que la següent mostra dependrà de les mostres anteriors.

Una altre manera de mesurar la predictivilitat del senyal és mitjançant l'autocorrelació del senyal. La funció autocorrelació es defineix com:

Codificació de veu

Un senyal que tingui una Rxx(1)"Rxx(0) tenim que és un senyal molt predictible ja que ens demostra que la següent mostra està fortament correlada amb les mostres anteriors, mentre que si el senyal té una Rxx(1)<<Rxx(0) és un senyal molt poc predictible. Això es pot il·lustrar amb els següents senyals i les seves respectives autocorrelacions:

SOROLL SENYAL

Els quantificadors predictius basen el seu funcionament en quantificar l'error de predicció en comptes de quantificar la senyal directament. És a dir, a partir de N mostres anteriors fan una predicció de la mostra següent i es quantifica, de manera lineal, la diferència entre el valor de la mostra del senyal i el valor predit per la mostra.

Per tal de tenir un guany (millora de la SNR amb un mateix numero de bits) ens cal que el fons d'escala que es necessiti per tal de quantificar l'error de predicció sigui molt menor al fons d'escala de la pròpia senyal i per tant la potència de l'error de predicció haurà de ser menor a la potència del senyal.

EL QUANTIFICADOR DELTA

El quantificador delta és un cas particular dels quantificadors predictius. La seva predicció es basa en suposar que la següent mostra serà igual a la actual i quantificar aquest error mitjançant un quantificador lineal.

Hi ha dos esquemes de blocs que implementen aquest quantificador:

Estructura forward:

Estructura backward:

Com vàrem veure en el quantificador lineal, tenim que la SNR ens bé determinada per el numero de bits i el fons d'escala utilitzats. Com es va poder observar en la pràctica anterior en funció del fons d'escala teníem una SNR que tenia la següent forma:

Codificació de veu

Així doncs, per un numero determinat de bits aconseguíem la millor SNR quan:

Codificació de veu

A continuació tenim la gràfica de SNR segmental per a diferents numeros de bits per al quantificador linial:

Codificació de veu

Com podem observar el fet de calcular la SNR de forma segmental tenim que castiga fortament el quantificador linial per un nombre petit de bits ja que per exemple en el cas de 2 bits tenim una SNR estàndard màxima de 6dB mentre que en el cas de la SNR segmental per al mateix nombre de bits tenim una SNR màxima de 2dB.

En el cas del quantificador delta tenim que en comptes de quantificar el senyal directament, quantifiquem la diferència entre la mostra actual i la anterior. Com més endavant demostrarem, la potència del senyal que conforma aquesta diferència és molt menor a la potència del senyal i per tant podem utilitzar un fons d'escala molt menor obtenint la mateixa SNR.

Si calculem la potència de la senyal que quantifiquem en l'estructura forward tenim:

Codificació de veu

Així doncs, el guany obtingut en la quantificació delta depèn única i exclusivament de la potència del senyal d'error de predicció que quantifiquem. Per tal de reduir aquesta potència podem augmentar la freqüència de mostreig (excepte en els senyals estrictament incorrelats), ja que d'aquesta forma aconseguirem augmentar la correlació entre mostres adjacents i per tant reduirem la potència de l'error de predicció.

Si la correlació entre mostres adjacents és molt elevada tenim que el quantificador que podem utilitzar pot ésser molt simple (1 bit) ja que aconseguim un error de quantificació petit degut a tenir una senyal a quantificar amb una variança molt petita. Aleshores el bit-rate és igual a la freqüència de mostreig

Per tant tenim que obtindrem un guany si (1)>0,5. La senyal de veu és una senyal que compleix amb escreix aquesta condició ja que usualment tindrem valors de (1) que estaran entorn de 0.85 i, en tot cas, sempre podem augmentar (1) augmentant la freqüència de mostreig.

En el cas de la nostra senyal de veu si calculem l'autocorrelació i la potència del senyal tenim:

Codificació de veu

Per altre banda si calculem el coeficient (1) del senyal d'entrada tenim:

%Lectura del senyal d'entrada al sistema

Entrada=wavread('golpe8.wav');

Entrada=Entrada-mean(Entrada);

%Càlcul de l'autocorrelació

z=xcorr(Entrada,Entrada);

%Càlcul dels valors de Rxx(0) i Rxx(1) i de ro(1)

[x y]=max(z);

Rxx0=z(y);

Rxx1=z(y+1);

ro=Rxx1/Rxx0

El resultat obtingut és:

Codificació de veu

Com es pot observar el valor calculat i el valor real s'aproxima molt al teòric de 0,85.

El problema de l'estructura backward és que no es pot veure l'efecte de la conformació de l'espectre de potència de soroll a l'espectre de la potència de senyal. Per altre banda tenim que no es pot realitzar mitjançant una estructura de tipus filtrat amb el Matlab cosa que converteix el procés en molt més lent. Per altre banda, l'estructura forward té el problema que en funció del valor de alpha i si el quantificador és sense pas per zero tenim que apareix un problema d'inestabilitat i la sortida va acumulant-se indefinidament. Això és degut a que si tenim dues mostres consecutives iguals al fer-ne la resta tenim una diferència de zero que al ésser quantificada amb un quantificador sense pas per zero fa que s'hagi d'assignar algun valor diferent de zero i aquest error es va acumulant de manera que la sortida va augmentant indefinidament.

Per tal d'implementar el quantificador delta extrauré la resposta impulsional del quantificador forward, ja que així el podré implementar mitjançant funcions de filtrat del matlab.

Codificació de veu

Així doncs, només ens cal implementar un filtre FIR amb la resposta impulsional H[z] per tal d'implementar el quantificador delta. Aplicant aquest filtre obtindrem el senyal format per la diferència de la senyal actual amb l'anterior, és a dir, la senyal a quantificar. Aquesta senyal caldrà demostrar que té una potència inferior a la senyal d'entrada i calcular el guany teòric que obtindrem. A continuació aplicarem el quantificador lineal i obtindrem ja la senyal quantificada.

Per tal de implementar el descodificador podem realitzar el procés invers i llavors tenim:

Si realitzem una quantificació del senyal de veu mitjançant aquest sistema i una dequantificació i mostrem la densitat espectral de potència de senyal amb el de soroll tenim:

Codificació de veu

Per obtenir aquesta gràfica he utilitzat el programa:

%Definició de constants:

Fs=8000;

Bits=8;

%Lectura del senyal a processar

Entrada=wavread('golpe8.wav');

Entrada=Entrada-mean(Entrada);

Dummy=filter([1 -0.85],1,Entrada); %Realitza equació de diferències H(z)=1-a*z^-1

Out=delta(Entrada,Bits,4*std(Dummy)); %Realitza la quantificació delta

Out=Out-mean(Out); %Treu mitja de senyal de sortida

Soroll=Entrada-Out;

Soroll=20*log10(abs(fft(Soroll))); %Calcula densitat espectral de potència de soroll

Senyal=20*log10(abs(fft(Entrada))); %Calcula densitat espectral de potència de senyal

f=Fs/length(Senyal):Fs/length(Senyal):Fs; %Converteix eix x de mostres a freqüència

figure(1); %Representa espectre de senyal i de soroll

plot(f,Senyal);

hold on

plot(f,Soroll,'m');

hold off

axis([0 Fs 0 max(Senyal)]); %Adapta la finestra de visualització

TITLE('Densitat espectral de potència de senyal i de soroll');

ylabel('dB');

xlabel('Freqüència (Hz)');

Com es pot observar clarament, l'espectre de soroll queda totalment conformat (en una aproximació de primer ordre) amb l'espectre del senyal de tal manera que a on el senyal és més potent el soroll també és més potent i on el senyal té menys potència la potència de soroll és molt menor.

Si realitzem la gràfica de la SNR estàndard en funció del fons d'escala per diferent numero de bits tenim:

Codificació de veu

El programa utilitzat per realitzar la gràfica és:

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

% %

% SNR PER QUANTIFICADOR DELTA %

% %

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

function y=SorollD(Entrada,Bits)

%Lectura del senyal d'entrada

So=wavread('golpe8.wav');

So=So-mean(So);

Max=max(abs(So)); %Calcula el valor màxim del senyal en abs

S=10*log10(So'*So); %Potència de senyal

figure(1);

for NBits=2:5 %Realitza corba per diferents numeros de bits

i=1;

for Escala=0.5:0.5:2*Max,

z=delta(So,NBits,Escala); %Realitza la quantificació i la dequantificació delta

Error=So-z; %Calcula el soroll

N=10*log10(Error'*Error); %Potència de soroll

SNR(i)=S-N; %Calcula SNR en aquest punt

FS(i)=Escala/(4*std(So));

i=i+1;

end

plot(FS,SNR); %Dibuixa la corba pel numero de bits corresponent

hold on

end

hold off

%Representa les unitats i títol de la corba

xlabel('FS/4*std');

ylabel('SNR (dB)');

TITLE('SNR vs FS PER AL QUANTIFICADOR DELTA');

y=Error;

Com es pot observar en aquesta gràfica tenim que la SNR té un màxim quan el FS és menor a quatre vegades la desviació típica del senyal d'entrada i això és degut a que la senyal que quantifiquem té una desviació típica menor que la senyal d'entrada.

Per altre banda podem observar que la SNR calculada de forma estàndard és pitjor en el cas del quantificador delta que en el quantificador lineal per a un mateix numero de bits. Aquesta mesura però no és útil, ja que la gràcia del quantificador delta és que conforma el soroll i per tant aprofita les característiques de l'oïda humana, de tal manera que, tot i tenir més potència de soroll, el quantificador delta permet obtenir senyals que s'escolten molt millor. Per tal de tenir una mesura objectiva de la SNR utilitzem la SNR calculada de forma segmental.

Si mostrem la SNR segmental per el quantificador lineal i pel quantificador delta tenim:

Podem observar que en el quantificador delta hi ha zones on el soroll és molt elevat que en el quantificador lineal, en aquestes zones tenim que la potència de senyal és elevada, mentre que hi ha zones on el soroll és molt més petit que en el quantificador lineal que coincideixen en les zones a on el senyal té poca potència.

Si calculem la SNR segmental en per diferent numero de bits i en funció del fons d'escala tenim:

Codificació de veu

Com podem observar tenim una SNR segmental que és màxima quan el fons d'escala és molt menor a quatre vegades la variança del senyal ja que la variança del senyal quantificat (error de predicció) és molt inferior a la del senyal d'entrada. Tenim una SNR segmental que és millor que per al quantificador linial ja que per exemple en el quantificador linial tenim una SNR segmental per quatre bits màxima de -1dB.

CONCLUSIONS

A les conclusions que puc arribar és que el comportament de l'oïda humana i la forma característica del senyal de veu humana es poden aprofitar per aconseguir esquemes de codificació més eficients. Per altre banda tenim que la mesura de la qualitat no es pot realitzar amb la SNR estàndard ja que no inclou els efectes deguts a aquestes característiques particulars de la veu humana. Per altre banda s'introdueix un mètode objectiu de mesurar la qualitat subjectiva d'un sistema de codificació, la SNR segmental. Aquesta SNR segmental podem dir que tampoc és de gran utilitat ja que, com he pogut comprovar en aquesta pràctica, no sempre mesura d'una forma objectiva la qualitat real audible d'una codificació determinada.

Per altre banda tenim que si augmentem la qualitat del senyal mitjançant una codificació determinada no és d'altre manera que comprimint la informació i per tant si aquesta senyal l'hem de transmetre per un medi no lliure d'errors caldrà afegir una redundància que ens provocarà que tot allò que ens hem estalviat amb una codificació eficaç ho perdem amb bits de CRC.

Processat del senyal

1

31

Codificació de veu

Z-1

Q

X[n]

X[n-1]

Xd[n]=X[n]-X[n-1]

epq[n]

Q

Z-1

Q-1

X[n]

Xd[n]=X[n]-X[n-1]

epq[n]

Xr[n-1]

Xdr[n]

FILTRE

Codificació de veu

X[n]

QUANTIF.

Xd[n]

epq[n]

x

xd<<x

QUANTIF.

epq[n]

FILTRE

Codificació de veu

Y[n]

FILTRE DE PRE-ENFASIS

FILTRE DE DE-ENFASIS

40Hz

40Hz

Codificació de veu

Codificació de veu

Albino !

Màscara

So




Descargar
Enviado por:Sergi Redorta
Idioma: catalán
País: España

Te va a interesar