Projeto de Filtros Butterworth

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.

 

  1. Filtros Butterworth Analógicos

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.

    1. Filtros passa-baixa
    2. 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);

    3. Filtros passa-altas
    4. 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:

       

       

    5. Filtro passa-faixa
    6. 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

    7. Filtro rejeita-faixa
    8. 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].`

       

    9. Projeto da ordem do filtro Butterwoth.

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)

  1. Filtros Butterworth IIR
  2. 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));

     

  3. Filtros FIR

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)));