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