Sunday 16 July 2017

Circular Moving Average


Aqui está uma sugestão completamente diferente - eu estava tentando realmente torná-lo melhor, em vez de mais legível. O problema com seu código atual é que ele resume muitos números novamente e novamente, quando não é realmente necessário. Comparando ambas as abordagens após o código de implementação. Eu apenas soma um monte pela primeira vez, e depois restando a cauda e adicionando a cabeça, novamente e novamente: E aqui estão os testes de velocidade, comparando a abordagem de recálculo completo contra esta: Uma vez que Foo1 é O (nm) e Foo2 é O (nm) não é realmente surpreendente que a diferença seja enorme. Resultados sobre esta grande escala não muito louca são: Os resultados são iguais: True Foo1: 5.52 segundos Foo2: 61.1 milissegundos E em uma escala maior (substituiu 1000 com 10000 em ambas as iterações e contagem): Foo1: Parou após 10 minutos. Foo2: 6,9 segundos Uma das principais aplicações para a placa Arduino é a leitura e registro de dados do sensor. Por exemplo, um monitora a pressão a cada segundo do dia. Como altas taxas de amostragem muitas vezes geram picos nos gráficos, um também quer ter uma média das medidas. Como as medidas não são estáticas no tempo, o que muitas vezes precisamos é uma média em execução. Esta é a média de um determinado período e muito valioso quando se faz análise de tendências. A forma mais simples de uma média de corrida pode ser feita por código que se baseia na média anterior: se não quiser usar matemática de ponto flutuante - como isso ocupa memória e diminui a velocidade - pode-se fazer o mesmo completamente no domínio inteiro. A divisão por 256 no código da amostra é um shift-right 8, que é mais rápido do que dizer divisão por e. 100. Isso é verdade para cada poder de 2 como divisor e um só deve cuidar a soma dos pesos iguais ao poder de 2. E é claro que se deve cuidar que não haja transbordamento intermediário (considere usar sem assinatura longa) Se você precisar Uma média de corrida mais precisa, in concreto das últimas 10 medidas, você precisa de uma matriz (ou lista vinculada) para mantê-las. Esta matriz funciona como um buffer circular e com cada nova medida, a mais antiga é removida. 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 assim: Desvantagem deste código é que a matriz para manter todos os valores pode se tornar bastante grande. Se você tem uma medida por segundo e quer uma média corrente por minuto, você precisa de uma matriz de 60 uma média por hora, precisaria de uma matriz de 3600. Isso não poderia ser feito desta forma em um Arduino, pois ele só possui 2K de RAM. No entanto, ao construir uma média de 2 estágios, pode ser abordado bastante bem (aviso: não para todas as medidas). 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 classe. Biblioteca RunningAverage A biblioteca runningAverage faz uma classe da função acima para que ela possa ser usada várias vezes em um esboço. Desacopla a função add () e avg () para ser um pouco mais flexível, e. Pode-se chamar a média várias vezes sem adicionar nada. Observe que cada instância da classe adiciona sua própria matriz para armazenar medições, e isso acrescenta ao uso da memória. A interface da classe é mantida tão pequena quanto possível. Nota: com a versão 0.2, os nomes dos métodos são todos mais descritivos. Um pequeno esboço mostra como ele pode ser usado. Um gerador aleatório é usado para imitar um sensor. Na configuração (), o myRA é limpo para que possamos começar a adicionar novos dados. Em loop () primeiro, um número aleatório é gerado e convertido em um flutuador para ser adicionado ao myRA. Em seguida, o runningAverage é impresso na porta serial. Pode-se também exibi-lo em algum LCD ou enviar por ethernet, etc. Quando são adicionados 300 itens, o myRA é apagado para começar de novo. Para usar a biblioteca, faça uma pasta nas suas LISTAS SKETCHBOOKPATH com o nome RunningAverage e coloque o. h e. cpp lá. Opcionalmente, faça um subdiretório de exemplos para colocar o aplicativo de exemplo. 2011-01-30: versão inicial 2011-02-28: destrutor faltando fixo no arquivo. h 2011-02-28: construtor padrão removido 2012--. TrimValue () Yuval Naveh adicionou trimValue (encontrado na web) 2012-11-21: refatorado 2012-12-30: adicionado fillValue () refactorizado para publicação 2014-07-03: código de proteção de memória adicionado - se a matriz interna não pode ser alocada tamanho Torna-se 0. Isso é para resolver o problema descrito aqui - forum. arduino. cc index. phptopic50473.msg1790086msg1790086 - Teste extensivamente. Classe Template RunningAverage. h RunningAverage. cpp

No comments:

Post a Comment