Filtro Digital Passa-Baixa Primeira Ordem

Filtro Digital Passa-Baixa Primeira OrdemIntro à Filtro DigitalEquação de DiferençasFiltro de 1a-ordemFiltro Passa Baixas Digital de 1a-ordemFiltro Exponencial DigitalExemplo de Código em Python

 

Intro à Filtro Digital

Depois que um sinal contínuo passa por uma conversão analógico para digital, filtragem digital adicional pode ser aplicada para melhorar a qualidade do sinal. Se o sinal está sendo usado em um aplicativo em tempo real ou foi coletado para uma análise posterior, implementar um filtro digital via software é bastante simples. Já os vimos sendo usados casualmente em alguns dos meus posts anteriores, como MCP3008 com Raspberry Pi. Agora, vamos analisar esses tipos de filtros com mais detalhes. Para os exemplos, usaremos as funções de processamento de sinal do pacote SciPy Python.

Uma das desvantagens da filtragem digital (ou filtragem analógica, para esse assunto) é a introdução de um atraso de fase no sinal filtrado.

Acompanhe pelos gráficos abaixo:

1a-figura: sinal bruto e filtrado (com atraso de fase):

digital-filtering-with-shift

2a-figura: sinal bruto e filtrado (sem atraso de fase):

digital-filtering-withou-shift

Os gráficos anteriores ilustram como seria um sinal filtrado real e seu atraso de fase (1a-figura), em contraste com um sinal filtrado ideal sem atraso (2a-figura). Embora a situação ideal não possa ser alcançada com o processamento de sinais em tempo real, ela pode ser alcançada ao processar sinais que já estão amostrados e armazenados como uma sequência discreta de valores numéricos.

Como a sequência do início ao fim está disponível, a ideia é filtrá-la uma vez (causando uma mudança de fase) e, em seguida, filtrar a sequência resultante para trás (causando uma mudança de fase novamente). Como a filtragem é feita tanto para frente quanto para trás, as mudanças de fase se cancelam, resultando em um sinal filtrado de fase zero!

Para ver como isso é feito, confira o script filtfilt.py (mais abaixo) e os exemplos de aplicação na documentação do SciPy. Você também pode acessar o código usado para gerar os gráficos baseado na página GitHub: Things-DAQ-Code/Digital-Filtering.

Em GitHub: Things-DAQ-Code/Digital-Filtering, estão disponíveis:

A rotina filtfilt faz parte dos esforços de processamento de sinal. Há muitas informações que podem ser extraídas de um sinal depois de "limpá-lo" um pouco. Se o alinhamento temporal entre os eventos for crítico, evitar uma mudança de fase é o caminho a seguir.

Antes de entrarmos na aplicação em tempo real de filtros digitais, vamos falar brevemente sobre como eles são implementados.

Equação de Diferenças

Vou me concentrar em filtros que podem ser descritos como a equação de diferença abaixo:

Onde é a sequência de entrada (sinal bruto, de entrada) e é a sequência de saída (sinal filtrado). Antes de você abandonar esta página da web, deixe-me reescrever a equação para que possamos começar a trazê-la para uma forma mais aplicável. Já que a ideia é encontrar a saída . Em função de seus valores anteriores e da entrada, podemos escrever:

É comum normalizar os coeficientes, então .

Filtro de 1a-ordem

Para simplificar, considere um filtro de primeira ordem que, em termos de equações de diferença, depende apenas dos valores das amostras atuais e da amostra anterior, ou respectivamente: e . Assim:

Então, para construir um filtro digital passa-baixa de primeira ordem, tudo o que precisamos fazer é determinar os coeficientes: , e (considerando que , está normalizado). Felizmente para nós, as funções de design de filtro SciPy MATLAB-Style retornam esses coeficientes, reduzindo nossa tarefa para a implementação do filtro usando Python. Antes de revisarmos alguns exemplos de código, vamos examinar um filtro de primeira ordem que eu uso bastante. Ver também A função filter() do Matlab/Octave.

Filtro Passa Baixas Digital de 1a-ordem

Passar do domínio tempo contínuo para o domínio tempo discreto envolve uma transformação em que aproximamos uma variável contínua por seu equivalente discreto (transformada-Z).

No caso de um filtro passa-baixo de primeira ordem, podemos analisar seu comportamento no tempo contínuo, mais especificamente a resposta a uma entrada degrau unitário. A figura à seguir ilustra a aplicação de um filtro passa-baixa de 1a-ordem sobre um sinal exponencial de entrada:

digital-filtering-step-response-1

A resposta contínua do sistema à entrada constante (degrau unitário) é dado por: , onde é o tempo de resposta do filtro (constante de tempo do filtro) e está relacionado à frequência de corte do filtro, :

O tempo de resposta do filtro é o tempo que leva para a saída atingir aproximadamente 63% do valor final. No caso do gráfico acima, o tempo de resposta é de 0,1 segundo. Se você está se perguntando de onde isso vem, basta calcular a resposta do sistema usando .

A equação diferencial que corresponde ao sistema contínuo de primeira ordem em questão é:

E aqui é onde nossa aproximação discreta (equação de diferenças) de usando relação de Euler (também conhecida como "regra retangular direta ou forward rectangular rule"), incluindo o período de amostragem , fica:

Aplicando esta aproximação no termos e em suas contrapartes discretas e , podemos chegar à equação de diferenças abaixo, que representa o filtro digital passa-baixa de primeira ordem, onde usamos a relação de Euler para aproximar . Lembre-se: e são as amostras discretas no instante de amostrragem atual e no instante de amostragem anterior (respectivamente).

Finalmente, isolando resultra numa equação muito semelhante à que vimos no final da seção anterior. Observe que os coeficiente e são uma ponderação envolvendo uma relação entre taxa de amostragem e constante de tempo do filtro ( neste caso em particular):

O interessante nesta abordagem de implementação é que é fácil perceber que a saída é uma "média ponderada" entre seu valor anterior e o valor de entrada atual .

Note: quanto menor o tempo de resposta do filtro (), mais rápido o filtro (maior frequência de corte) e mais ele segue o valor de entrada. Por outro lado, num filtro mais lento (), a saída só leva em conta o valor anterior de saída do próprio filtro.

Filtro Exponencial Digital

Em outras abordagens semelhantes deste tipo de filtro (ver: "Filtro Exponencial Digital" em Controle com Ação Derivativa), é comum se usar o termo , onde:

e a equação de diferenças anterior é re-escrita como:

Onde: .

Tipicamente é empregado o valor (o que implica que a constante de tempo do filtro é menor que o período de amostragem adotado para o filtro).

Note:

ãé

Exemplo de Código em Python

O código Python abaixo mostra como implementar este filtro, colocando-o dentro de um loop de execução e executando uma excitação de entrada de etapa através dele. Ele produzirá o gráfico mostrado no início desta seção. Convido você a experimentar diferentes tempos de resposta (frequências de corte) e períodos de amostragem.

> Segue script filtro.py :

Fim.


🌊 Fernando Passold 📬 ,