TELECOMUNICAÇÕES II Trabalho nº 1 Quantização Trabalho realizado por : Igor Terroso Fernando Pinto Oscar Patrício da Turma 4EEC08
OBJECTIVO : O objectivo do trabalho é analisar as operações de quantização uniforme e não uniforme de um sinal analógico amostrado. INTRODUÇÃO : Devido ao facto de a explicação teórica já estar amplamente esplanada no guião do trabalho não é necessário uma introdução teórica. Como tal iremos apenas efectuar a parte prática, á qual acrescentaremos comentários ás diversas situações que forem ocorrendo. EXECUÇÃO PRÁTICA : Apresentaremos os diversos programas em Matlab e as figuras obtidas seguindo os pontos pedidos no guião : 1-Quantização Uniforme do sinal A primeira quantização terá de ser feita com um débito binário de 4 bits ( R ), ou seja cada nível de quantização equivalerá a um nº de 4 bits e isto obtém-se da seguinte forma : R R L = 16 = R = 4 bits / s R R L = 56 = R = 8 bits / s Paralelamente, como se pode vêr na segunda linha dos cálculos, obtém-se um débito binário de 8 bits para o segundo caso em que se utilizam 56 níveis. O circuito utilizado para a quantização uniforme é o seguinte : Fig.1) Modelo (Simulink) utilizado para simular a quantização uniforme Como nota podemos acrescentar que o bloco de ganho tem ganho unitário pois o sinal já está normalizado, ou seja já só possui amplitudes compreendidas entre 1 e 1. Nos diversos blocos do modelo definem-se as variáveis adequadas á simulação e define-se também um executável no editor do Matlab que define as variáveis a importar pelo modelo Simulink do Workspace. Esse programa está definido a seguir : 1
%AMOSTRAGEM COM 16 NÍVEIS DO FICHEIRO SPEECH.WAV %Leitura do ficheiro de áudio [x,fs,nbits]=wavread('speech'); x=wavread('speech.wav',[8*fs 8.1*fs]); n_amostras=length(x); tempo_final=n_amostras/fs; t=0:1/fs:tempo_final-1/fs;%subtrai-se 1/fs pois tenho de contar com a amostra índice zero t=[t]';%tenho de transpor o vector de tempo para poder usar no simulink R=4; %nº de bits L=^R; %nº de níveis max=1; min=-1; gama=max-min; %Gama Dinâmica delta=gama/l; %Passo de partição %níveis de decisão e de quantização partition=min+delta:delta:max-delta; %Níveis de decisão codebook=min+delta/:delta:max-delta/;%níveis de quantização %Não é preciso normalizar o sinal pois ele já só tem amplitudes inferiores a 1 %Simulação do modelo Simulink sim ('quantizacao_uniforme') %Representação do sinal original - speech.wav load sinal whitebg(figure(1)); title('sinal Original - Speech.wav'); plot(sinal_ori(1,:), sinal_ori(,:)) %Representação do sinal quantizado com 16 níveis load sinal_unif clf whitebg(figure()); title('sinal quantizado uniformemente com 16 níveis'); plot(squ16(1,:), squ16(,:)) Para a simulação com 56 níveis utilizou-se o código seguinte : %AMOSTRAGEM COM 56 NÍVEIS DO FICHEIRO SPEECH.WAV %Leitura do ficheiro de áudio [x,fs,nbits]=wavread('speech'); x=wavread('speech.wav',[8*fs 8.1*fs]); n_amostras=length(x); tempo_final=n_amostras/fs; t=0:1/fs:tempo_final-1/fs;%subtrai-se 1/fs pois tenho de contar com a amostra índice zero t=[t]';%tenho de transpor o vector de tempo para poder usar no simulink R=8; %nº de bits L=^R; %nº de níveis %Gama Dinâmica
max=1; min=-1; gama=max-min; delta=gama/l; %níveis de decisão e de quantização partition=min+delta:delta:max-delta; %Níveis de decisão codebook=min+delta/:delta:max-delta/;%níveis de quantização %Não é preciso normalizar o sinal pois ele já só tem amplitudes inferiores a 1 %Representação do sinal quantizado uniformemente sim ('quantizacao_uniforme') load sinal_unif clf whitebg(figure(1)); title('sinal quantizado uniformemente com 56 níveis'); plot(squ56(1,:), squ56(,:)) %Representação do sinal original - speech.wav load sinal whitebg(figure()); title('sinal Original - Speech.wav'); plot(sinal_ori(1,:), sinal_ori(,:)) SINAIS OBTIDOS : Os sinais obtidos foram os seguintes : Fig.) Sinal Original de áudio. Este é o sinal original com que estamos a trabalhar, como podemos constatar, ele tem uma duração aproximada de 0 segundos, o que com uma frequência de amostragem de aproximadamente KHz nos dá um total de aproximadamente 450000 amostras do sinal discreto. Utilizou-se o circuito previamente mostrado para quantizar o sinal com 16 níveis e o sinal obtido foi o seguinte : 3
Fig.3) Sinal speech.wav quantizado com 16 níveis Podemos observar nas figuras anteriores que a quantização com apenas 16 níveis introduz bastante erro de quantização e a cópia do sinal original não é, de longe, satisfatória. Mas vejamos o que acontece quando se quantiza com 56 níveis : Fig.4) Sinal speech.wav quantizado com 56 níveis Numa primeira observação já é possível vêr que o sinal quantizado com 56 níveis já se assemelha bastante mais com o original do que o sinal com 16 níveis, mas para comprovar isto vamos vêr uma amostra deste sinal e compará-la com o original : 4
ERROS DE QUANTIZAÇÃO : O erro de quantização é uma variável aleatória com valores compreendidos no intervalo < erro <. Geralmente esta variável aleatória apresenta características que a permitem analisar de melhor forma, por exemplo se o seu valor médio for nulo e se tiver uma função densidade de probabilidade uniforme, a sua potência média é igual á sua variância, ou seja: Se representarmos o ruído de quantização por e Q : σ Q = e Q p( eq ) deq = 1 Para os nosso dois casos temos : 0.15 16 níveis σ Q = = 0. 0013 1 0.15 0.15 < erro < 0.065 < erro < 0. 065 0.0078 56 níveis σ Q = = 5.07E 6 1 0.0078 0.0078 < erro < 0.0039 < erro < 0.0039 Para comprovar estes valores construiu-se um modelo Simulink para medir o erro de quantização : Fig.5) Modelo (Simulink) utilizado para obter o erro na quantização uniforme 5
Para correr o modelo simulink e obter os gráficos basta acrescentar estes pequenos trechos de código ao já implementado : %ERRO DE QUANTIZAÇÃO UNIFORME COM 56 NÍVEIS DO FICHEIRO SPEECH.WAV %Simulação do modelo Simulink sim ('erro_quantizacao_uniforme') load erro_unif whitebg(figure(1)); title('erro de quantização uniforme com 16 níveis'); plot(equ16(1,:), equ16(,:)) %ERRO DE QUANTIZAÇÃO UNIFORME COM 56 NÍVEIS DO FICHEIRO SPEECH.WAV %Simulação do modelo Simulink sim ('erro_quantizacao_uniforme') load erro_unif whitebg(figure(1)); title('erro de quantização uniforme com 56 níveis'); plot(equ56(1,:), equ56(,:)) Sem esquecer, no entanto, de correr no workspace os ficheiros de quantização já com estas alterações feitas de modo a disponibilizar os sinais necessários á representação gráfica. Os gráficos obtidos para os dois casos são : Fig.6) Em cima Erro de quantização uniforme com 16 níveis Em baixo Erro de quantização uniforme com 56 níveis 6
Os limites anteriormente calculados estão respeitados no gráfico e desde logo se vê que, com 56 níveis o erro de quantização é bem menor do que com 16 níveis. De reparar que em ambos os gráficos se nota a flutuação do erro de quantização aquando da transição dos períodos de silêncio, onde ele toma o seu valor máximo, para os períodos sonoros em que ele flutua entre o valor máximo e mínimo. -Quantização Não-Uniforme ( Lei A para a compressão ) Para diminuir o erro de quantização que se acentua para sinais de amplitude fraca começou-se a utilizar a quantização não uniforme, em que o sinal é, numa primeira fase, comprimido e posteriormente quantizado. Para definir a compressão dos sinais desenvolveram-se duas leis : A lei A e a lei µ sendo a 1ª mais usada na Europa e a que vamos utilizar para o nosso trabalho e a segunda usada mais nos EUA. Seguindo a lei de compressão A temos a seguinte expressão que traduz a relação entrada/saída do compressor : v A x 1+ log A = 1 + log( A x ) 1+ log A 0 x 1 x A 1 A 1 A ideia principal da quantização não uniforme é definir diferentes degraus de quantização conforme a amplitude do sinal a quantizar, daí advém o nome deste tipo de quantização, pois aqui a amplitude dos degraus de quantização não é constante. O circuito utilizado para a quantização não uniforme foi o seguinte : Fig.7) Modelo Simulink para a quantização não uniforme 7
A amostragem do sinal é feita de novo com o trecho de programa apresentado anteriormente mas agora, como podemos vêr no circuito temos de especificar outros parâmetros para os novos blocos que nos surgem no modelo, nomeadamente para o blocos A-law compressor e A-law expander em que temos de especificar os valores de A a utilizar para cada situação. Para obter as diversa formas de onda definimos um script file de Matlab (trecho de código) que mais uma vez acrescentamos ao código definido inicialmente : %REPRESENTAÇÃO DO SINAL COMPRIMIDO COM A=0 %Definição do valor da constante A A=0 %Representação do sinal quantizado não uniformemente sim ('quantizacao_nao_uniforme') load sinal_comp clf whitebg(figure(1)); title('sinal comprimido com A=0'); plot(sc0(1,:), sc0(,:)) A representação de todos os trechos de código utilizados para representar os vários sinais tornar-se-ia demasiadamente enfadonha, mas também tal não é necessário pois apenas seriam necessária pequenas alterações ao código para representar os outros sinais SINAIS OBTIDOS : Os sinais obtidos foram os seguintes : Fig.8) Sinal comprimido com A=0 8
Fig.9) Sinal comprimido com A=87.6 Fig.10) Sinal comprimido com A=0 e quantizado com 16 níveis Fig.11) Sinal comprimido com A=87.6 e quantizado com 16 níveis 9
Fig.1) Sinal comprimido com A=0 e quantizado com 56 níveis Fig.13) Sinal comprimido com A=87.6 e quantizado com 56 níveis Agora vamos vêr quais os sinais obtidos após a descompressão dos sinais já quantizados : Fig.14) Sinal descomprimido com A=0 e anteriormente quantizado com 16 níveis 10
Fig.15) Sinal descomprimido com A=87.6 e anteriormente quantizado com 16 níveis Fig.16) Sinal descomprimido com A=0 e anteriormente quantizado com 56 níveis Fig.17) Sinal descomprimido com A=87.6 e anteriormente quantizado com 56 níveis Vejamos qual foi o erro de quantização em todas as situações anteriores : 11
Fig.18)Erro de quantização não uniforme com A=0 e 16 níveis Fig.19)Erro de quantização não uniforme com A=0 e 56 níveis Fig.0)Erro de quantização não uniforme com A=87.6 e 16 níveis 1
Fig.1)Erro de quantização não uniforme com A=87.6 e 56 níveis RELAÇÕES SINAL-RUÍDO : O cálculo das relações sinal ruído faz-se com o seguinte código : %Obtenção das relações Sinal-Ruído de quantização S=mean(x.^); Nqu16=mean(equ16(,:).^); Nqu56=mean(equ56(,:).^); Nqnu016=mean(eqnu016(,:).^); Nqnu056=mean(eqnu056(,:).^); Nqnu87616=mean(eqnu87616(,:).^); Nqnu87656=mean(eqnu87656(,:).^); SNqu16=10*log10(S/Nqu16) SNqu56=10*log10(S/Nqu56) SNqnu016=10*log10(S/Nqnu016) SNqnu056=10*log10(S/Nqnu056) SNqnu87616=10*log10(S/Nqnu87616) SNqnu87656=10*log10(S/Nqnu87656) pause Todos os sinais contidos neste programa já estão disponíveis no workspace pois já corremos as simulações em simulink que os disponibilizaram. Os resultados obtidos foram : Relação Sinal Ruído com quantização uniforme e 16 níveis : SNqu16= 6.4757 db Relação Sinal Ruído com quantização uniforme e 16 níveis : SNqu56= 33.916 db Relação Sinal Ruído com quantização não uniforme (A=0 e 16 níveis) : SNqnu016= 15.7185 db Relação Sinal Ruído com quantização não uniforme (A=0 e 56 níveis) : SNqnu056=40.5889 db 13
Relação Sinal Ruído com quantização não uniforme (A=87.6 e 16 níveis) : SNqnu87616=14.4868 db Relação Sinal-Ruído com quantiz. não uniforme (A=87.6 e 56 níveis) : SNqnu87656=38.3560 db Repare-se que a melhor relação sinal-ruído é para A=0 e 56 níveis, poder-se-ia esperar que fosse para A=87.6 e 56 níveis devido ao facto de este tipo de quantização ser o mais amplamente usado nos sistemas de comunicação actuais. Mas esta expectativa não se aplica aos nosso caso pois o nosso sinal não está restrito a uma banda de frequências até aos 3.4 KHz que é o valor standard para as comunicações de voz e por isso não está sob as condições especiais que permitiriam que com uma quantização não uniforme segundo a lei A, com A=87.6 e 56 níveis obtivesse melhor relação sinal-ruído ESPECTROS : O código para obter os espectros é : %ESPECTROS DOS DIFERENTES SINAIS fexc=[0 fs/]; whitebg(figure(1)); figure(1) iofft(x,xqu16(,:),fs,fexc); title('espectro do sinal quantizado uniformemente com 16 níveis') whitebg(figure()); figure() iofft(x,xqu56(,:),fs,fexc); title('espectro do sinal quantizado uniformemente com 56 níveis') whitebg(figure(3)); figure(3) iofft(x,xqnu016(,:),fs,fexc); title('espectro do sinal quantizado com 16 níveis - A=0') whitebg(figure(4)); figure(4) iofft(x,xqnu056(,:),fs,fexc); title('espectro do sinal quantizado com 56 níveis - A=0') whitebg(figure(5)); figure(5) iofft(x,xqnu87616(,:),fs,fexc); title('espectro do sinal quantizado com 16 níveis - A=87,6') whitebg(figure(6)); figure(6) iofft(x,xqnu87656(,:),fs,fexc); title('espectro do sinal quantizado com 56 níveis - A=87,6') 14
Os espectros obtidos para os diferentes sinais são : Fig.) Espectros do sinal original (em cima) e sinal quantizado uniformemente com 16 níveis(em baixo) Podemos vêr que para esta quantização existem frequências no espectro do sinal quantizado que não aparecem no espectro do sinal original, essas frequências correspondem a ruído de quantização que é introduzido. Nos sinais seguintes vamos constatar que, quanto mais níveis usarmos para a quantização, mais similar fica o espectro do sinal quantizado com o espectro do sinal original. Fig.3) Espectros do sinal original (em cima) e sinal quantizado uniformemente com 56 níveis(em baixo) 15
Fig.4) Espectros do sinal original (em cima) e sinal quantizado não uniformemente com A=0 e 16 níveis(em baixo) Com a quantização não uniforme o espectro do sinal quantizado segue ainda mais fielmente o do sinal original. Á medida que aumentamos os níveis isto ainda se acentua mais. Fig.5) Espectros do sinal original (em cima) e sinal quantizado não uniformemente com A=0 e 56 níveis(em baixo) 16
Fig.6) Espectros do sinal original (em cima) e sinal quantizado não uniformemente com A=87.6 e 16 níveis(em baixo) Fig.7) Espectros do sinal original (em cima) e sinal quantizado não uniformemente com A=87.6 e 56 níveis(em baixo) Como análise a estes gráficos podemos dizer que o que se verifica é que, efectivamente, a quantização uniforme apresenta uma pior relação com o sinal nas frequências, ou seja,é menos semelhante ao espectro do sinal, do que a quantização não uniforme e dentro da uniforme podemos vêr que, com 56 níveis temos um espectro do sinal quantizado mais aproximado do original. Na quantização não uniforme a 17
quantização com 56 níveis é sempre melhor (independentemente do A) e dentro desta última quantização os espectros são bastante semelhantes quer para A=0 quer para A=87.6. RELAÇÃO SINAL-RUÍDO (em função de max(xa)/m máx ): Aqui o que se pretende é observar qual a influência da amplitude do sinal na relação sinal-ruído e como é que dois tipos específicos de quantização se portam com diferentes atenuações para o sinal. Os tipos de quantização a utilizar são os seguintes : Quantização uniforme com 56 níveis ; Quantização não uniforme com A=87.6 e 16 níveis ; Os níveis de atenuação são : [ - 0 db, - 40 db, - 50 db, - 60 db ] O código para esta porção do trabalho não é muito ortodoxo em termos de execução pois obriga-nos a corres várias vezes o script até preencher os valores dos vectores de relação sinal ruído ( Snxa1(i) e Snxa(i)) mas é um código válido. Para cada coluna de cada vector é necessário correr o script file alterando o símbolo? para os valores do índice correspondente (i=1,,3,4) o valor do índice também deve ser actualizado no modelo simulink pois de cada vez que eu correr o script eu quero colocar na entrada do modelo um sinal com diferente atenuação. No fim de todo este procedimento podemos visualizar os dois gráficos pretendidos. Aqui está o script file para a quantização uniforme : %Obtenção do gráfico da relação sinal ruído de quantização uniforme (56 níveis), em db em função de max(xa)/mmáx %Leitura do ficheiro de áudio [x,fs,nbits]=wavread('speech'); x=wavread('speech.wav',[8*fs 8.1*fs]); n_amostras=length(x); tempo_final=n_amostras/fs; t=0:1/fs:tempo_final-1/fs;%subtrai-se 1/fs pois tenho de contar com a amostra índice zero t=[t]';%tenho de transpor o vector de tempo para poder usar no simulink r=[-0-40 -50-60]; for i=1:4 factor=(10^(r(i)/0)) xa(:,i)=factor.*x; end L=56 max=1; min=-1; gama=max-min; %Gama Dinâmica delta=gama/l; %Passo de partição partition=min+delta:delta:max-delta; %Níveis de decisão codebook=min+delta/:delta:max-delta/;%níveis de quantização pause; sim ('erro_quantizacao_uniforme') 18
load x_unif load erro_unif pause; Sxa=mean(xaqu56(,:).^) Nxa=mean(equ56(,:).^) SNxa(?)=10*log10(Sxa/Nxa) whitebg(figure()); figure() plot(r,snxa1); title('relação sinal-ruído de quantização em função de max(xa)/nmax'); O script file para a quantização não uniforme usa outro modelo e é o seguinte : %Obtenção do gráfico da relação sinal ruído de quantização não uniforme (A=87.6 e 56 %níveis), em db em função de max(xa)/mmáx %Leitura do ficheiro de áudio [x,fs,nbits]=wavread('speech'); x=wavread('speech.wav',[1*fs 5*fs]); n_amostras=length(x); tempo_final=n_amostras/fs; t=0:1/fs:tempo_final-1/fs;%subtrai-se 1/fs pois tenho de contar com a amostra índice zero t=[t]';%tenho de transpor o vector de tempo para poder usar no simulink r=[-0-40 -50-60]; for i=1:4 factor=(10^(r(i)/0)) xa(:,i)=factor.*x; end A=87.6 L=16 max=1; min=-1; gama=max-min; %Gama Dinâmica delta=gama/l; %Passo de partição partition=min+delta:delta:max-delta; %Níveis de decisão codebook=min+delta/:delta:max-delta/;%níveis de quantização sim ('erro_quantizacao_nao_uniforme') load x_n_unif load erro_n_unif Sxan=mean(xaqnu87616(,:).^) Nxan=mean(eqnu87616(,:).^) SNxa(?)=10*log10(Sxan/Nxan) whitebg(figure(1)); figure(1) plot(r,snxa); title('relação sinal-ruído de quantização não uniforme (A=87.6 16 níveis) em função de max(xa)/nmax'); Após correr estes trechos de códigos como indicado em cima basta-nos obter o gráfico pretendido : plot(r,snxa1,'b',r,snxa,'r'); 19
O gráfico obtido é o seguinte : SNR(dB) máxxa ( ) ( db) m máx Fig.8) Relação sinal-ruído (db), em função de max(xa)/m máx (db). Característica da quantização uniforme a azul e característica da quantização não uniforme a vermelho. A relação entre os dois tipos de quantização não fica evidente neste gráfico pois já apanhamos a característica de quantização não uniforme numa zona linear e ela não é linear em toda a sua extensão. Para vermos o efeito pretendido basta-nos alterar o nº de amostras captadas do sinal original speech.wav e voltar a calcular pelo procedimento anterior. O gráfico obtido é o seguinte : SNR(dB) máxxa ( ) ( db) m máx Fig.9) Relação sinal-ruído (db), em função de max(xa)/m máx (db). Característica da quantização uniforme a azul e característica da quantização não uniforme a vermelho. Esta característica é tiras com mais amostras do que a anterior. 0
Agora já é visível o verdadeiro comportamento da quantização não uniforme. Em termos de relação sinal ruído esta última é claramente não linear tendo comportamentos diferentes para sinais pouco atenuados e sinais fortemente atenuados. CONCLUSÃO : As conclusões são evidentes, a quantização é tanto melhor quanto mais níveis se usar, além disso, para melhorar-mos a nossa relação sinal-ruído podemos utilizar Leis de compressão antes da quantização tornando-a assim uma quantização não uniforme e melhorando ainda mais a relação sinalruído. Vimos que a atenuação do sinal torna mais evidente o ruído de quantização fazendo-o atingir os seus valores máximos durante os momentos de silêncio do sinal de áudio, e é aqui que, se ouvirmos o sinal, se nota o ruído de fundo, especialmente se estivermos a quantizar com poucos níveis e de maneira uniforme. 1