Arduino média móvel exponencial


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 matriz de valores int retorna um único int. Stddev () sempre retorna um flutuador. Todas as funções, exceto rollingAverage (), levam dois argumentos. O primeiro é 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 rodagemAtração (historyarray, slicecount, 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. Esta é 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 em execução 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 é igual à potência 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 série de 60, uma média por hora precisaria de uma matriz de 3600. Isso não poderia ser feito dessa maneira 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 todas as instâncias da classe adicionam sua própria matriz para armazenar medidas, e isso aumenta o 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 está limpo 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. 2017-01-30: versão inicial 2017-02-28: destrutor faltando fixo no arquivo. h 2017-02-28: construtor padrão removido 2017--. TrimValue () Yuval Naveh adicionou trimValue (encontrado na web) 2017-11-21: refatorado 2017-12-30: adicionado fillValue () refatorado para publicação 2017-07-03: código de proteção de memória adicionado - se a matriz interna não puder ser alocada tamanho Torna-se 0. Isso é para resolver o problema descrito aqui - forum. arduino. ccindex. phptopic50473.msg1790086msg1790086 - Teste extensivamente. Classe de modelo RunningAverage. h RunningAverage. cppMovingAverage library for Arduino ou Wiring by Sofian Audry Inspirado pelo código por Karsten Kutza Uma biblioteca de média móvel exponencial eficiente em memória. Uma média móvel é uma maneira simples de suavizar um sinal. Ao ajustar um parâmetro chamado coeficiente de ponderação, é possível controlar o grau de suavização, tornando o sinal mais ou menos reativo às mudanças. Bibliotecas semelhantes e alternativas: Microsmooth Uma biblioteca de suavização de sinal leve e rápida para Arduino. Fornece vários tipos de algoritmo de suavização através de uma API baseada em função. Arduino Signal Filtering Library Fornece uma estrutura e classes para diferentes tipos de filtros de sinal de passagem baixa e filtro médio. RunningAverage Uma biblioteca para calcular uma média móvel simples (SMA) ao longo de uma janela de tempo. RunningMedian Uma biblioteca para calcular a mediana de corrida ao longo de uma janela de tempo. Copie a pasta MovingAverage para a pasta de bibliotecas do Arduino. Incluir a biblioteca Criar uma instância Uma instância do MovingAverage pode ser criada de várias maneiras. Uma média móvel funciona usando um coeficiente de redução de ponderação (), um valor entre 0 e 1 que é usado para misturar o valor atual com o rastreamento de todos os valores precedentes. Um maior descontos observações antigas mais rápido. Para criar uma instância com o padrão (0.1): Para criar uma instância com um valor específico (aqui 0.01): também é possível especificar um tamanho de janela N em vez de enviar um argumento gt 1 como o primeiro parâmetro do construtor. Nesse caso, o coeficiente será aproximado para coincidir com o tamanho da janela usando a fórmula 2 (N1). Isso é claro que não é exato, mas mais como uma regra geral para configuração. Por exemplo, para criar uma instância correspondente à média móvel em um tamanho de janela de aproximadamente 100 amostras: o segundo parâmetro permite definir o valor inicial da média móvel (o padrão é 0). No entanto, é recomendável inicializá-lo usando o reset (valor) usando um valor imparcial representativo da distribuição, como uma única amostra. Atualiza a média móvel com novo valor. A função também retorna o valor atual (opcional):

Comments

Popular Posts