Thursday 9 November 2017

Valores de média móvel sem armazenamento no Brasil


Estou tentando encontrar uma maneira de calcular uma média cumulativa em movimento sem armazenar a contagem e dados totais que é recebido até agora. I veio-se com dois algoritmos, mas ambos precisam armazenar a contagem. new média antiga contagem dados antigos próximos dados próxima contagem O problema com esses métodos é que a contagem fica maior e maior, resultando em perda de precisão na média resultante. O primeiro método usa a contagem antiga ea contagem seguinte que são obviamente 1 à parte Isso me fez pensar que talvez haja uma maneira de remover a contagem, mas infelizmente eu ainda não a encontrei. Mas me trouxe um pouco mais, resultando no segundo método, mas ainda estou contando. É possível, ou estou apenas Procurando o impossível. asked Sep 28 12 at 8 46.Currently estou desenvolvendo um sistema gráfico LCD para exibir temperaturas, fluxos, tensões, energia e energia em um sistema de bomba de calor O uso de um LCD gráfico significa que metade da minha SRAM e .75 do meu flash ha Eu tenho usado para cima por um amortecedor de tela e cordas. Eu estou exibindo atualmente min valores médios máximos para a energia À meia-noite quando a figura diária restabelece, o sistema verifica se o consumo para o dia é acima ou abaixo do mínimo ou máximo anterior, e armazena O valor A média é calculada dividindo o consumo de energia acumulada pelo número de days. I gostaria de exibir a média diária na última semana e mês 4 semanas para a simplicidade iea média móvel Atualmente, isso envolve a manutenção de uma matriz de valores para o último 28 dias e calcular uma média em toda a matriz para mensal e últimos 7 dias para weekly. Initially eu estava fazendo isso usando uma matriz de carros alegóricos como a energia está na forma 12 12kWh, mas isso estava usando 28 4 bytes 112 bytes 5 4 De SRAM Eu não me importo ter apenas um único ponto decimal de resolução, então eu mudei para usar uint16t e multiplicando a figura por 100 Isso significa que 12 12 é representado como 1212, e eu divido por 100 para exibição finalidade S. O tamanho da matriz é agora até 56 bytes muito melhor. Não há nenhuma maneira trivial para reduzir a figura para baixo para um uint8t que eu posso ver que eu poderia tolerar a perda de uma casa decimal 12 1kWh em vez de 12 12kWh, mas O consumo é freqüentemente maior que 25 5kWh 255 sendo o valor mais alto representado por um inteiro sem assinatura de 8 bits O consumo nunca esteve abaixo de 10 0kWh ou acima de 35 0kWh, então eu poderia subtrair 10 dos números armazenados, mas eu sei que um dia nós Irá exceder esses limites. I então testado código para embalar valores de 9 bits em uma matriz Isso dá um intervalo de 0-51 2kWh e usa 32 bytes no total No entanto, o acesso a uma matriz como este é muito lento, especialmente quando você tem que iterar Sobre todos os valores para calcular uma média. Então a minha pergunta é - existe uma maneira mais eficiente de calcular uma média móvel com três janelas - vida útil, 28 dias e 7 dias Eficiência significa menor em termos de uso SRAM, mas sem a penalidade de enorme Code Posso evitar armazenar todos os valores. asked M Ar 7 14 em 8 32.Eu tenho pensado e você está certo Assim que tecnicamente faz a minha resposta incorreta Estou investindo mais tempo e paciência para ele Talvez algo fora da caixa Eu vou deixar você saber se eu chegar a algo Nós Fazer algo como isso muito no meu local de trabalho Deixe-me perguntar ao redor Desculpe a confusão Aditya Somani Mar 8 14 às 17. 15.Existe uma maneira mais eficiente de calcular uma média móvel com 28 dias e 7 dias precisando lembrar 27 dias de história . Você pode ficar perto o suficiente armazenar 11 valores em vez de 28 valores, talvez algo como. Em outras palavras, ao invés de armazenar todos os detalhes de todos os dias durante os últimos 27 dias, uma loja 7 ou assim valores de informações diárias detalhadas para os últimos 7 Ou assim dias, e também b armazenar 4 ou assim resumidos valores de informação total ou média para cada uma das últimas 4 semanas ou mais. Uma das principais aplicações para a placa Arduino é a leitura e registro de dados do sensor Por exemplo, um monitor de pressão a cada Segundo do dia Como alto samp Le taxas muitas vezes gera picos nos gráficos também se 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 corrente Esta é a média de um determinado período e muito valioso quando se faz análise de tendência. A forma mais simples de uma média em execução pode ser feita por um código que se baseia na média anterior de execução. 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 Divisão por 256 no código de amostra é um turno-direito 8, que é mais rápido do que dizer divisão por, por exemplo, 100 Isso é verdade para cada potência de 2 como divisor e um só deve ter cuidado a soma dos pesos é igual ao poder de 2 E Naturalmente, deve-se tomar cuidado não há transbordamento intermediário considerar o uso de unsigned long. If você precisa 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 uma circular Buffer e com cada nova medição o mais antigo é 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 o Array para manter todos os valores pode se tornar muito 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 seria necessário um array de 3600 Isso couldn t ser feito desta maneira em um Arduino Como ele só tem 2K de RAM No entanto, através da construção de uma média de 2 estágios que pode ser abordado muito bem renúncia não para todas as medições em psuedo code. As uma nova matriz estática interna é necessária para cada função runningAverage, isso grita para ser implementado como uma classe. RunningAverage biblioteca. A biblioteca runningAverage faz uma classe da função acima para que ele possa ser usado várias vezes em um esboço Desacopla o add ea função avg para ser um pouco mais flexível por exemplo, pode chamar a av Note 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. 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 é desmarcada para que possamos começar a adicionar novos dados. Em primeiro loop um número aleatório é Gerado e convertido para um flutuador a ser adicionado ao myRA Então 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 começar de novo again. To usar a biblioteca , Faça uma pasta em suas libraries SKETCHBOOKPATH com o nome RunningAverage e coloque o h e lá Opcionalmente faça um subdiretório de exemplos para colocar o exemplo app.2017-01-30 inicial version.2017-02-28 corrigido destrutor em falta h file.2017 -02-28 removido padrão Construtor.2017- - trimValue Yuval Naveh adicionado trimValue encontrado em web.2017-11-21 refactored.2017-12-30 adicionado fillValue refatorado para 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 here. Test extensivamente. Template class. RunningAverage h. RunningAverage.

No comments:

Post a Comment