Os filtros IIR (e especificamente o filtro Butterworth) são causais?

Aug 19 2020

Eu sou novo no processamento de sinais. Estou aprendendo agora sobre filtragem e estou tentando implementar filtro passa-alta (HPF) e, posteriormente, filtro passa-banda (BPF). Implemento os filtros Python 3.8com NumPye SciPy.

Para o caso off-line (filtrando um tempo pré-gravado), projetei um filtro passa-alta Butterworth e apliquei no sinal no domínio do tempo usando a signal.filtfiltfunção. No entanto, como mostra a documentação, essa abordagem é boa apenas para casos off-line e não para tempo real, uma vez que o filtro varre o sinal para frente e para trás. Posso recuperar a resposta de frequência do filtro usando a signal.freqzfunção.

Agora eu quero que esse filtro funcione também em tempo real (então ele precisa ser causal, e eu pergunto se isso é possível para este tipo de filtros. Aqui estão minhas perguntas:

  1. Se bem entendi, os filtros Butterworth são filtros IIR (resposta ao impulso infinito). É verdade?
  2. Os filtros IIR são causais? Pode ser que todos os filtros IIR não sejam causais e pode ser que alguns sejam e outros não. Quais são os casos em que os filtros IIR são causais?
  3. Os filtros Butterworth são causais? Se não for sempre, em qual caso eles são causais?
  4. Se a resposta a 3 for verdadeira, como implementar um filtro Butterworth causal, tanto no domínio do tempo quanto no domínio da frequência? (Posso usar SciPyfunções como signal.butter, signal.freqzetc.)

Links relevantes:

  • Ajude a projetar o filtro Butterworth
  • filtfilt: https://docs.scipy.org/doc/scipy/reference/generated/scipy.signal.filtfilt.html

Obrigado.

Respostas

7 endolith Aug 19 2020 at 13:49
  1. Sim, Butterworth é IIR. A decadência de um impulso tecnicamente dura para sempre.
  2. Sim, todos os IIR [implementáveis] são causais.
  3. Sim, por causa do nº 1 e do nº 2.
  4. Não use signal.filtfilt. Use signal.lfilter. filtfiltfaz a mesma coisa que lfilter, exceto duas vezes, em direções opostas, que transforma um filtro causal em um filtro de fase zero.

No entanto, como a documentação de ambas as funções sugere, para uso mais prático, você deve usar as variantes do SOS:

A função sosfilt(e o uso do design do filtro output='sos') devem ser preferidos lfilterpara a maioria das tarefas de filtragem, pois as seções de segunda ordem têm menos problemas numéricos.

Para resumir as funções:

  • lfilter: Filtragem causal de estágio único (somente ordens baixas)
  • filtfilt: Filtragem de fase única de fase zero (somente pedidos baixos)
  • sosfilt: Filtragem de seções causais de segunda ordem
  • sosfiltfilt: Filtragem de seções de segunda ordem de fase zero

Realmente, a única razão para usar lfilterou filtfilté se seus coeficientes já estiverem no b, aformato, se você estiver implementando algo fora de um livro, etc.

Se você estiver projetando o filtro sozinho, use o formulário SOS, que reduz o erro numérico.

Observe que as filtfiltfunções aplicam o filtro duas vezes, portanto, ele terá o dobro da ordem do filtro original.

1 TimWescott Aug 19 2020 at 16:17

Os filtros IIR são causais? Pode ser que todos os filtros IIR não sejam causais e pode ser que alguns sejam e outros não. Quais são os casos em que os filtros IIR são causais?

Todos os filtros IIR reais são causais. Todos os sistemas reais são causais, a menos que o universo seja muito mais estranho do que parece.

Você pode definir um filtro que atua nas informações futuras; ou seja, você poderia dizer isso$y_n = 0.9 y_{n+1} + x_n$. Isso (com muitas palavras para superar o ceticismo do leitor) descreveria um filtro cuja resposta ao impulso é$$h_\kappa = \begin{cases} 0 & \kappa > 0 \\ 0.9^{-\kappa} & \kappa \le 0 \end{cases}$$

Você não poderia, entretanto, implementar esse filtro na vida real.