Saturday 8 July 2017

Fast Moving Average Algorithm In C


Atualmente, estou desenvolvendo um sistema LCD gráfico 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 do meu SRAM e 75 do meu flash foram usados ​​por um buffer de tela e strings. Atualmente, exibo números médios mínimos de energia. À meia-noite, quando o valor diário é reiniciado, o sistema verifica se o consumo do dia está acima ou abaixo do mínimo ou mínimo anterior e armazena o valor. A média é calculada dividindo o consumo cumulativo de energia pelo número de dias. Gostaria de exibir a média diária na última semana e mês (4 semanas por simplicidade), ou seja, uma média móvel. Atualmente, isso envolve a manutenção de uma série de valores nos últimos 28 dias e o cálculo de uma média em toda a matriz para mensalmente e últimos 7 dias por semana. Inicialmente eu estava fazendo isso usando uma série de flutuadores (como a energia está na forma 12.12kWh), mas isso foi usando 28 4 bytes 112 bytes (5.4 de SRAM). Eu não me importo de 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 dividir por 100 para exibição. O tamanho da matriz agora é de até 56 bytes (muito melhor). Não há uma maneira trivial de reduzir a figura para um uint8t que eu possa ver. Eu poderia tolerar a perda de uma casa decimal (12.1kWh em vez de 12.12kWh), mas o consumo é freqüentemente maior do que 25.5kWh (255 sendo o valor mais alto representado por um inteiro não assinado de 8 bits). O consumo nunca foi inferior a 10.0kWh ou acima de 35.0kWh, então, eu poderia subtrair 10 das figuras armazenadas, mas eu sei que um dia superaremos esses limites. Então testei o código para empacotar valores de 9 bits em uma matriz. Isso dá uma faixa de 0-51.2kWh e usa 32 bytes no total. No entanto, aceder a uma matriz como esta é bastante lento, especialmente quando você precisa iterar sobre todos os valores para calcular uma média. Então, minha pergunta é: existe uma maneira mais eficiente de calcular uma média móvel com três janelas - vida, 28 dias e 7 dias. Eficiência significa menor em termos de uso SRAM, mas sem a pena de um código enorme. Posso evitar armazenar todos os valores solicitados em 7 de março às 8:32. Eu já pensei e você está certo. Então, tecnicamente, torna minha resposta incorreta. Estou investindo mais tempo e paciência nisso. Talvez algo fora da caixa. Vou avisá-lo se eu encontrar alguma coisa. Fazemos algo assim muito no meu local de trabalho. Deixe-me perguntar ao redor. Desculpe pela confusão. Ndash 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 armazenando 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, (a) armazene 7 ou mais valores de informações diárias detalhadas para o passado 7 ou mais dias, e também (b) armazenar 4 ou mais valores resumidos de informação total ou média para cada uma das últimas 4 semanas. Algoritmo: considere a estrutura da representação de ponto flutuante como uma mantisa e um expoente. A mantisa representa a precisão, ou seja, os dígitos significativos, e há um número fixo deles. À medida que seus números aumentam, o expoente começará a aumentar, o que significa que seus dígitos significativos começam a se afastar do ponto binário. Ndash Oliver Charlesworth Jun 3 11 at 13:45 Obrigado Ele disse quotNesse exercício você deve continuar o trabalho que você fez no exercício anterior. Se você executar o programa betteraverage recebendo a entrada de um arquivo que contém alguns números comuns, o primeiro algoritmo e o segundo algoritmo parecem produzir a resposta idêntica. Encontre uma situação em que este não é o caso. Ou seja, demonstre experimentalmente que a melhor média realmente é melhor, mesmo quando a soma não se transborda. Você poderia me dizer qual situação iria acontecer ndash Oliver Jun 3 11 às 13:33 No código acima suponha que temos números como 10000, 20000. Isso é um número que contém grande número de dígitos, então o valor em soma pode exceder o valor MAX, o que não é o caso no primeiro, porque a soma é sempre dividida por nenhum elemento antes de armazená-lo. Embora devido a grandes tipos de dados presentes na linguagem de programação, isso pode não ser um problema. Assim, o que os especialistas dizem usar o tipo de dados conforme sua aplicação e requisito.

No comments:

Post a Comment