Anda di halaman 1dari 4

Universidade Federal do ABC

EN2608 – Princípios de Comunicação


Experimento Computacional 05 – PCM e DM
Profs. Mário Minami e Luiz Henrique Bonani

1. Modulação por Codificação de Pulso

Com o auxílio do Matlab, estude o processo de modulação por codificação de pulso utilizando filtragem
ideal. Para tanto, use o script dado abaixo, em que inicialmente é proposto um sinal composto por duas
senoides m(t) = sen(2πt) – sen(6πt). Este sinal é modelado discretamente através de pontos espaçados a
cada 0,002 segundos e analisado em uma janela de tempo de 1 segundo.

clear; clf;
td = 0.002;
t = [0:td:1.]; % intervalo de tempo de 1 segundo
xsig = sin(2*pi*t)-sin(6*pi*t); % senoides 1 Hz + 3 Hz
Lsig = length(xsig);

ts = 0.02; % amostragem de 50 Hz
Nfactor = ts/td;

Lfft = 2^ceil(log2(Lsig)+1); % comprimento da transformada


Fmax = 1/(2*td);
Faxis = linspace(-Fmax,Fmax,Lfft);
% envia signal por um quantizador uniforme de 16 níveis
[s_out1,sq_out1,sqh_out1,Delta1,SQNR1]=sampandquant(xsig,16,td,ts);
% envia signal por um quantizador uniforme de 4 níveis
[s_out2,sq_out2,sqh_out2,Delta2,SQNR2]=sampandquant(xsig,4,td,ts);

figure(1)
subplot(211); plot(t,xsig,'b',t,sqh_out1(1:Lsig),'r','Linewidth',2);
title('Sinal {\itg}({\itt}) and o sinal PCM de 16 níveis');
xlabel('tempo (s)');
subplot(212); plot(t,xsig,'b',t,sqh_out2(1:Lsig),'r', 'Linewidth',2);
title('Sinal {\itg}({\itt}) and o sinal PCM de 4 níveis');
xlabel('tempo (s)');

A seguir, define-se o fator de compressão Nfactor, usado para fazer a amostragem e quantização do sinal
original. O sinal e seus respectivos sinais PCM quantizados em 16 e 4 níveis são mostrados na Figura 1.
Para a análise do resultado, estude todos os procedimentos feitos no processamento do sinal e comente a
utilização das funções sampandquant e uniquan, dadas logo abaixo. Plote os resultados s_out, sq_out e
sqh_out para ambos os níveis de quantização e comente o que significa cada um destes sinais. Estude a
relação sinal-ruído de quantização, que pode ser calculada com este script. O que este parâmetro significa?

Estude os resultados obtidos. Varie a quantidade de níveis de quantização e obtenha outros resultados,
fazendo os comentários pertinentes.

1
function [s_out,sq_out,sqh_out,Delta,SQNR]=sampandquant(sig_in,L,td,ts)
% Uso:
%
% [q_out,sq_out,sqh_out,Delta,SQNR] = sampandquant(sig_in,L,td,ts);
% L - número de níveis de quantização
% sig_in - vetor do sinal de entrada
% td - discretização do sinal original
% ts - período de amostragem
% Saídas da função:
% s_out - sinal de saída amostrado
% sq_out - sinal de saída amostrado e quantizado
% sqh_out - sinal de saída quantizado, amostrado e segurado
% Delta - intervalo de quantização
% SQNR - razão sinal ruído de quantização

if (rem(ts/td,1)==0)
nfac = round(ts/td);
p_zoh = ones(1,nfac);
s_out = downsample(sig_in,nfac);
[sq_out,Delta,SQNR] = uniquan(s_out,L);
s_out = upsample(s_out,nfac);
sqh_out = kron(sq_out,p_zoh);
sq_out = upsample(sq_out,nfac);
else
warning('Erro! ts/td não é um inteiro!');
s_out = []; sq_out = []; sqh_out = []; Delta = []; SQNR = [];
end

function [q_out,Delta,SQNR]=uniquan(sig_in,L)
% Uso
%
% [q_out,Delta,SQNR] = uniquan(sig_in,L);
% L - número de níveis de quantização
% sig_in - vetor do sinal de entrada
% Saídas da função:
% q_out - saída quantizada
% Delta - intervalo de quantização
% SQNR - razão sinal ruído de quantização

sig_pmax = max(sig_in);
sig_nmax = min(sig_in);
Delta = (sig_pmax - sig_nmax)/L;

q_level = sig_nmax + Delta/2:Delta:sig_pmax-Delta/2;


L_sig = length(sig_in);
sigp = (sig_in - sig_nmax)/Delta+1/2;
qindex = round(sigp);
qindex = min(qindex,L);
q_out = q_level(qindex);
SQNR = 20*log10(norm(sig_in)/norm(sig_in-q_out));

