Algoritmos DSP com a placa STM32F4Discovery – Parte II

dsp
Este post faz parte da série Algoritmos DSP com a placa STM32F4Discovery. Leia também os outros posts da série:

Boas meus caros leitores, vamos seguir com a segunda parte desta série, cujo o objetivo é mostrar um pouco sobre como codificar blocos de código para uso em processamento digital de sinais. No artigo anterior, fizemos uma pequena revisão sobre o kit  e seu processador, bem como a configuração de todo o hardware inerente às nossas aplicações. Isso torna o processo de avaliação dos códigos aqui desenvolvidos bem menos cansativo, então vamos ao assunto desse artigo, filtros de média móvel.

Filtros FIR e IIR de média móvel

É sábido que dentre os tipos de filtros digitais, estes costumam ser divididos em dois sub-grupos com características bem distintas. São eles os filtros de resposta a impulso finito (FRI ou FIR) e os filtros com resposta a impulso infinito (RII ou IIR). Sem entrar demais em detalhes teóricos, que fogem ao escopo desta série, e falando do ponto de vista computacional, a diferença entre esses dois filtros é basicamente o uso de recursão, ou seja, o valor filtrado corrente no caso de um filtro FIR não depende do valor filtrado anterior, mas apenas dos estados corrente e anterior dos valores não filtrados. No caso dos filtros IIR, além da dependência do estado corrente e anterior dos valores não filtrados, o valor filtrado corrente depende também do estado do valor filtrado anterior.

Agora que temos uma idéia da diferença entre esses filtros, vamos apresentar um tipo de filtragem não recursiva muito comum, e um “upgrade” desse tipo de filtro implementado em modo recursivo, o filtro de média móvel.

Esse filtro, conhecido pela sua simplicidade, tem por princípio de operação calcular um novo valor filtrado baseado na média dos estados das amostras anteriores. Para melhor desempenho, ele utiliza-se de uma média central. Por exemplo, para processar o valor filtrado de uma dada amostra, são tomadas a média dela com uma parcela de estados anteriores e uma parcela de estados futuros. Como digitalmente em execução amostra por amostra, é difícil prever o valor futuro de uma dada amostra, esse filtro pode ser melhor calculado se seu processamento for feito em blocos.

300px FIR Filter.svg
FIgura 1 : Fluxo de sinal de um filtro FIR

Assim a figura acima denota a idéia de como deve ser o fluxo de  processamento de um filtro FIR. Para que esse seja um filtro de média móvel basta fazer com que todos os coeficientes bx sejam iguais, da forma que a equação desse filtro pode ser calculada como demonstrado na expressão abaixo:

Equação 1 : Filtro média móvel
Equação 1 : Filtro média móvel

Os coeficientes bx , apresentados na figura 1, na verdade é o resultado da divisão 1/N  mostrada na equação 1. Assim, para computar uma nova amostra de saída, faz-se necessário acumular primeiro todas as amostras anteriores do sinal de entrada juntamente com a amostra corrente e multiplicar pelo coeficiente 1/N , mais simples impossível.

A filtragem digital por média móvel possui um conjunto de vantagens, entre elas podemos destacar:

  • Simplicidade de implementação;
  • Não precisa de coeficientes;
  • Estável, visto que não possui pólos em sua função de transferência;
  • Efetivo com ruídos de amplitude aleatória.

Dentre as aplicações práticas desse tipo de filtro podemos citar tipos de sistemas de processamento de sinal de baixa velocidade, como por exemplo captura de aquisição de sinais de células de carga. Além disso esse tipo de filtro pode ser utilizado em conjunto com o elo de realimentação de controles PID, permitindo estimar com melhor exatidão o valor de um dado sensor, de um modo geral, em sistemas que possuem ruídos de elevada frequência. Esse tipo de filtro permite “substituir” qualquer valor que se diferencie muito da média calculada para um valor mais próximo a esse. Em contra ponto esse tipo de filtro apresenta alguns pontos que precisam de melhorias:

  • faixa de “Roll-off” grande entre frequência de corte e “stop-band”;
  • Para funcionamento eficaz, pode precisar de muitos elementos;
  • Aumento de elementos, aumento de consumo de memória;
  • Pouco flexível, frequência de corte depende da taxa de amostragem.

