Monday 30 April 2018

Algoritmo de média em movimento recursivo


O 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 dos 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 essa média se multiplicar 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 uma 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, você remove o elemento mais à esquerda da janela e subtrai seu valor da soma, depois adiciona o novo elemento mais à direita da janela e adiciona seu valor à soma. É 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 O guia do cientista e dos engenheiros para o processamento do sinal digital Por Steven W. Smith, Ph. D. Uma tremenda 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: 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 foi 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 da entrada e pontos previamente calculados 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 em ciência da computação). O Capítulo 19 discute uma variedade de filtros recursivos com mais detalhes. Esteja ciente de que o filtro recursivo médio 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ários motivos. Primeiro, existem apenas dois cálculos por ponto, independentemente do comprimento do kernel do filtro. Em segundo lugar, a adição e a subtração são as únicas operações matemáticas necessárias, enquanto a maioria dos filtros digitais requer uma 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 (ou seja, p e q). Por enquanto, todo o algoritmo pode ser realizado com representação inteira. Dependendo do hardware utilizado, os números inteiros podem ser mais que uma ordem de grandeza mais rápida que o ponto flutuante. Surpreendentemente, a representação de números inteiros funciona melhor do que o ponto flutuante com esse algoritmo, além de ser mais rápido. O erro de arredondamento da aritmética de ponto flutuante pode produzir resultados inesperados se você não for cuidadoso. Por exemplo, imagine um sinal de amostra de 10 000 que está 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 subtrações. Isso aparece no sinal de saída como um deslocamento. Inteiros não têm esse problema porque não há erro de arredondamento na aritmética. Se você deve usar ponto flutuante com esse algoritmo, o programa na Tabela 15-2 mostra como usar um acumulador de dupla precisão para eliminar essa deriva.

No comments:

Post a Comment