Thursday 19 October 2017

Média de movimento circular


Aqui está uma sugestão completamente diferente. Eu estava tentando realmente torná-lo melhor, em vez de mais legível. O problema com o seu código atual é que resume muitos números novamente e novamente, quando não realmente neededparing ambas as abordagens após a implementação code. I M apenas somando um bando pela primeira vez e, em seguida, subtraindo a cauda e adicionando a cabeça, novamente e again. And aqui estão os testes de velocidade, comparando a abordagem full-recalculação vs este one. Since Foo1 é O nm e Foo2 é O Nm não é realmente surpreendente que a diferença é enorme. Resultados sobre este realmente não são loucos big scale are. Results são iguais True. Foo1 5 52 secondss. Foo2 61 1 milissegundos. E em uma escala maior substituído 1000 com 10000 em ambas as iterações e Count. Foo1 Parado após 10 minutos. Foo2 6 9 segundos. Uma das principais aplicações para a placa Arduino é leitura e registro dos dados do sensor Por exemplo, um monitora a pressão a cada segundo do dia Como taxas de amostragem alta freqüentemente gera picos nos gráficos um Als O quer ter uma média das medidas Como as medições não são estáticas no tempo o que muitas vezes precisamos é de uma média de corrida Esta é a média de um determinado período e muito valioso quando se faz a análise de tendência. Simplest forma de uma média em execução pode ser feito Por código que se baseia na média de execução anterior. Se não se deseja usar matemática em ponto flutuante - como isso ocupa a memória e diminui a velocidade - pode-se fazer o mesmo completamente no domínio inteiro A divisão por 256 no código de exemplo é um Shift-right 8, que é mais rápido do que dizer divisão por, por exemplo, 100 Isso é verdade para cada poder de 2 como divisor e um só deve ter cuidado a soma dos pesos é igual ao poder de 2 E, claro, deve ter cuidado não há Overflow intermediário considerar o uso de unsigned long. Se você precisar de uma média mais precisa execução, in concreto das últimas 10 medições, você precisa de uma matriz ou lista vinculada para mantê-los Esta matriz age como um buffer circular e com cada nova medição a mais antiga É removido A média de corrida é calculada como a soma de todos os elementos divididos pelo número de elementos na matriz O código para a média em execução será algo como isto. Drawback deste código é que a matriz para armazenar todos os valores pode se tornar bastante grande Se você tem uma medição por segundo e você quer uma média de execução por minuto você precisa de uma matriz de 60 uma média por hora precisaria de uma matriz de 3600 Isso couldn t ser feito desta forma em um Arduino como ele só tem 2K de RAM No entanto, Construindo uma média de 2 estágios ele pode ser abordado bastante bem não para todas as medições No código psuedo. Como uma nova matriz estática interna é necessária para cada função runningAverage, isso grita para ser implementado como uma biblioteca class. RunningAverage. Classe da função acima para que ele possa ser usado várias vezes em um esboço Ele desacopla o adicionar ea função avg para ser um pouco mais flexível por exemplo, pode-se chamar a média várias vezes sem adicionar uma coisa Por favor, não Te que cada instância da classe adiciona sua própria matriz para realizar medições, e que isso adiciona até o uso de memória A interface da classe é mantida tão pequena quanto possível. Nota com versão 0 2 os nomes dos métodos são todos feitos mais Descritivo. Um pequeno esboço mostra como ele pode ser usado um gerador aleatório é usado para imitar um sensor. In configuração myRA é limpa para que possamos começar a adicionar novos dados. No primeiro loop um número aleatório é gerado e convertido em um flutuador a ser Adicionado ao myRA Em seguida, o runningAverage é impresso para a porta serial Um também poderia exibi-lo em algum LCD ou enviar sobre ethernet etc Quando 300 itens são adicionados myRA é limpo para recomeçar novamente. Para usar a biblioteca, faça uma pasta em suas libraries SKETCHBOOKPATH Com o nome RunningAverage e colocar o h e não Opcionalmente fazer um subdiretório de exemplos para colocar a amostra app.2017-01-30 inicial version.2017-02-28 corrigido destrutor em falta em h file.2017-02-28 construtor padrão removido. 2017- - trimValue Yuval Naveh adicionado trim Valor encontrado em web.2017-11-21 refactored.2017-12-30 adicionado fillValue refactored for publishing.2017-07-03 adicionado código de proteção de memória - se matriz interna não pode ser alocada tamanho torna-se 0 Isso é para resolver o problema descrito aqui. Teste extensivamente. Template class. RunningAverage h. RunningAverage. I sei que isso é alcançável com impulso como per. But eu realmente gostaria de evitar usar impulso eu tenho googled e não encontrei qualquer exemplos adequados ou legíveis. Basicamente eu quero acompanhar a média móvel De um fluxo contínuo de um fluxo de números de ponto flutuante usando os números mais recentes de 1000 como uma amostra de dados. Qual é a maneira mais fácil de conseguir this. I experimentou com o uso de uma matriz circular, média móvel exponencial e uma média móvel mais simples e encontrado Que os resultados da matriz circular adequado às minhas necessidades best. asked 12 de junho 12 às 4 38.If suas necessidades são simples, você pode apenas tentar usar uma média móvel exponencial. Put simplesmente, você faz uma variável de acumulador e como o seu código parece Em cada sam O código atualiza o acumulador com o novo valor Você escolhe uma alfa constante que está entre 0 e 1 e calcula isso. Você só precisa encontrar um valor de alfa onde o efeito de uma determinada amostra dura apenas cerca de 1000 amostras. Hmm, eu realmente não tenho certeza que isso é adequado para você, agora que eu colocá-lo aqui O problema é que 1000 é uma janela muito longa para uma média móvel exponencial Eu não tenho certeza se há um alfa que iria espalhar a média sobre o Últimos 1000 números, sem subfluxo no cálculo de ponto flutuante Mas se você quisesse uma média menor, como 30 números ou assim, esta é uma maneira muito fácil e rápida de fazê-lo. A média móvel exponencial pode permitir que o alfa seja variável Isso permite que ele seja usado para calcular médias de base de tempo, por exemplo, bytes por segundo Se o tempo desde a última atualização do acumulador for superior a 1 segundo, deixe que alfa seja 1 0 Caso contrário, Alfa ser usecs desde a última atualização 1000000 jxh 12 de junho 12 em 6 21. Basicamente eu quero rastrear a média móvel de um fluxo contínuo de um fluxo de números de ponto flutuante usando os mais recentes números de 1000 como uma amostra de dados. Note que o abaixo atualiza o total como elementos como substituto acrescentado, evitando costoso ON traversal para calcular o Sum - necessário para a média - on demand. Total é feito um parâmetro diferente de T para suportar, por exemplo, usando um longo longo quando totalizando 1000 long s, um int para char s, ou um duplo para total float s. This é um pouco falho Em que numsamples poderia passar INTMAX - se você se importa você poderia usar um unsigned long long ou usar um extra bool dados membro para gravar quando o recipiente é preenchido primeiro enquanto ciclismo numsamples em torno da matriz melhor então renomeado algo inócuo como pos. answered 12 de junho 12 em 5 19.um pressupõe que o operador vazio T amostra é realmente vazio operador T amostra oPless Jun 8 14 em 11 52. oPless ahhh bem vislumbrado realmente eu quis dizer para ele ser vazio operador T amostra, mas é claro que você poderia usar qualquer nota que você Li Ked Will fix, graças Tony D Jun 8 14 em 14 27.

No comments:

Post a Comment