Para contornar os pontos fracos desse tipo de filtragem, porém mantendo-se a simplicidade de construção, foi adicionado um elo de recursão no algoritmo de média móvel. Com isso obtém-se um simples, porém poderoso e flexível, filtro chamado de EMA (Exponential Moving Average Filter) ou filtro por média móvel exponencial, e a sua expressão de cáculo pode ser conferida abaixo:

Equação 2 : Filtro EMA
Equação 2 : Filtro EMA

Observemos a equação,  y[n] denota a saída do sistema de filtro, ou seja, pode ser entendida como o valor exponencial médio corrente da sequência de amostras do sinal capturado. Porém para cálculo desse tipo de filtro dependemoss também da média exponencial móvel anterior, ou seja, dependemos da saída anterior. Ok, mas qual é a entrada desse filtro? O termo Avg[k] denota o cálculo de uma média móvel similar à apresentada pela equação 1, o coeficiente alpha tem por função determinar a frequência de corte desse filtro, e empiricamente a relação entre esse coeficiente e tal ponto de atenuação do filtro é de que quanto menor alpha menor a frequência de corte.

Para o caso do leitor mais experiente (e desconfiado, por que não?) esse filtro IIR (veremos já por quê) pode ser analisado no domínio da frequência de modo que possam ser aplicados métodos analíticos para um melhor cálculo do seu único coeficiente. Vale apenas lembrar que por se tratar de um filtro IIR, o mesmo possui algumas condições para que ele fique estável, o que exige um grau de cuidado maior na hora de implementar um filtro desses.

Para tal análise, façamos beta = (1 – alpha)  e sabemos que Avg[k] é a entrada desse filtro, logo temos:

Equação 3 : Função de transferência do Filtro EMA
Equação 3 : Função de transferência do Filtro EMA

Como pode se ver temos um pequeno sistema de primeira ordem, onde temos que encontrar dois coeficientes, tarefa reduzida a apenas um termo, pois sabemos de antemão que beta = (1 – alpha). Pra quem gosta de um método analítico, divirtam-se usando essa função de transferência no software matemático de sua preferência (Scilab, MATLAB ou LabVIEW). O que queremos aqui é ver esse filtro rodando em um microcontrolador.

Implementando e testando os filtros

Como na parte anterior, esse projeto é uma continuação e pode ser obtido no Github. Para o desenvolvimento foi utilizado o ambiente Eclipse, combinado com o compilador C para ARM baseado na toolchain GNU. Em adição irei prover a você caro leitor uma versão desse código em Assembly, para que considere o uso de uma ação baixo nível caso deseje.

O código e interface de ambos os filtros estão nos arquivos AverageDigitalFilter.h e EMADigitalFilter.h. Lá estão disponíveis as estruturas de dados dos filtros, algumas constantes de configuração e os métodos para inicialização e computação dos valores, dado um conjunto de dados. Depois de configurado o filtro desejado, a sugestão é que proceda como o código anterior, colocando o método para calcular um novo valor filtrado na rotina de interrupção. Lembre-se de obedecer o teorema de Nyquist-Shannon na hora de colocar algum sinal real para captura do conversor analógico para digital.

No projeto exemplo a variável xGlobalStatus pode ser utilizada para debug da operação do filtro, por isso é recomendado, se possível, tratar o retorno das funções Init e DoFilter (existentes em ambos os módulos). O código exemplo está bem mais simples que o apresentado na primeira parte.

Dessa vez gostaria que o caro leitor colocasse seu próprio sinal ruidoso na entrada do conversor A/D do seu hardware e monitorasse o comportamento na saída. Por padrão o projeto exemplo está utlizando o conceito de filtragem por tempo real, de forma que o processamento é totalmente determinístico e tão logo a amostra esteja filtrada, ela já é colocada na saída. O valor inicial de alpha foi configurado para fornecer uma frequência de corte próximo dos 40Hz, um valor bom para testar captura de sinais mais complexos, porém de baixa velocidade como células de carga.

