Como o MATLAB lida com os filtros IIR?

8

O MATLAB possui um butter, que constrói um filtro Butterworth, dada uma ordem e frequência de corte relativa. O filtro criado pode ser usado para filterqualquer sinal finito.

Como o MATLAB faz isso se o filtro tem uma resposta de impulso infinita? Suponho que deve exibir o sinal - isso é feito por uma simples janela retangular para que todos os valores conhecidos sejam usados?

Além disso, como o filtro contínuo é discretizado? Transformação bilinear, correspondência de resposta ao impulso, etc?

Não acho que o texto de ajuda do MATLAB explique isso:

Y = FILTER(B,A,X)filtra os dados em vetor Xcom o filtro descrito por vetores Ae Bcria os dados filtrados Y. O filtro é uma implementação "Direct Form II Transposed" da equação da diferença padrão:

a(1)*y(n) = b(1)*x(n) + b(2)*x(n-1) + ... + b(nb+1)*x(n-nb)
                      - a(2)*y(n-1) - ... - a(na+1)*y(n-na)
Andreas
fonte

Respostas:

8

Este não é realmente um problema específico do MATLAB; Vejo mais algumas perguntas gerais:

Como você implementa um filtro IIR digital?

Você pode aplicar qualquer filtro digital geral, convocando sua resposta de impulso com o sinal que deseja filtrar. Isso se parece com:

y[n]=k=0 0N-1 1x[k]h[n-k]

Isso funciona muito bem para filtros FIR , mas você encontra complicações nos sistemas IIR , porque as respostas de impulso são infinitamente longas (Nna soma acima). Isso dificulta o cálculo da saída do filtro usando a soma direta de convolução acima. Para realmente implementar um filtro IIR, precisamos de uma maneira de expressar a saída do filtro de maneira mais computacionalmente tratável.

O atributo de um filtro IIR que torna sua resposta a impulsos infinitamente longa é a natureza recursiva do sistema ; há feedback da saída de volta para a entrada do filtro. Isso significa que a saída de um filtro IIR em um determinado instante de tempo pode depender de duas fontes de informações separadas:

  • O sinal de entrada para o filtro, passado e presente, e

  • Valores passados ​​do sinal de saída do filtro.

Isso leva à representação da equação da diferença do sistema IIR:

uma0 0y[n]=k=1 1M-1 1umaky[n-k]+k=0 0N-1 1bkx[n-k]

Essa representação ilustra que podemos implementar um filtro IIR calculando uma soma ponderada de M saídas passadas do filtro e N entradas passadas do filtro (na prática, N e Mpoderia e muitas vezes são os mesmos; a ordem do filtro quando definida como acima émumax(M,N)-1 1) Essa é uma expressão de forma fechada que captura o comportamento do filtro completamente, adequada para implementação automatizada, e é a equação mencionada no trecho de ajuda do MATLAB que você mostrou na sua pergunta. Observe queuma0 0 é quase exclusivamente assumido como igual a 1 1; Eu o incluí apenas porque é mostrado no texto de ajuda citado, referenciado como a(1).

Portanto, para responder especificamente à sua pergunta, como o texto sugere, o MATLAB implementa sistemas IIR usando a equação acima. Ao projetar um filtro IIR com MATLAB ou outro, você obtém dois conjuntos de coeficientes (umak e bkna equação da diferença) que definem como ponderar as entradas e saídas do filtro na implementação do filtro. Existem algumas outras sutilezas que às vezes são relevantes; por exemplo, o texto refere-se ao uso de uma realização "transposta de forma direta II" do filtro. Você aplica o filtro calculando a equação da diferença acima para cada amostra de saída desejada.

De fato, existem várias topologias que podem ser usadas para implementar filtros digitais, cada uma com suas próprias vantagens e desvantagens. O DF2T é frequentemente usado devido à sua estrutura mais eficiente (contém um número mínimo de elementos de atraso) e à sua robustez aprimorada ao erro de arredondamento (uma vez que os coeficientes feedforwardbk são implementados primeiro).

Como o MATLAB cria filtros Butterworth?

A documentação para a butterfunção não especifica como ela gera a aproximação discreta do protótipo do filtro analógico Butterworth . No entanto, ao espreitar butter.m, você encontra:

% step 5: Use Bilinear transformation to find discrete equivalent:
if ~analog,
    [a,b,c,d] = bilinear(a,b,c,d,fs);
end

Parece que ele usa a transformação bilinear para mapear o protótipo de filtro Butterworth para uma realização de filtro digital.

Jason R
fonte
2

A função de filtro do MATLAB simplesmente implementa a equação da diferença para um filtro transformado Direct form II. Não há razão para digitalizar o filtro, pois ele é projetado no espaço discreto em primeiro lugar. A saída do filtro () tem o mesmo comprimento que a entrada. Isso é tecnicamente "errado", pois trunca a parte do filtro que estenderia esse comprimento. Se você tiver acesso à cauda, ​​poderá acrescentar uma quantidade razoável de zeros ao seu sinal de entrada. Como é uma resposta "infinita", você não pode fazer isso perfeitamente, mas na prática, na maioria das aplicações, não é muito difícil de fazer.

Hilmar
fonte