domingo, 12 de outubro de 2014

Diagrama de olho e equalização ZF

Um pulso "original" e o mesmo pulso após passar por um canal (sem ruído).
Esta postagem é bastante técnica e sugerirmos, antes de prosseguir, que uma postagem anterior seja lida antes: equalização de canal. Mais informações, por exemplo, aqui ou aqui

Sabemos que na transmissão de pulsos por um canal, os pulsos sofrem distorção devido a limitação de banda do canal de comunicação. Essa limitação de banda (ex: efeito de um filtro do tipo passa-baixa) ou a existência de múltiplos percursos entre o transmissor e o receptor causa interferência entre os pulsos (IES, ou ISI - intersymbol interference). Essa interferência pode ser visualizada em diagrama de olho e pode ser reduzida usando-se um equalizador. Existindo o conhecimento da resposta do canal e sendo a relação sinal-ruído alta, é possível usar um equalizador do tipo ZF (Zero Forcing Equalizer). Em geral, os equalizadores digitais são filtros transversais.

Idealmente, para um equalizador ZF podemos escrever: $h(k) \ast w(k) \cong \delta(k)$, onde $h(k)$ é a resposta do canal e $w(k)$ é a resposta ao impulso do equalizador ZF. O número de coeficientes necessários no equalizador vai depender da distorção causada pelo canal. Em geral, quanto maior a distorção mais coeficientes serão necessários.

Segue um exemplo de simulação. Os pulsos usados seguem a função
$$ p(t) = \frac{sin(\pi t)}{\pi t}\frac{cos(\pi t)}{1-4 t^2} $$
e os bits "1's" são mapeados em $+p(t)$ e "0's" são mapeados em "-p(t)".

Sequência de pulsos e diagrama de olho, antes de passar pelo canal.
O mesmo sinal, mas com adição de ruído.
Resposta do canal.
Diagrama de olho após o canal, sem ruído. Olho ainda "aberto".
Pulsos antes (verde) e depois (azul)do canal (sem ruído).
Equalização ZF (não adaptativa):


Código Scilab (meio bagunçado e quase sem comentários):

clc;
close; close; close;
close; close; close;
close; close; close;

tp=-2:0.001:(2-0.001);
e = 1e-13; tp = tp + e;
pt = sin(%pi*tp)./(%pi*tp);
a = 0.5;
pt = pt.*(cos(2*%pi*a*tp)./(1-16*a*a*tp.*tp));
plot(tp,pt); title('pt'); xgrid;

tk = 0:0.001:(1-0.001);
ak = 0*tk; ak(1) = 1;
aks = [ak, -ak, ak, ak, -ak, ak, -ak, ak, -ak, -ak, ak, ak, ak, -ak];
aks = [aks, -aks, aks, aks, -aks];
aks = [ak, ak, -ak, -ak, -ak, -ak, aks, -aks];
pulsos = convol(pt,aks);
figure;
tps = 1:max(size(pulsos));
tps = tps - 1; tps = tps * 0.001;
fim = max(size(pulsos)) - 2000;
subplot(2,1,1);
plot(tk,ak,tps, pulsos,tps(2000:1000:fim),pulsos(2000:1000:fim),'mo');
title('Pulso original'); xgrid;

subplot(2,1,2);
tkk=1:2001; tkk=tkk*0.001;
for kk=3000:2000:fim-1000
    plot(tkk,pulsos(kk:kk+2000)); title('Diagrama de olho');
end

//com ruido:
ruido = 0.1*rand(1,fim+2000,'n');
pulsosr = pulsos + ruido;
figure;
subplot(2,1,1);
plot(tps, pulsosr,tps(2000:1000:fim),pulsosr(2000:1000:fim),'mo');
xgrid;
subplot(2,1,2); title('Pulsos com ruído');
tkk=1:2001; tkk=tkk*0.001;
for kk=3000:2000:fim-1000
    plot(tkk,pulsosr(kk:kk+2000));
end
title('Diagrama de olho - ruído');

