quarta-feira, 26 de outubro de 2022

Filtro casado - simulação.

 

Um filtro casado (matched filter) é um filtro linear projetado para proporcionar a máxima relação sinal ruído na sua saída para uma dada forma de onda no instante de amostragem $T$ quando o ruído é gaussiano e de média nula. Outros filtros podem ser usados, mas o que proporciona a menor taxa de erro é o filtro casado. Se o formato do pulso é $g(t)$, a resposta ao impulso do filtro casado é $h(t) = kg(T-t)$, onde $k$ é uma constante qualquer. 

O código Scilab abaixo mostra o desempenho de um filtro casado comparado com um filtro do tipo PB e sem filtragem.  

////////// Filtro casado

close(winsid());  ///close "all"
clc;

/// formato escolhido para o pulso:
p = convol([0.2 0.5 0.5 0.2],ones(1,7));
//p = convol(p,p);
//p = [0, 0.25, 0.5, ones(1,6), 0.5, 0.25, 0];
//p = ones(1,10);
p = p/max(p);
Tb = max(size(p)); /// duração do pulso

/// Número de bits:
N = 2500;

/// bits aleatórios:
rand('seed',33);  //// "semente do gerador"
b = sign(rand(1,N,'n')); /// +1, -1

/// Gerando o trem de pulsos:
pt = []
for k=1:N
    pt = [pt, p*b(k)]; // trem de pulsos
end
subplot(2,2,1); plot(1.01*pt(1:200)-0.005);
xgrid;
title('Trem de pulsos - sem ruído');

//// Ruído:
An = 0.75;
ruido = An*rand(pt,'n');

/// Sinal com ruído:
ptr = pt + ruido;
subplot(2,2,2); plot(ptr(1:200)); xgrid;

/// taxa de erro sem filtragem:
bd = 0*b;
for k=1:N                /// Escolhendo a parte
    pos = (k-1)*Tb + fix(Tb/2);  /// central do pulso
    bd(k) = sign(ptr(pos)); /// bit decidido
end
erross = sum(abs(b-bd))/2;
taxass = 100*erross/N;
printf('Taxa de erro sem filtragem = %f \n',taxass);
title('Trem de pulsos - com ruído. Taxa = '+string(taxass));

/// Filtro Passa baixa:
th = 0:(max(size(p))-1);
kh = 0.25;
h = exp(-kh*th); h = h/sum(h);

/// filtrando cada pulso:
/// taxa de erro sem filtragem:
bdh = 0*b;
pfh = [];
for k=1:(N-1)
    p1 = (k-1)*Tb + 1;
    p2 = p1+Tb;
    pr = ptr(p1:p2);
    prf = convol(pr,h);   ///filtragem
    bdh(k) = sign(prf(Tb));
    pfh = [pfh, prf(1:Tb)];
end
errofh = sum(abs(b(1:(N-1))-bdh(1:(N-1))))/2;
taxafh = 100*errofh/N;
printf('Taxa de erro com filtragem PB = %f \n',taxafh);
subplot(2,2,3); plot(pfh(1:200)); xgrid;
title('Pulso filtrado - PB. Taxa de erro: ' + string(taxafh));

/// Filtro casado:
hc = p;  /// filtro casado = pulso

/// filtrando cada pulso:
/// taxa de erro sem filtragem:
bdc = 0*b;
pfc = [];
for k=1:(N-1)
    p1 = (k-1)*Tb + 1;
    p2 = p1+Tb;
    pr = ptr(p1:p2);
    prfc = convol(pr,hc);
    bdc(k) = sign(prfc(Tb));
    pfc = [pfc, prfc(1:Tb)];
end
errofc = sum(abs(b(1:(N-1))-bdc(1:(N-1))))/2;
taxafc = 100*errofc/N;
printf('Taxa de erro com filtragem casada = %f \n',taxafc);
subplot(2,2,4); plot(pfc(1:200)); xgrid;
title('Pulso filtrado - F. casado. Taxa de erro: ' + string(taxafc));
Resultados (mudando o formato do pulso): 
 

Nenhum comentário:

Postar um comentário