Eu vi em um tópico SO uma sugestão de uso filtfilt
que executa a filtragem para trás / para a frente em vez de lfilter
.
Qual é a motivação para usar uma contra a outra técnica?
Eu vi em um tópico SO uma sugestão de uso filtfilt
que executa a filtragem para trás / para a frente em vez de lfilter
.
Qual é a motivação para usar uma contra a outra técnica?
filtfilt
faz o mesmo filtro duas vezes, em direções opostas, por isso não é mais lento do que fazerlfilter
duas vezes em uma direção, e é assim que você obteria a mesma resposta de frequência.Respostas:
filtfilt
é a filtragem de fase zero, que não muda o sinal ao filtrar. Como a fase é zero em todas as frequências, também é linear. A filtragem para trás no tempo exige que você preveja o futuro, para que não possa ser usado em aplicativos da vida real "online", apenas para processamento offline de gravações de sinais.lfilter
é apenas uma filtragem causal de encaminhamento no tempo, semelhante a um filtro eletrônico da vida real. Não pode ser de fase zero. Pode ser de fase linear (FIR simétrico), mas geralmente não é. Geralmente, ele adiciona diferentes quantidades de atraso em diferentes frequências.Um exemplo e imagem devem torná-lo óbvio. Embora a magnitude da resposta de frequência dos filtros seja idêntica (canto superior esquerdo e canto superior direito), o passa-baixo da fase zero se alinha com o sinal original, apenas sem conteúdo de alta frequência, enquanto a filtragem mínima de fase atrasa o sinal de maneira causal :
fonte
lfilter
não é necessariamente fase mínima, pode ser qualquer coisa dependendo dos coeficientes do filtro, mas, em qualquer caso, é causal , o quefiltfilt
não é. Portanto, o resultado da comparação quefiltfilt
tem atraso zero elfilter
sempre adiciona algum atraso não é exatamente verdadeiro, porquefiltfilt
é não causal em primeiro lugar. O que realmente importa é quefiltfilt
não causa distorções de fase, enquantolfilter
causa (a menos que seja usado como um filtro FIR de fase linear, ou seja, com denominador = 1).filtfilt
corresponde à filtragem com (2N-1) a ordem comlfilter
.lfilter
oufiltfilt
. Eles se comportam de maneira diferente, como mostradoResponder por @endolith está completo e correto! Por favor, leia primeiro o post dele, e depois este, além dele. Devido à minha baixa reputação, não consegui responder aos comentários em que @Thomas Arildsen e @endolith discutem sobre a ordem efetiva do filtro obtida por
filtfilt
:lfilter
aplica determinado filtro e, no espaço de Fourier, é como aplicar a função de transferência de filtro UMA VEZ.filtfilt
aplique o mesmo filtro duas vezes e o efeito é como aplicar a função de transferência de filtro SQUARED. No caso de filtro Butterworth (scipy.signal.butter
) com a função de transferênciao ganho efetivo será
fonte