E para finalizar, meu setup de teste utilizado foi um osciloscópio Tektronix TDS2024B. Para geração de sinais ainda estou a manter o bom e versátil Analog Discovery provendo uma saída senoidal somada com ruído branco com frequência de 40Hz e 1V de amplitude. Para monitoração das fontes de alimentação e pontos de teste, um simples e versátil multímetro Fluke série 115. Infelizmente esse que vos escreve não irá prover as telas de resultados, dados aos meus bichanos travessos que pisotearam o circuito de teste no momento dos testes, bem durante a publicação desse artigo.

E por fim a última recomendação, divirta-se fazendo ajustes, e usando diferentes conceitos como processamento por blocos, além do ajuste do comprimento do buffer de média móvel.

Conclusão

O que achou meu caro leitor? Filtros digitais não assustam muito, certo? Ainda mais quando existem alternativas simples de construção com poucos recursos computacionais. Vimos que é possível sim abordar uma introdução à filtragem digital com uma abordagem um pouco mais prática, e como nos artigos anteriores, que a matemática envolvida não assusta ninguém. Na próxima parte, iremos trabalhar ainda com filtragem digital, mas com o auxilio de ferramentas iremos calcular os coeficientes de filtros FIR e IIR mais especificos, implementando na STM32F4Discovery e aproveitaremos um pouco da produtividade oferecida por ferramentas de projeto computacionas. Então é isso, até a próxima.

Referências e links de apoio

– Pasta  do projeto DSP Embarcados

CoActionOS –  An easy-to-use digital filter – disponivel em : http://coactionos.com/embedded%20design%20tips/2013/10/04/Tips-An-Easy-to-Use-Digital-Filter/

– D. H. Chen – A Zero-lag exponential moving average filter for real time control and noisy data processing – 2007

– Oppenheim A. V. – Digital Signal Processing – 1999

Outros artigos da série

<< Algoritmos DSP com a placa STM32F4Discovery – Parte IAlgoritmos DSP com a STM32F4Discovery – Parte III >>
Website | Veja + conteúdo

Engenheiro de sistemas embarcados apaixonado pelo que faz, tendo experiencia, nos últimos 15 anos, em áreas de alta tecnologia como: Defesa, Automotiva, Agricultura, Robótica e Semicondutores. Possui paixão por compartilhar e desmistificar tópicos de engenharia tidos como complexos ou misteriosos demais. Atualmente trabalha na Espressif Systems levando seus chips para projetos Open-Source. No tempo livre constroi e programa seus próprios robôs e controladores de motor.

Licença Creative Commons Esta obra está licenciada com uma Licença Creative Commons Atribuição-CompartilhaIgual 4.0 Internacional.

Receba os melhores conteúdos sobre sistemas eletrônicos embarcados, dicas, tutoriais e promoções.

Comentários:
Notificações
Notificar
guest
2 Comentários
recentes
antigos mais votados
Inline Feedbacks
View all comments
Haroldo Amaral
Haroldo Amaral
13/08/2014 00:03

Boa noite Felipe, parabéns pelos artigos. Apesar de possuir a Stellaris estou pensando em adquirir uma dessas para seguir suas publicações e aprender sobre outros ambientes. Você irá disponibilizar no github os dois arquivos citados no artigo (não os encontrei lá)?

Grato.

Felipe Neves
Felipe Neves
Reply to  Haroldo Amaral
05/09/2014 22:53

Haroldo, peço desculpas pela demora na resposta.

Sobre a sua pergunta, sim inclusive os arquivos da parte I estão no Github, para a terceira parte da série acabei esbarrando em alguns problemas na hora de sincronizar os arquivos especificos de cada parte da série, mas acredito que no próximo artigo ja teremos disponíveis os arquivos no github para download.

Abraço!

Talvez você goste:

Séries



Outros da Série

Menu