MATLAB “s filtfilt faz uma filtragem para frente e para trás, ou seja, filtra, reverte o sinal, filtra novamente e depois reverte novamente. Aparentemente, isso é feito para reduzir os atrasos de fase? Quais são as vantagens / desvantagens de usar essa filtragem (acho que resultaria em um aumento efetivo na ordem do filtro).

Seria preferível usar filtfilt sempre em vez de filter ( ou seja, apenas a filtragem de encaminhamento)? Há algum aplicativo em que seja necessário e não deva ser usado?

Comentários

Resposta

Você pode olhar melhor para isso no domínio da frequência. Se $ x [n] $ é a sequência de entrada e $ h [n] $ é a resposta ao impulso do filtro, então o resultado da primeira passagem do filtro é

$$ X (e ^ {j \ omega}) H (e ^ {j \ omega}) $$

com $ X (e ^ {j \ omega}) $ e $ H (e ^ {j \ omega}) $ o Transformadas de Fourier de $ x [n] $ e $ h [n] $, respectivamente. A reversão do tempo corresponde a substituir $ \ omega $ por $ – \ omega $ no domínio da frequência, então, após a reversão do tempo, obtemos

$$ X (e ^ {- j \ omega}) H (e ^ {- j \ omega}) $$

A segunda passagem do filtro corresponde a outra multiplicação com $ H (e ^ {j \ omega}) $:

$$ X (e ^ {- j \ omega}) H (e ^ {j \ omega}) H (e ^ {- j \ omega}) $ $

que após a reversão do tempo finalmente dá para o espectro do sinal de saída

$$ Y (e ^ {j \ omega}) = X (e ^ {j \ omega }) H (e ^ {j \ omega}) H (e ^ {- j \ omega}) = X (e ^ {j \ omega}) | H (e ^ {j \ omega}) | ^ 2 \ tag {1} $$

porque para coeficientes de filtro de valor real temos $ H (e ^ {- j \ omega}) = H ^ {*} (e ^ {j \ omega}) $. A equação (1) mostra que o espectro de saída é obtido filtrando com um filtro com resposta de frequência $ | H (e ^ {j \ omega}) | ^ 2 $, whi ch tem valor puramente real, ou seja, sua fase é zero e, conseqüentemente, não há distorções de fase.

Esta é a teoria. No processamento em tempo real, é claro, há um grande atraso porque a reversão de tempo só funciona se você permitir uma latência correspondente ao comprimento do bloco de entrada. Mas isso não muda o fato de que não há distorções de fase, é apenas um atraso adicional dos dados de saída. Para a filtragem FIR, esta abordagem não é especialmente útil porque você também pode definir um novo filtro $ \ hat {h } [n] = h [n] * h [-n] $ e obter o mesmo resultado com a filtragem normal. É mais interessante usar este método com filtros IIR, porque eles não podem ter fase zero (ou fase linear, ou seja, um atraso puro).

Em suma:

  • se você tem ou precisa de um filtro IIR e deseja distorção de fase zero, E o atraso de processamento não é problema, então este método é útil

  • se o atraso no processamento for um problema, você não deve usá-lo

  • se você tiver um filtro FIR , você pode calcular facilmente uma nova resposta do filtro FIR que é equivalente a usar este método. Observe que com os filtros FIR, uma fase exatamente linear pode sempre ser realizada.

Comentários

  • Eu criei uma tag chamada maximum-aposteriori-estimation. Você poderia renomeá-lo para maximum-a-posteriori-estimation? Por engano, esqueci o - após o a. Obrigado.

Resposta

Encontrei este vídeo para ser muito, muito útil (desenvolve a resposta de Matt).

Aqui estão algumas idéias-chave do vídeo:

  • Zero-phase will resultará em nenhuma distorção de fase, mas resultará em um filtro não causal. Isso significa que se os dados estão sendo filtrados conforme são coletados, isso não será uma opção (válido apenas para dados armazenados que podemos pós-processamento) . insira a descrição da imagem aqui
  • Quando você implementa um filtro não causal, os transientes ficam borrados para frente e para trás (por exemplo, se quisermos uma ondulação de 2dB, o fato que estaremos fazendo uma execução para frente e para trás usando o filtro significa que queremos que cada um deles tenha 1dB). insira a descrição da imagem aqui
  • Usa a propriedade de reversão de tempo da transformação de Fourier de tempo discreto. insira a descrição da imagem aqui
  • A resposta de frequência efetiva causada por FILTFILT é a magnitude disso em uma direção, ao quadrado. Você pega seu sinal de entrada, x[n], filtra, reverte o resultado, filtra novamente e reverte novamente (a etapa de reversão do tempo requer que todos os dados estejam disponíveis). insira a descrição da imagem aqui

Deixe uma resposta

O seu endereço de email não será publicado. Campos obrigatórios marcados com *