Sunteți pe pagina 1din 5

Algoritmo de Parks McClellan

Antes do projeto, especificar todas as caractersticas do filtro;


p

1) Inicialmente supor as frequncias extremais (frequncias no qual a amplitude


do filtro ir variar, pontos de mximos e mnimos, tanto na banda de passagem
quanto na de rejeio).

O comprimento L do filtro ser o nmero de frequncias extremais escolhidas.


Porm, o teorema da alternncia indica que o nmero de frequncias extremais
dever ser L+2. Portanto, na criao do vetor de frequncias extremais supor as L
frequncias entre 0 e .
extremais=[ 0, 1, 2, , L , ]
Sugesto: Escolher valores de mesma distncia, por exemplo, se queremos um
filtro com p=0.3 e s=0.5 , se supormos 10 frequncias extremais
(contando
0
e
)
podemos
montar
o
vetor
como
extremais=[ 0, 0.1 , 0.2 ,0.3 ,0.5 , 0.6 , 0.7 , 0.8 , 0.9 , ]
Para a prxima etapa determinar as funes:
Funo Peso W():

1, p
W ( )= 1
, s
2

Filtro desejado (determinar a amplitude do filtro que se deseja obter), pra


um exemplo clssico de um passa baixa seria:
D ( )= 1, p
0, s

2) O filtro de aproximao A() (filtro que ser iterado at chegar o mais prximo
ao desejado) dado pela expresso :
L

A ( )= a ( k ) cos ( k )
k=0

Os coeficientes a(k) so obtidos resolvendo sistema linear:

cos ( L 0)

1 cos ( 0) cos ( 2 0 )
1 cos ( 1) cos ( 21 )

cos ( L 1)

1
W ( 0 )
1
W ( 1 )

1 cos ( L+1 ) cos ( 2 L+1) cos ( L+1 )

1
W ( 1)

)( ) (

D ( 0 )
a (0 )
D ( 1 )
a ( 1)
=

a ( L)
D ( L )

D ( L+1 )

Lembrando que os valores de frequncia so os do vetor extremais e que o


erro, =a ( L+ 2 ) . No MatLab voc pode resolver esse sistema montando a
primeira matriz (faa de modo iterativo, pois a matriz ir mudar a cada iterao
gerando um novo vetor de coeficientes) e um vetor coluna referente a amplitude do
filtro desejado para cada frequncia extremal dada (D).
No MatLab voc obtm o vetor dos coeficientes usando a funo linsolve:
Agora com os coeficientes obtemos A().
Sugesto:
Monte a matriz de forma iterativa (w o vetor com as frequncias extremais):
%Matriz das equaes (primeira matriz)
for i=1:L+2
x(i,1) = 1;
if(w(i)<=wp)
E(i,L+2) = [(-1)^(i-1)];
else
E(i,L+2) = [(-1)^(i-1)]*dp/ds;
end
for j=2:L+1
E(i,j)=cos((j-1)*w(i));
end
end
%Matriz Soluo (Filtro Desejado)
Dw = zeros(L+2,1);

for k=1:L+2
if(w(k)<=wp)
Dw(k) = 1;
end
if(w(k)>=ws)
Dw(k) = 0;
end
end
a = linsolve(E,Dw);
e = a(L+2);

%Soluo
%Erro

Crie um vetor para o domnio da frequncia e monte o vetor A:


%% Filtro de aproximao
freq = [0:0.01:pi];
%Vetor do domnio da frequncia
A = zeros(1,length(freq)); %Zerando inicialmente o vetor
%Montando Vetor
for k=0:L
A = A + a(k+1)*(cos(freq)).^(k)
end

Obs.: O primeiro ndice de um vetor sempre 1.


Monte tambm outros vetores para W() e D(), mas agora no s para as
frequncias extremais e sim para qualquer frequncia:
H = (freq<=wp);
Wd=(freq<wp) + (ds/dp).*(freq>=ws);

Esses vetores sero importantes para o prximo passo.

3) Obter funo de aproximao de erro E()


E ( )=W ( ) [ A ( ) D ( ) ]
Agora deve-se plotar E() e verificar seus mximos e mnimos so os mesmos que
ns supomos. Se no for, temos que substituir o nosso vetor suposto pelo vetor com
as verdadeiras frequncias extremais tiradas de E() e voltar ao passo 2. Se for,
no h necessidade de outra iterao e encerra-se o algoritmo.
O algoritmo tambm diz que se houver mais que L+2 frequncias extremais
verdadeiras s substitumos o vetor de frequncias at L+2, o que excede no entra.
Sugesto: Obter os pontos crticos de E(), os pontos crticos sero as verdadeiras
frequncias extremais, e aplicar todas as condies necessrias. No nosso caso um
algoritmo de obteno dos pontos crticos no achar as frequncias 0 e como
pontos crticos pois so o incio e o final do vetor , ento a condio de que se
houver mais que L+2 frequncias extremais reais trocada pela condio de que se
houver mais que L frequncias extremais reais:

%% Frequncias extremais reais (pontos crticos do erro de


aproximao)
%Algoritmo de obteno de pontos crticos
dA = diff(Ew)./diff(freq);
freqd=w(2:length(w));
produto = dA(1:length(dA)-1).*dA(2:length(dA));
extremas =wd(find(produto<0));

%% Condio Final
%Existem mais que (L+2) frequncias extremais reais?
%Processo de substituio do vetor do comeo de cada iterao
if(length(extremas)>L)
w_reais = zeros(1,L);
for i=1:L
w_reais (i) = extremas(i);
end
w_reais=[0 w_reais pi];
end
if(length(extremas)==L)
w_reais = [0 extremas pi];
end
%Frequncias extremais iteradas == Frequncias extremais reais ?
if(w_extremais == w_reais)
%Fim do lao (de acordo com seu cdigo)
else
w_extremais = w_reais;
%Voltar ao passo 2 do algoritmo (de acordo com seu cdigo)
end

Todo o cdigo deve ser feito em um while que termine quando a condies dos
vetores de extremais iguais seja satisfeita. Ao final pode ser feito o plot do filtro de
aproximao A(), voc pode colocar o plot dentro do while para verificar a
mudana do filtro a cada iterao.

Fluxograma:

S-ar putea să vă placă și