// canal:
tc = 0:0.001:2.7;
htc = 0*tc;
htc(1) = -0.25; htc(800)=1; htc(1790)=-0.5; htc(2700)=0.25;
hex = tc.*exp(-tc*3);
hc = 0.75*convol(htc,hex); fim = max(size(hc));
hc = hc(300:fim); //hc = [0:-0.01:-0.2, hc];
hff=[0.1 0.25 0.5 0.7 1 1 1 1 1 1 1 1 1 1 1 1 1 0.7 0.5 0.25 0.1];
hc = 0.88*convol(hff,hc);
fim = max(size(hc)); hc = hc(20:fim);
ttc=1:max(size(hc));
figure; plot(ttc,hc,ttc(1:1000:fim),hc(1:1000:fim),'m*');
xgrid; title('Resposta do canal');

// resposta a um pulso:
hx = [0.0059415,  -0.06219,  0.8618, -0.2043, 0.14246, 0.04298,  0.0045146];

//Equalizador ZF:
M = [hx(3) hx(2) hx(1) 0 0 0 0
     hx(4) hx(3) hx(2) hx(1) 0 0 0
     hx(5) hx(4) hx(3) hx(2) hx(1) 0 0
     hx(6) hx(5) hx(4) hx(3) hx(2) hx(1) 0
     hx(7) hx(6) hx(5) hx(4) hx(3) hx(2) hx(1)
     0 hx(7) hx(6) hx(5) hx(4) hx(3) hx(2)
     0 0 hx(7) hx(6) hx(5) hx(4) hx(3)];
w = inv(M)*[0; 1;0;0;0;0;0];
hxw = convol(hx,w);

//Pulsos após o canal:
ph = 0.0012*convol(pulsos,hc);
// ruido:
rph = 0.025*rand(1,max(size(ph)),'n');
ph = ph + rph;
tch = 1:max(size(ph));
tch = tch - 1; tch = tch * 0.001;
figure;
subplot(2,1,1);
plot(tch,ph,tps,pulsos);
xgrid; title('Pulsos com distorção');
subplot(2,1,2); atr = 1000;
fim = max(size(pulsos));
tkk=1:2001; tkk = tkk + atr; tkk=tkk*0.001;
for kk=(3000+atr):2000:fim-1000
    plot(tkk,ph(kk:kk+2000));
end
title('Diagrama de olho - pulso com distorção');

/////// equalizacao:
amostras = 1:1000:(max(size(ph))-atr);
amostras = amostras + atr;
pk = ph(amostras);

amost = 1:1000:(max(size(pulsos)));
ps = pulsos(amost);
subplot(2,1,1); plot(amostras*0.001,pk,'mo',amost*0.001,ps,'ks');

////////
fim = max(size(ps));
d = ps(3:fim);  // amostras dos pulsos "originais"
dh = pk(3:fim); // amostras com distorção
dhw = filter(w,1,dh);  // amostras equalizadas
k=1:max(size(d));
kh=1:max(size(dh));
khw=1:max(size(dhw));
fim=fim-5;
figure;
plot(k,d,'r*',kh(1:fim),dh(1:fim),'mo',khw(2:fim)-1,dhw(2:fim),'kx');
legend('Amostras antes do canal','Amostras depois do canal','Amostras equalizadas');

///pulsos restaurados:
aks = [dhw(2)*ak, dhw(3)*ak, dhw(4)*ak];
for k=5:(max(size(khw))-6)
    aks = [aks, dhw(k)*ak];
end
pulsos_rec = convol(pt,aks);
figure;
tps = 1:max(size(pulsos_rec));
tps = tps - 1; tps = tps * 0.001;
fim = max(size(pulsos_rec)) - 2000;
subplot(2,1,1);
plot(tps, pulsos_rec,tps(2000:1000:fim),pulsos_rec(2000:1000:fim),'mo');
title('Pulso restaurado'); xgrid;
subplot(2,1,2);
tkk=1:2001; tkk=tkk*0.001;
for kk=3000:2000:fim-2000
    plot(tkk,pulsos_rec(kk:kk+2000));
end
title('Diagrama de olho(rec)');

Nenhum comentário:

Postar um comentário