Codificació de veu

Anuncio
PRÀCTICA 2
CODIFICACIÓ DEL SENYAL 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
1
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:
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:
2
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:
3
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.
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.
4
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.
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:
5
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:
6
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ó.
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.
7
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:
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.
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
8
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
9
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:
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:
10
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:
11
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.
12
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:
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.
13
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);
14
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] :
15
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:
16
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:
17
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:
18
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:
19
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;
20
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;
21
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:
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:
22
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:
Així doncs, per un numero determinat de bits aconseguíem la millor SNR quan:
23
A continuació tenim la gràfica de SNR segmental per a diferents numeros de bits per al quantificador linial:
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:
24
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:
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:
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
25
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.
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:
Per obtenir aquesta gràfica he utilitzat el programa:
26
%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:
27
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
28
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.
29
Si calculem la SNR segmental en per diferent numero de bits i en funció del fons d'escala tenim:
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
30
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
X[n]
QUANTIF.
Xd[n]
epq[n]
x
xd<<x
31
QUANTIF.
epq[n]
FILTRE
Y[n]
FILTRE DE PRE−ENFASIS
FILTRE DE DE−ENFASIS
40Hz
40Hz
32
Albino !
Màscara
So
33
Descargar