João Paulo Dullius
Este documento visa uma introdução à utilização do MatLab, ferramenta muito importante dentro do curso de engenharia através do projeto de filtros Butterworth.
O material apresentado foi produzido para servir de apoio a disciplina ENG 04 006 – Sistemas e Sinais da UFRGS – Universidade Federal do Rio Grande do Sul e possui apenas caráter adicional à teoria apresentada nas aulas da disciplina.
As funções descritas aqui fazem parte do "Signal Processing Toolbox" presente no MatLab. A sintaxe das funções referem-se a versão 5.3 do software.
Filtros Butterworth Analógicos, podem projetados usando a função BUTTER. Esta função pode ser utilizada para projetar tanto filtros passa baixas, passa altas ou passa faixas.
Exemplo 1:
Para projetar um filtro passa baixas N=2 com Wc = 1, teríamos na tabela de Butterworth:
Se calcularmos os pólos desta equação acharemos:
-0.7071 +j0.7071
-0.7071 -j0.7071
No MatLab utilizamos a função BUTTER(N, Wn, ‘s’). N corresponde a ordem do filtro, Wn a freqüência desejada, e ‘s’ diz que queremos um filtro analógico e que desejamos saber os pólos e zeros do mesmo.
» [Z, P, K] = BUTTER(2, 1, 's')
onde, Z, P e K são os vetores onde serão armazenados Zeros, Pólos e o Ganho Escalar do filtro
Para o comando acima obtivemos:
Z =
Empty matrix: 0-by-1
P =
-0.7071 + 0.7071i
-0.7071 - 0.7071i
K =
1
Observa-se que obtivemos 2 pólos complexos conjugado, nenhum zero (Empty Matrix) e um ganho escalar = 1.
A função H(s) pode ser reconstruída da seguinte forma:
A H(s) para nossa exemplo seria então:
Para visualizarmos a localização dos pólos, utilizamos o comando compass, passando de parâmetro o vetor aonde de encontram os pólos:
Compass(P);
Podemos observar que, como se esperava que todas as raízes encontram-se com suas fases igualmente espaçadas.
Exemplo 2:
Agora, vamos projetar um filtro passa baixas de ordem 5 e Wc = 7:
» [Z, P, K] = BUTTER(5, 7, 's')
Z =
Empty matrix: 0-by-1
P =
-2.1631 + 6.6574i
-2.1631 - 6.6574i
-5.6631 + 4.1145i
-5.6631 - 4.1145i
-7.0000
K =
1.6807e+004
Compass(P);
De maneira semelhante, para projetarmos um filtro passa altas de N=2 e Wc =1, temos:
No MatLab, temos que passar os parâmetro adicional ‘high’ no comando BUTTER, informando que desejamos um filtro passa-alta:
» [Z, P, K] = BUTTER(2, 1, 'high', 's')
Z =
0
0
P =
-0.7071 + 0.7071i
-0.7071 - 0.7071i
K =
1
Observe o aparecimento de dois zeros na origem, o que era de se esperar.
H(s) pode ser montado da mesma maneira do que no passa-baixas, obtendo então:
No projeto do filtro passa-faixas devemos utilizar o indicador ‘bandpass’ e substituir Wn por um vetor [Wl Wh] contendo os limites da faixa desejada.
Por exemplo, para projetar um passa-faixas de N = 3 e que tenha uma banda de passagem de largura 2 e centrada em 5, teríamos:
» [Z, P, K] = BUTTER(3, [3 7], 'bandpass', 's')
Z =
0
0
0
P =
-1.3601 + 6.5414i
-1.3601 - 6.5414i
-2.0000 + 4.1231i
-2.0000 - 4.1231i
-0.6399 + 3.0773i
-0.6399 - 3.0773i
K =
64
Analogamente, podemos gerar um filtro rejeita-faixa substituindo a palavra ‘bandpass’ por ‘stop’. Isto nos retornará os pólos e zeros para um filtro que rejeitará a faixa [Wl Wh].`
O MatLab ainda pode nos fornecer qual a menor ordem necessária para um filtro Butterworth contemplar um determinador comportamento. O comando a ser utilizado é o BUTTORD.
[N, Wn] = BUTTORD(Wp, Ws, Rp, Rs)
A função BUTTORD recebe as freqüências Wp da banda de passagem, a freqüência Ws da banda de rejeição e os respectivos ripples Rp e Rs, da zona de passagem e zona de rejeição. (As freqüências devem ser fornecidas já normalizadas. A função retorna a ordem N do filtro e a freqüência natural (3dB) Wn.
Exemplo:
» Wp = 40/500; Ws = 150/500;
» [n,Wn] = buttord(Wp,Ws,3,60)
n =
5
Wn =
0.0810
» [b,a] = butter(n,Wn);
» freqz(b,a,512,1000)
Ainda com o comando BUTTER, podemos gerar uma versão IIR para um determinado filtro Butterworth.
Para tal, devemos utilizar a seguinte sintaxe:
[B,A] = BUTTER(N,Wn)
onde, B e A são respectivamente o numerador e o denominador da função de transferencia, já em potências descendentes de Z.
A freqüência Wn deve ser normalizada, e corresponde a :
onde, Wc = freqüência de corte e Wa = freqüência de amostragem (o valor máximo de Wn é 1).
Para um Butterworth passa-baixas de ordem 4, Wc = 10 e Wa = 50, teríamos:
» Wn = 2*(Wc/Wa)
Wn =
0.4000
» [b,a] = butter(4,Wn)
b =
0.0466 0.1863 0.2795 0.1863 0.0466
a =
1.0000 -0.7821 0.6800 -0.1827 0.0301
O vetor b corresponde aos termos x[n-a]e a aos termos y[n-a]. (Observe que o coeficiente de y[n] sempre tem o valor 1, pois a função já retorna os valores normalizados.)
Para visualizarmos o comportamento de nosso filtro, utilizamos primeiramente o comando FREQZ para obtermos a resposta em freqüência da transformada Z de um filtro digital.
Como já possuímos os vetores a e b, podemos utilizar:
[H,W] = FREQZ(B,A,N)
B e A são os vetores que representam a transformada Z do filtro (obtidos acima) e N é o número de pontos em que se quer avaliar a resposta. H é o vetor onde será armazenada da os valores resposta em freqüência e W as freqüência respectivas de cada ponto.
Em nosso exemplo:
» [H,W] = FREQZ(b,a,1024);
Podemos então plotar o módulo de H da seguinte forma:
semilogy(W,abs(H));
O comando semilogy, plota o gráfico com a escala do eixo y logarítima (outras opções seriam SEMILOGX e LOGLOG).
Para o gráfico da fase, podemos utilizar:
plot(W,(180/pi)*angle(H));
Pode-se, como nos filtros analógicos, utilizar as palavras ‘HIGH’, ‘BANDPASS’ e ‘STOP’ para gerar outros tipos de filtros:
» [b,a] = butter(4,[0.2 0.8], 'bandpass');
» [H,W] = FREQZ(b,a,1024);
» semilogy(W,abs(H));
Já para filtros do tipo FIR, utilizamos a função FIR1. Esta função tem como sintaxe principal:
B = FIR1(N,Wn)
A função retornará ao vetor B o valor dos coeficientes do filtro FIR. Além dos parâmetros N, número de amostragem, e Wn, freqüência normalizada, pode-se utilizar as definições de tipos de filtro (‘HIGH’, ‘BANDPASS’ e ‘STOP’, como visto anteriormente) e definição do tipo de ajanelamento a ser utilizado:
Para janela retangular e de hamming, utilizamos respectivamente:
B = FIR1(N,Wn, boxcar(N+1));
B = FIR1(N,Wn, hamming(N+1));
Por exemplo, vamos escolher um passa-baixas, com N = 11 e Wn = 0.2:
» b = fir1(11, 0.2, boxcar(12));
» [H,W] = freqz(b,1,1024);
» plot(W,20*log10(abs(H)));
Fazendo o mesmo, com janela de hamming:
» b = fir1(11, 0.2, hamming(12));
» [H,W] = freqz(b,1,1024);
» plot(W,20*log10(abs(H)));