Friday 15 February 2019

Média móvel sem excesso


Estou tentando encontrar uma maneira de calcular uma média cumulativa em movimento sem armazenar a contagem e o total de dados recebidos até agora. Eu criei dois algoritmos, mas ambos precisam armazenar a contagem: dados médios (dados antigos antigos) dados próximos (próxima contagem anterior) próxima contagem nova média antiga média (próximo dado - média anterior) próxima contagem O problema com esses métodos é que a contagem Fica cada vez maior, resultando em perda de precisão na média resultante. O primeiro método usa a contagem antiga e a próxima contagem, que são obviamente separadas. Isso me fez pensar que talvez exista uma maneira de remover a contagem, mas infelizmente não consegui encontrá-la. No entanto, conseguiu-me um pouco mais, resultando no segundo método, mas ainda contagem está presente. É possível, ou estou apenas procurando o impossível, perguntou: 28 de setembro 12 às 8: 46. Experimentei alguns técnicos em média correntes para alisar a mudança nos dados ADC no AtMega48 para controlar as luzes (PWM) ao girar uma panela (ADC). Os filtros (pseudo-códigos): observei que os filtros são muito agradáveis. Mas devagar em resposta, o que é esperado. Procuro técnicas como a média móvel exponencial. Disse ser mais receptivo. Existe outro como este Como ele diz: onde está entre 0 e 1. Como codificar e otimizar esses códigos sábios (sem usar flutuadores) Ou Como eu converteria os flutuadores em números inteiros correspondentes para tornar o código pequeno, rápido e responsivo. E eu mantive 1 Outro, então, que não funcionará como esperado. Por Idve mudar todas as variáveis ​​para flutuar. Por favor, não se concentre na seguinte declaração por enquanto, mas observe. Manter flutuadores na minha base de código está preenchendo a memória do programa de 45 a 137, no caso de Você pode implementar com sobrecarga mínima, limitando as frações binárias. Eu usei isso com bons resultados. Pegue o resultado existente, Deslize N lugares direito para dividir por 2N Subtrai-lo do resultado existente. Adicionar novos dados Isso não é tão rápido em mudar com uma mudança de etapa nos dados de entrada como você deseja, mas é fácil de implementar e efetivo o suficiente como um filtro em muitos casos. Você pode acelerar sua resposta ao tomar decisões informais quanto ao seu comportamento em casos que são muito diferentes. Por exemplo, mantenha uma contagem de entradas seqüenciais que são mais que um limite diferente do resultado existente. Se essa contagem ultrapassar algum limite, altere a proporção de divisão N por algum fator. Por exemplo, N é geralmente 4- os resultados são deslocados para direita 4 vezes 16. Se a entrada for mais que xxx longe da resposta, faça apenas duas mudanças para a direita e multiplique a nova amostra em 4 antes de adicionar. Respondeu 4 de outubro às 6: 08. É possível implementar uma média móvel em C sem a necessidade de uma janela de amostras. Achei que eu posso otimizar um pouco, escolhendo um tamanho de janela que é um poder de dois para permitir o deslocamento de bits Em vez de dividir, mas não precisar de um buffer seria bom. Existe uma maneira de expressar um novo resultado de média móvel apenas como função do resultado antigo e da nova amostra. Definir um exemplo de média móvel, em uma janela de 4 amostras para ser: Adicionar nova amostra e: Uma média móvel pode ser implementada de forma recursiva , Mas para uma computação exata da média móvel você deve lembrar a amostra de entrada mais antiga na soma (ou seja, a no seu exemplo). Para um comprimento N média móvel você calcula: onde yn é o sinal de saída e xn é o sinal de entrada. Eq. (1) pode ser escrito de forma recursiva, então você sempre precisa se lembrar da amostra xn-N para calcular (2). Conforme demonstrado por Conrad Turner, você pode usar uma janela exponencial (infinitamente longa) em vez disso, o que permite calcular a saída apenas da saída passada e da entrada atual: mas esta não é uma média móvel padrão (não ponderada), mas exponencialmente Média móvel ponderada, onde as amostras no passado obtêm um peso menor, mas (pelo menos em teoria) você nunca esquece nada (os pesos ficam cada vez menores e menores para amostras no passado). Eu implementei uma média móvel sem memória de item individual para um programa de rastreamento GPS que eu escrevi. Eu começo com 1 amostra e divide por 1 para obter o valor médio atual. Em seguida, adicione uma amostra e divida em 2 para a média atual. Isso continua até chegar ao comprimento da média. Cada vez, adiciono na nova amostra, obtenho a média e retire essa média do total. Eu não sou matemático, mas isso pareceu uma boa maneira de fazê-lo. Eu pensei que isso tornaria o estômago de um verdadeiro matemático, mas, parece que é uma das maneiras aceitas de fazê-lo. E funciona bem. Basta lembrar que, quanto mais alto for seu comprimento, mais lento seguirá o que você deseja seguir. Isso pode não importar a maior parte do tempo, mas ao seguir os satélites, se você estiver lento, a trilha pode estar longe da posição real e parecerá ruim. Você poderia ter uma lacuna entre o Sáb e os pontos de fuga. Eu escolhi um período de 15 atualizado 6 vezes por minuto para obter um alisamento adequado e não chegar muito longe da posição real de SAT com os pontos de trilhos alisados. Respondido 16 de novembro 16 às 23:03 inicializar total 0, count0 (cada vez que vê um novo valor Então uma entrada (scanf), uma adicionar totalnewValue, um incremento (contagem), uma média de divisão (total total) Esta seria uma média móvel em relação a Todas as entradas Para calcular a média sobre apenas as últimas 4 entradas, seria necessário 4 variáveis ​​de entrada, talvez copiando cada entrada para uma variável de entrada mais antiga, calculando a nova média móvel. Como soma das 4 variáveis ​​de entrada, divididas por 4 (o turno direito 2 seria Bom, se todas as entradas fossem positivas para que o cálculo médio fosse respondido 3 de fevereiro 15 às 4:06 Isso realmente calculará a média total e NÃO a média móvel. À medida que a contagem aumenta, o impacto de qualquer nova amostra de entrada se torna ndash extremamente lento Hilmar Feb 3 15 às 13:53 Sua resposta 2017 Stack Exchange, Inc

No comments:

Post a Comment