Moving Average Recursive Implementation
Estou implementando um 80-72-64-48 multi passagem filtro de média móvel para um sistema embutido em C e em ponto fixo. A implementação é um buffer circular onde im mantém uma soma corrente e calcula yn yn-1 xn-xn-M onde M é o comprimento de um filtro. Isso é feito para cada subfiltro com a saída de um serviço como entrada para outro. Im escalando meus coeficientes por 2 o que me dá coeficientes de comprimento 2 ou 2 dependendo do comprimento do filtro. Em seguida, o resultado é reduzido novamente por 2 para obter a saída correta. Agora, tudo parece bom em escalas de tempo curto, mas durante longos tempos eu recebo uma deriva. A razão para a implementação recursiva é salvar cálculos em um processador incorporado. Eu incluí a imagem de alguns dos internals de meu filtro, isto é quando uma resposta da etapa é aplicada e nós podemos ver as funções da transferência dos filtros que tomam a forma, quadrado, triângulo, aproximando então um gaussian assim que o filtro está trabalhando como esperado. Existe alguma maneira de corrigir isso, e onde é a fonte mais provável disso. É este drift devido a um pouco se perder no deslocamento ou outra coisa. A deriva não está presente para entradas DC, mas para sinais de CA ele lentamente drifts. SOLUÇÃO: O problema estava no acumulador como sugeriu Robert nos comentários. A questão era que um elemento do cálculo tinha passado por um deslocamento para cima e para baixo extras em comparação com o resto, o que criou um deslocamento redondo que se acumulou. Perguntou 27 de abril às 21:12 é o seu acumulador yn sendo arredondado ou quantized de qualquer maneira você deve se certificar de que o xn-M que é subtraído é exatamente o mesmo valor que xn que foi adicionado M amostras atrás. Então você realmente quer fazer uma soma móvel. Em vez de uma média móvel e escala a saída de sua soma móvel (com 1 / M) para obter a média. Isso é bastante factível e ainda melhor feito em ponto fixo em vez de ponto flutuante. Ndash robert bristow-johnson Apr 27 15 at 22:52 quotScaling os coeficientesquot Eu suponho que você divide por M após cada etapa e que é o coeficiente que você escala que é provavelmente a causa do deslocamento. Melhor então dividir por prod Mi no final de todos os filtros. Você precisa manter o controle das amplitudes internas embora como você acabará por transbordar os acumuladores. No entanto, isso é facilmente resolvido através de aritmética módulo (dos quais dois complemento é um caso especial). Ndash Oscar Apr 28 15 at 7:00 Oscar, este é um filtro de ponto fixo. Significado i só fazer aritmética inteira. Para uma média móvel de comprimento gt 1 com ganho 1, as constantes de filtro serão uma fracção que não é representável em números inteiros. Assim, os coeficientes são escalados para torná-los inteiros pela esquerda deslocando-os x muitos bits. Devido a isso a saída final tem que ser deslocada também para a direita por quantos bits. I não pode manter uma soma correndo através de todos os 4 filtros sem restaurar a saída entre, o sinal de entrada é de 16 bits e com o coeficiente de escala e comprimentos Um único filtro usa todo o meu espaço de acumulador de 32 bits ndash user70614 Apr 28 15 at 8: 20The Moving Average como um filtro A média móvel é frequentemente utilizado para suavização de dados na presença de ruído. A média móvel simples nem sempre é reconhecida como o filtro de Resposta de Impulso Finito (FIR) que é, enquanto é realmente um dos filtros mais comuns no processamento de sinal. Tratá-lo como um filtro permite compará-lo com, por exemplo, windowed-sinc filtros (ver os artigos sobre low-pass, high-pass, band-pass e band-reject filtros para exemplos desses). A principal diferença com esses filtros é que a média móvel é adequada para sinais para os quais a informação útil está contida no domínio do tempo. Das quais as medidas de alisamento por média são um excelente exemplo. Filtros Windowed-sinc, por outro lado, são fortes performers no domínio da freqüência. Com equalização no processamento de áudio como um exemplo típico. Há uma comparação mais detalhada de ambos os tipos de filtros no domínio do tempo versus desempenho de domínio de freqüência de filtros. Se você tiver dados para os quais o tempo eo domínio de freqüência são importantes, então você pode querer dar uma olhada em Variações na Média Móvel. Que apresenta um número de versões ponderadas da média móvel que são melhores nisso. A média móvel de comprimento (N) pode ser definida como escrita como é tipicamente implementada, com a amostra de saída corrente como a média das amostras (N) anteriores. Visto como um filtro, a média móvel executa uma convolução da seqüência de entrada (xn) com um pulso retangular de comprimento (N) e altura (1 / N) (para fazer a área do pulso e, portanto, o ganho de O filtro, um). Na prática, é melhor tomar (N) ímpar. Embora uma média móvel possa também ser calculada utilizando um número par de amostras, utilizar um valor ímpar para (N) tem a vantagem de que o atraso do filtro será um número inteiro de amostras, uma vez que o atraso de um filtro com (N) Amostras é exactamente ((N-1) / 2). A média móvel pode então ser alinhada exatamente com os dados originais deslocando-o por um número inteiro de amostras. Domínio Dado que a média móvel é uma convolução com um pulso retangular, a sua resposta de frequência é uma função sinc. Isso torna algo como o dual do filtro windowed-sinc, uma vez que é uma convolução com um pulso sinc que resulta em uma resposta de freqüência retangular. É esta resposta de frequência de sinc que faz com que a média móvel seja um desempenho fraco no domínio da freqüência. No entanto, ele funciona muito bem no domínio do tempo. Portanto, é perfeito para suavizar os dados para remover o ruído, enquanto ao mesmo tempo ainda mantém uma rápida resposta passo (Figura 1). Para o típico Ruído Gaussiano Branco Aditivo (AWGN) que é freqüentemente assumido, a média (N) de amostras tem o efeito de aumentar a SNR por um fator de (sqrt N). Uma vez que o ruído para as amostras individuais não está correlacionado, não há razão para tratar cada amostra de forma diferente. Assim, a média móvel, que dá a cada amostra o mesmo peso, vai se livrar da quantidade máxima de ruído para uma dada nitidez resposta passo. Implementação Porque é um filtro FIR, a média móvel pode ser implementada através de convolução. Ele terá então a mesma eficiência (ou falta dela) como qualquer outro filtro FIR. No entanto, também pode ser implementado recursivamente, de uma forma muito eficiente. Segue-se diretamente da definição de que esta fórmula é o resultado das expressões para (yn) e (yn1), ou seja, onde observamos que a mudança entre (yn1) e (yn) é que um termo extra (xn1 / N) Aparece no final, enquanto o termo (xn-N1 / N) é removido do início. Nas aplicações práticas, muitas vezes é possível deixar de fora a divisão por (N) para cada termo, compensando o ganho resultante de (N) em outro lugar. Esta implementação recursiva será muito mais rápida que a convolução. Cada novo valor de (y) pode ser calculado com apenas duas adições, em vez das (N) adições que seriam necessárias para uma implementação direta da definição. Uma coisa a procurar por uma implementação recursiva é que os erros de arredondamento se acumularão. Isso pode ou não ser um problema para o aplicativo, mas também implica que essa implementação recursiva realmente funcionará melhor com uma implementação inteira do que com números de ponto flutuante. Isso é bastante incomum, uma vez que uma implementação de ponto flutuante é geralmente mais simples. A conclusão de tudo isso deve ser que você nunca deve subestimar a utilidade do simples filtro de média móvel em aplicações de processamento de sinal. Filter Design Tool Este artigo é complementado com uma ferramenta Filter Design. Experimente com diferentes valores para (N) e visualize os filtros resultantes. Experimentá-lo agora O cientista e engenheiros guia para processamento de sinal digital Por Steven W. Smith, Ph. D. Uma grande vantagem do filtro de média móvel é que ele pode ser implementado com um algoritmo que é muito rápido. Para entender esse algoritmo, imagine passar um sinal de entrada, x, através de um filtro de média móvel de sete pontos para formar um sinal de saída, y. Agora, veja como dois pontos de saída adjacentes, y 50 e y 51, são calculados: Estes são quase os mesmos pontos de cálculo x 48 a x 53 devem ser adicionados para y 50 e novamente para y 51. Se y 50 já foi calculado , A maneira mais eficiente de calcular y 51 é: Uma vez que y 51 tenha sido encontrado usando y 50, então y 52 pode ser calculado a partir da amostra y 51, e assim por diante. Depois que o primeiro ponto é calculado em y, todos os outros pontos podem ser encontrados com apenas uma única adição e subtração por ponto. Isso pode ser expresso na equação: Observe que esta equação usa duas fontes de dados para calcular cada ponto na saída: pontos a partir da entrada e pontos previamente calculados a partir da saída. Isso é chamado de equação recursiva, o que significa que o resultado de um cálculo é usado em cálculos futuros. (O termo recursivo também tem outros significados, especialmente na informática). O Capítulo 19 discute uma variedade de filtros recursivos em mais detalhes. Lembre-se de que o filtro recursivo de média móvel é muito diferente dos filtros recursivos típicos. Em particular, a maioria dos filtros recursivos tem uma resposta de impulso infinitamente longa (IIR), composta de sinusoides e exponenciais. A resposta de impulso da média móvel é um pulso retangular (resposta de impulso finito, ou FIR). Este algoritmo é mais rápido que outros filtros digitais por várias razões. Primeiro, há apenas dois cálculos por ponto, independentemente do comprimento do kernel do filtro. Em segundo lugar, a adição e subtração são as únicas operações matemáticas necessárias, enquanto a maioria dos filtros digitais requerem multiplicação demorada. Em terceiro lugar, o esquema de indexação é muito simples. Cada índice na Eq. 15-3 é encontrado adicionando ou subtraindo constantes inteiras que podem ser calculadas antes do início da filtragem (isto é, p e q). Em seguida, todo o algoritmo pode ser realizado com representação de inteiro. Dependendo do hardware usado, os inteiros podem ser mais do que uma ordem de magnitude mais rápida do que o ponto flutuante. Surpreendentemente, a representação de números inteiros funciona melhor do que o ponto flutuante com este algoritmo, além de ser mais rápido. O erro round-off de aritmética de ponto flutuante pode produzir resultados inesperados se você não for cuidadoso. Por exemplo, imagine um sinal de 10.000 amostras sendo filtrado com este método. A última amostra no sinal filtrado contém o erro acumulado de 10.000 adições e 10.000 subtracções. Isso aparece no sinal de saída como um deslocamento à deriva. Os inteiros não têm esse problema porque não há nenhum erro round-off na aritmética. Se você deve usar ponto flutuante com este algoritmo, o programa na Tabela 15-2 mostra como usar um acumulador de dupla precisão para eliminar essa deriva.
Comments
Post a Comment