Implementação recursiva média em movimento
Estou implementando um filtro de média móvel de passagem múltipla 80-72-64-48 para um sistema incorporado em C e em ponto fixo. A implementação é um buffer circular onde eu estou mantendo uma soma executando e calculando yn yn-1 xn - xn-M onde M é o comprimento de um filtro. Isso é feito para cada subfiltro com a saída de uma porção como entrada para outra. Estou ampliando meus coeficientes em 2, o que me dá coeficientes de comprimento 2 ou 2 dependendo do comprimento do filtro. Em seguida, o resultado é reduzido novamente em 2 para obter a saída correta. Agora, tudo parece ser bom em baixas escalas de tempo, mas por longos tempos eu tenho uma deriva. O motivo da implementação recursiva é salvar cálculos em um processador incorporado. Eu incluí a imagem de alguns dos internos do meu filtro, isto é, quando uma resposta passo é aplicada e podemos ver as funções de transferência dos filtros tomando forma, quadrado, triângulo e, em seguida, aproximando um gaussiano para que o filtro esteja funcionando como esperado. Existe alguma maneira de corrigir isso, e onde é a fonte mais provável disso. É essa deriva devido a um pouco se perder na mudança ou outra coisa. A deriva não está presente para entradas de CC, mas para sinais de CA, ele se desloca lentamente. SOLUÇÃO: O problema estava no acumulador como robert sugeriu nos comentários. A questão era que um elemento do cálculo passara por um deslocamento para cima e para baixo, em comparação com o resto, o que criou um deslocamento redondo acumulado. Perguntou 27 de abril 15 às 21:12 é o seu acumulador, sendo arredondado ou quantificado 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 há. Então você realmente quer fazer uma soma móvel. Ao invés de uma média móvel e dimensionar a saída da sua soma móvel (com 1M) para obter a média. Isso é bastante factível e ainda melhor feito em ponto fixo e não em ponto flutuante. Ndash robert bristow-johnson 27 de abril 15 às 22:52 Cálculo dos coeficientes Eu suponho que você divide por M após cada estágio e esse é o coeficiente que você escala Isso provavelmente é a causa do deslocamento. Melhor depois dividir por prod Mi no final de todos os filtros. Você precisa acompanhar as amplitudes internas, pois você eventualmente irá transbordar os acumuladores. No entanto, isso é facilmente resolvido através da aritmética de módulo (dos quais o complemento de dois anos é um caso especial). Ndash Oscar 28 de abril 15 às 7:00 Oscar, este é um filtro de ponto fixo. O que significa que eu apenas aritmico inteiro. Para uma média móvel do comprimento gt 1 com ganho 1, as constantes do filtro serão uma fração que não é representável em números inteiros. Assim, os coeficientes são dimensionados para torná-los inteiros, deixando-os deslocando x muitos bits. Devido a isso, a saída final deve ser deslocada também para a direita por tantos bits. Não consigo manter uma soma executando através de todos os 4 filtros sem restaurar a saída no meio, 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 acumulação de 32 bits ndash user70614 28 de abril 15 em 8: 20O principal defeito no seu programa é que o cálculo recursivo está incorreto. Para calcular a média, você deve obter a soma do valor atual e os valores restantes. Então divida essa soma pelo número de valores. O número de valores é num. O valor atual é o que o número de cálculo () retorna. A soma dos valores restantes é num-1 multiplicada pela média dos valores remanescentes. A média dos valores restantes é calculada fazendo uma chamada recursiva para a média (). Assim, escrevemos o seguinte: Um programa completo que usa essa função pode ser assim: note que esta não é uma ótima maneira de calcular a média porque você perde a precisão toda vez que você divide a soma atual por número. Quando esta média é multiplicada novamente à medida que a chamada recursiva retorna, os dígitos significativos que você perdeu na divisão não são restaurados. Você está destruindo informações dividindo e multiplicando a soma. Para maior precisão, você gostaria de acompanhar a soma enquanto você passa pelos elementos, então divida no final. Outro ponto a considerar é o que se entende por uma média móvel. O que implementamos acima não é uma média móvel, mas uma média fixa. É a média de uma janela fixa de elementos. Se você mover a janela por uma posição, você deve começar tudo e calcular a soma novamente. A maneira correta de implementar uma janela em movimento é acompanhar todos os elementos da janela. Quando você desloca a janela para uma posição para a direita, remove o elemento mais à esquerda da janela e subtrai seu valor da soma, depois adiciona o novo elemento mais à direita da janela e adiciona o valor à soma. Isso é o que faz dela uma soma móvel. Dividir a soma móvel pelo número de elementos dá-lhe a média móvel. A maneira natural de implementar uma janela em movimento é com uma fila porque você pode adicionar novos elementos à cabeça e exibir elementos antigos da cauda. Respondeu 22 de novembro às 17: 44 A média móvel como um filtro A média móvel é freqüentemente usada para suavizar 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 na verdade é um dos filtros mais comuns no processamento de sinal. Tratá-lo como um filtro, permitindo compará-lo com, por exemplo, filtros com janelas-sinc (veja os artigos sobre os filtros passa-baixa, passagem alta e banda passada e banda-rejeição 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. Dos quais suavizar medições por meio da média é um excelente exemplo. Os filtros Windowed-sinc, por outro lado, são performantes no domínio da frequência. Com equalização no processamento de áudio como um exemplo típico. Existe uma comparação mais detalhada de ambos os tipos de filtros no Time Domain vs. Frequency Domain Performance of Filters. Se você tem dados para os quais tanto o tempo como o 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 uma série de versões ponderadas da média móvel que são melhores nisso. A média móvel do comprimento (N) pode ser definida como escrita como normalmente é implementada, com a amostra de saída atual como a média das amostras anteriores (N). Visto como um filtro, a média móvel realiza uma convolução da sequência de entrada (xn) com um impulso retangular de comprimento (N) e altura (1N) (para tornar a área do pulso e, portanto, o ganho do filtro , 1 ). Na prática, é melhor tomar (N) ímpar. Embora uma média móvel também possa ser calculada usando um número par de amostras, usando 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) As amostras são exatamente ((N-1) 2). A média móvel pode então ser alinhada exatamente com os dados originais, deslocando-a por um número inteiro de amostras. Domínio do tempo Uma vez que a média móvel é uma convolução com um pulso retangular, sua resposta de freqüência é uma função sinc. Isso torna algo parecido com 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. Essa é essa resposta de freqüência de voz que torna a média móvel um desempenho pobre no domínio da freqüência. No entanto, ele funciona muito bem no domínio do tempo. Portanto, é perfeito suavizar os dados para remover o ruído e, ao mesmo tempo, manter uma resposta de passo rápido (Figura 1). Para o típico Black Gaussian Noise (AWGN) que é frequentemente assumido, as amostras de média (N) têm o efeito de aumentar o SNR por um fator de (sqrt N). Uma vez que o ruído para as amostras individuais não está correlacionado, não há motivo para tratar cada amostra de forma diferente. Assim, a média móvel, que dá a cada amostra o mesmo peso, eliminará a quantidade máxima de ruído para uma nitidez de resposta de passo dada. Implementação Por ser um filtro FIR, a média móvel pode ser implementada através da convolução. Em seguida, terá a mesma eficiência (ou falta dela) como qualquer outro filtro FIR. No entanto, também pode ser implementado de forma recursiva, de uma maneira muito eficiente. Ele segue diretamente da definição de que esta fórmula é o resultado das expressões para (yn) e (yn1), ou seja, onde percebemos que a mudança entre (yn1) e (yn) é que um termo extra (xn1N) aparece em O fim, enquanto o termo (xn-N1N) é removido desde o início. Em aplicações práticas, muitas vezes é possível excluir a divisão por (N) para cada termo, compensando o ganho resultante de (N) em outro local. Esta implementação recursiva será muito mais rápida do que a convolução. Cada novo valor de (y) pode ser calculado com apenas duas adições, em vez das adições (N) que seriam necessárias para uma implementação direta da definição. Uma coisa a procurar com uma implementação recursiva é que os erros de arredondamento se acumulam. Isso pode ou não ser um problema para a sua aplicação, mas também implica que esta implementação recursiva funcionará melhor com uma implementação inteira do que com números de ponto flutuante. Isso é bastante incomum, uma vez que uma implementação em ponto flutuante geralmente é mais simples. A conclusão de tudo isso deve ser que você nunca deve subestimar a utilidade do filtro de média móvel simples em aplicações de processamento de sinal. Ferramenta de design de filtro Este artigo é complementado com uma ferramenta de design de filtro. Experimente valores diferentes para (N) e visualize os filtros resultantes. Tente agora
Comments
Post a Comment