Tuesday 28 November 2017

Arduino Moving Average Library


Estou trabalhando em um robô móvel controlado através de um link wireless 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) vindo do receptor produz um sinal muito ruidoso, o que leva a muitas pequenas alterações na saída dos atuadores, mesmo que estes não sejam necessários. Estou procurando bibliotecas que podem executar alisamento eficiente. Existe algum sinal de suavização bibliotecas disponíveis para o Arduino (Uno) pediu Feb 16 14 às 13:57 Eu acho que eu vejo um monte de picos de ruído de amostra única em seu sinal ruidoso. O filtro mediano faz melhor em se livrar de picos de ruído de amostra única do que qualquer filtro linear. (É melhor do que qualquer filtro passa-baixo, média móvel, média móvel ponderada, etc., em termos de tempo de resposta e sua capacidade de ignorar tais outliers de pico de ruído de uma única amostra). Existem, de fato, muitas bibliotecas de suavização de sinais para o Arduino, muitas das quais incluem um filtro mediano. Bibliotecas de suavização de sinal em arduino. cc: bibliotecas de suavização de sinal em github: Alguma coisa como isto funcionaria em seu robô (A mediana de 3 requer muito pouco poder de CPU e, portanto, rápido): Você poderia filtrar isso digitalmente usando um baixo Passa filtro: Alterar o 0,99 para alterar a freqüência de corte (mais perto de 1,0 é menor freqüência). A expressão real para esse valor é exp (-2piffs) onde f é a freqüência de corte que você deseja e fs é a freqüência em que os dados são amostrados. Outro tipo de filtro digital é um filtro de eventos. Funciona bem em dados que têm outliers, e. 9,9,8,10,9,25,9. Um filtro de eventos retorna o valor mais freqüente. Estatisticamente, este é o modo. Médias estatísticas, como Média, Modo etc. podem ser calculadas usando a Biblioteca Média Arduino. Um exemplo tirado da página da Biblioteca do Arduino refere-se a: Uma das principais aplicações para a placa Arduino é a leitura e registro de dados de sensores. Por exemplo, um monitora a pressão a cada segundo do dia. Como altas taxas de amostragem muitas vezes gera picos nos gráficos também se deseja ter uma média das medições. Como as medições não são estáticas no tempo o que muitas vezes precisamos é de uma média de corrida. 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 um código que se baseia na média anterior: 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. A divisão por 256 no código de exemplo é um deslocamento-direito 8, que é mais rápido do que a divisão por e. 100. Isto é verdade para cada poder de 2 como divisor e um só deve ter cuidado a soma dos pesos é igual ao poder de 2. E, claro, deve-se ter cuidado não há transbordamento intermediário (considere usar unsigned long) Se você precisar Uma média de execução mais precisa, in concreto das últimas 10 medições, você precisa de uma matriz (ou lista vinculada) para mantê-los. Esta matriz age como um buffer circular e com cada nova medição a mais antiga é removida. A média de execução é calculada como a soma de todos os elementos dividida pelo número de elementos na matriz. O código para a média em execução será algo como isto: Desvantagem deste código é que a matriz para armazenar todos os valores pode se tornar bastante 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 precisaria de uma matriz de 3600. Isso não poderia ser feito desta maneira em um Arduino, pois 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). 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 cria uma classe da função acima para que ela possa ser usada várias vezes em um sketch. Desacopla a função add () e avg () para ser um pouco mais flexível, e. Um pode chamar a média várias vezes sem adicionar uma coisa. Observe 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 o menor 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. Em setup () 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 a ser adicionado ao myRA. Em seguida, o runningAverage é impresso para a porta serial. Um também poderia exibi-lo em algum LCD ou enviar mais ethernet, etc Quando 300 itens são adicionados myRA é limpo para começar tudo de novo. Para usar a biblioteca, crie uma pasta em seu SKETCHBOOKPATHlibaries com o nome RunningAverage e coloque o. h e. cpp lá. Opcionalmente, faça um subdiretório de exemplos para colocar o aplicativo de amostra. 2011-01-30: versão inicial 2011-02-28: fixo destruidor em falta no arquivo. h 2011-02-28: construtor padrão removido 2012--. Adicionado fillValue () refactored para publicação 2014-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 aqui - forum. arduino. ccindex. phptopic50473.msg1790086msg1790086 - Teste extensivamente. Classe de modelo RunningAverage. h RunningAverage. cppEsta é uma coleção de rotinas para executar a análise matemática de matrizes de números. Suporte à função atual: Todas as funções estão totalmente sobrecarregadas para suportar os seguintes tipos de dados: Com a exceção de stddev (), todos 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. A primeira é a matriz para trabalhar. O segundo é o número de entradas na matriz. RollingAverage () assume um terceiro argumento - a nova entrada para adicionar à matriz. Rolling average Formato: average rollingAverage (historyarray, slicecount, value) Adiciona valor à matriz historyarray deslocando todos os valores para baixo um lugar. A média da média é então devolvida. Formato: média média (array, slicecount) Calcula a média média dos valores no array. Slicecount é o número de entradas na matriz. Formato: modo médio (array, slicecount) Localiza o número mais comum na matriz. Formato: máximo máximo (matriz, slicecount) Localiza o maior valor na matriz. Formato: min mínimo (array, slicecount) Localiza o menor valor na matriz. Desvio Padrão Formato: desvio stddev (array, slicecount) O desvio padrão é a raiz quadrada da média da soma dos quadrados da diferença entre cada ponto de dados ea média da média da matriz. Esta é a única função que não retorna o mesmo tipo de dados como a matriz. O desvio padrão é sempre retornado como um flutuador.

No comments:

Post a Comment