Os filtros IIR (e especificamente o filtro Butterworth) são causais?
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.8
com NumPy
e 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.filtfilt
funçã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.freqz
funçã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:
- Se bem entendi, os filtros Butterworth são filtros IIR (resposta ao impulso infinito). É verdade?
- 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?
- Os filtros Butterworth são causais? Se não for sempre, em qual caso eles são causais?
- 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
SciPy
funções comosignal.butter
,signal.freqz
etc.)
Links relevantes:
- Ajude a projetar o filtro Butterworth
- filtfilt: https://docs.scipy.org/doc/scipy/reference/generated/scipy.signal.filtfilt.html
Obrigado.
Respostas
- Sim, Butterworth é IIR. A decadência de um impulso tecnicamente dura para sempre.
- Sim, todos os IIR [implementáveis] são causais.
- Sim, por causa do nº 1 e do nº 2.
- Não use signal.filtfilt. Use signal.lfilter.
filtfilt
faz a mesma coisa quelfilter
, 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 filtrooutput='sos'
) devem ser preferidoslfilter
para 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 lfilter
ou filtfilt
é se seus coeficientes já estiverem no b, a
formato, 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 filtfilt
funções aplicam o filtro duas vezes, portanto, ele terá o dobro da ordem do filtro original.
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.