2
Para a recuperação do sinal original, uma solução é usar um filtro passa-baixa para separar o espectro de
interesse. Assim, pode-se definir um filtro ideal no domínio da frequência e filtrar o sinal. A continuação
do script anterior, dado abaixo, executa este processo.

% Calculo da transformada de Fourier dos sinais PCM


SQH1 = fftshift(fft(sqh_out1,Lfft)/Lfft);
SQH2 = fftshift(fft(sqh_out2,Lfft)/Lfft);

% filtragem dos dois sinais PCM


dW = 2*Fmax/Lfft; %salto em frequência de cada amostra da fft
BW = 10; % lagura do filtro
nW = floor(BW/dW); % largura do filtro em amostras
H_lpf = zeros(1,Lfft);
H_lpf(Lfft/2 - nW + 1 : Lfft/2 + nW) = 1; % FPB ideal
S1_recv = SQH1.*H_lpf; %filtragem ideal
s_recv1 = real(ifft(fftshift(S1_recv))); % rec. no dominio do tempo
s_recv1 = s_recv1(1:Lsig);
S2_recv = SQH2.*H_lpf; %filtragem ideal
s_recv2 = real(ifft(fftshift(S2_recv))); % rec. no dominio do tempo
s_recv2 = s_recv2(1:Lsig);

figure(2)
subplot(211); plot(t,xsig,'b-',t,s_recv1,'r-.','Linewidth',2);
legend('original','recovered'); legend boxoff;
title('Sinal {\itg}({\itt}) e o sinal PCM-16 filtrado');
xlabel('tempo (s)');
subplot(212);plot(t,xsig,'b-',t,s_recv2(1:Lsig),'r-.','Linewidth',2);
legend('original','recovered'); legend boxoff;
title('Sinal {\itg}({\itt}) e o sinal PCM-4 filtrado');
xlabel('tempo (s)');

Relacione todos os procedimentos executados no script com aquilo que foi visto em teoria na sala de aula.
Estude o espectro dos sinais quantizados em 16 níveis e 4 níveis. Determine qual nível de quantização
obtém o melhor desempenho na reconstrução do sinal original.

2. Modulação Delta

Para o estudo da Modulação Delta será utilizado o mesmo script anterior, acrescentando o trecho de
código a seguir. Este trecho de código utiliza a função deltamod, que também é mostrada a seguir e é
necessária para os estudos que se seguem.

No exemplo mostrado na Figura 3 é mostrada a utilização da modulação Delta para três valores distintos
de Delta. Analise os resultados encontrados e explique os procedimentos executanos no script. Encontre
exemplos que mostrem claramente o problema do ruído granular e a distorção de sobreinclinação.
Experimente outros valores de Delta e faça os comentários pertinentes.

3
% Estudo da Modulação Delta
Delt1 = 0.2; % Escolha de um delta pequeno
s_DMout1=deltamod(xsig,Delt1,td,ts);

figure(3)
subplot(311); plot(t,xsig,'k',t,s_DMout1(1:Lsig),'b','Linewidth',2);
title('Sinal {\itg}({\itt}) e Sinal DM');
xlabel('tempo (s)'); axis([0 1 -2.2 2.2]);
% Aplicar modulação DM novamente com o dobro do delta
Delt2 = 2* Delt1;
s_DMout2=deltamod(xsig,Delt2,td,ts);
subplot(312); plot(t,xsig,'k',t,s_DMout2(1:Lsig),'b','Linewidth',2);
title('Sinal {\itg}({\itt}) e Sinal DM com o dobro do passo');
xlabel('tempo (s)'); axis([0 1 -2.2 2.2]);
% Aplicar modulação DM novamente com o quádruplo do delta
Delt3 = 2* Delt2;
s_DMout3=deltamod(xsig,Delt3,td,ts);
subplot(313); plot(t,xsig,'k',t,s_DMout3(1:Lsig),'b','Linewidth',2);
title('Sinal {\itg}({\itt}) e Sinal DM com o quádruplo do passo');
xlabel('tempo (s)'); axis([0 1 -2.2 2.2]);

function s_DMout=deltamod(sig_in,Delta,td,ts)
% Uso
%
% s_DMout = deltamod(sig_in,Delta,td,ts);
% Delta - tamanho do passo DM
% sig_in - vetor do sinal de entrada
% td - discretização do sinal original
% ts - período de amostragem
%
% NOTA: td*ts deve ser um número inteiro positivo
%
% Saída da função:
% s_DMout - sinal amostrado DM
%

if (rem(ts/td,1) == 0),
nfac = round(ts/td);
p_zoh = ones(1,nfac);
s_down = downsample(sig_in,nfac);
Num_it = length(s_down);
s_DMout(1) = -Delta/2;
for k = 2 : Num_it,
xvar = s_DMout(k-1);
s_DMout(k) = xvar + Delta*sign(s_down(k-1)-xvar);
end
s_DMout=kron(s_DMout,p_zoh);
else
warning('Erro! ts/td não é um inteiro!');
s_DMout=[];
end

Anda mungkin juga menyukai