Thursday 13 February 2020

Arduino de média móvel ponderada


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. cpp Estou trabalhando em um robô móvel controlado através de um link sem fio de 2,4 GHz. O receptor está conectado ao Arduino Uno que serve a bordo como o controlador principal. O canal de entrada mais crítico (e principal) proveniente do receptor produz um sinal muito ruidoso, o que leva a muitas pequenas mudanças na saída dos atuadores, mesmo que não sejam necessários. Estou à procura de bibliotecas que possam realizar um alisamento eficiente. Existem algumas bibliotecas de suficiência de sinal disponíveis para o Arduino (Uno), solicitado em 16 de fevereiro às 13:57. Creio que vejo muitas picos de ruído de amostra única em seu sinal ruidoso. O filtro mediano faz melhor para se livrar de espigas de ruído de amostra única do que qualquer filtro linear. (É melhor do que qualquer filtro passa-baixa, média móvel, média móvel ponderada, etc. em termos de seu tempo de resposta e sua capacidade de ignorar esses outliers de picos de ruído de amostra única). Existem, de fato, muitas bibliotecas de alívio de sinais para o Arduino, muitas das quais incluem um filtro mediano. Bibliotecas de sinalização de sinal no arduino. cc: bibliotecas de suavização de sinal no github: Alguma coisa assim funciona no seu robô (A mediana de 3 requer muito pouca energia da CPU e, portanto, rápida): você poderia filtrar isso digitalmente usando um baixo Filtro de passagem: mude o 0,99 para alterar a freqüência de corte (mais perto de 1,0 é menor freqüência). A expressão real desse valor é exp (-2piffs) onde f é a frequência de corte desejada e fs é a frequência em que os dados são amostrados. Outro tipo de filtro digital é um filtro de eventos. Funciona bem em dados que tem valores abertos, e. 9,9,8,10,9,25,9. Um filtro de eventos retorna o valor mais freqüente. Estatisticamente este é o modo. As médias estatísticas, como Média, Modo etc., podem ser calculadas usando a Biblioteca Média Arduino. Um exemplo retirado da página da Biblioteca Arduino referida:

No comments:

Post a Comment