Thursday 21 September 2017

Arduino Moving Average Library


Esta é uma coleção de rotinas para a realização de análises matemáticas de arrays de números. Suporte de função atual: todas as funções estão totalmente sobrecarregadas para suportar os seguintes tipos de dados: com a exceção de stddev () eles retornam o mesmo tipo de dados que a matriz. Uma série de valores int retorna um único int. Stddev () sempre retorna um flutuador. Todas as funções, exceto rollingAverage (), levam dois argumentos. A primeira é a matriz para trabalhar. O segundo é o número de entradas na matriz. RollingAverage () toma um terceiro argumento - a nova entrada para adicionar à matriz. Formato médio do rolamento: média de rodagemAmbra (historyarray, sicecount, valor) Adiciona valor ao array historyarray deslocando todos os valores para baixo em um lugar. A média média é retornada. Formato: média média (array, sicecount) Calcula a média média dos valores na matriz. Slicecount é o número de entradas na matriz. Formato: modo médio (array, sicecount) Localiza o número mais comum na matriz. Formato: max máximo (array, slicecount) Localiza o maior valor na matriz. Formato: min mínimo (array, sicecount) Localiza o menor valor na matriz. Formato do desvio padrão: desvio stddev (array, sicecount) O desvio padrão é a raiz quadrada da média da soma dos quadrados da diferença entre cada ponto de dados e a média média da matriz. Essa é a única função que não retorna o mesmo tipo de dados que a matriz. O desvio padrão é sempre retornado como um flutuador. Uma das principais aplicações para a placa Arduino é a leitura e registro dos 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. Isto é para resolver o problema descrito aqui - forum. arduino. ccindex. phptopic50473.msg1790086msg1790086 - Teste extensivamente. Classe Template RunningAverage. h RunningAverage. cpp

No comments:

Post a Comment