Monday 28 August 2017

Microcontrolador De Média Filtro Móvel


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 de classe RunningAverage. h RunningAverage. cppForum: Digital Signalverarbeitung DSP MOVING FILTRO MÉDIO em FastAVR Dim index como byte dim value (4) como byte dim average como word dim count como byte index 1 39arrays in bascom beginnen mit 1 :-( do value ( Índice) getadc (x) 39messen incr índice se índice 5 então índice 1 para contagem 1 a 4 valor médio médio (contagem) turno seguinte média, direita, 2 39geht schneller als 4 loop Fastavr wird ja nicht sooo viel anders sein. Anstatt do - O Dann mach es doch so wie mein Beispiel (nur ohne den Fehler média bis ins unendliche hochzuaddieren -)), nur da derzzte Mittelwert den ltesten Wert des arrays ersetzt : Fazer incr índice índice (índice) getadc (x) 39messen valor (índice-1) média se índice 5 então índice 1 média 0 para contagem 1 a 4 média valor médio (contagem) turno seguinte média, direita, 2 39geht schneller als 4 Loop Noch ne Idee zum gltten, ev. Etwas trge: - Wert messen als Anfang Dann immer: - neu Wert messen Wert (3Wert neuer Wert) 4 nur falls es noch einen interessiert. Soweit ich die bisherigen Varianten hier berblickt habe, wird immer die Summe fr den Mittelwert ausgewertet. Das macht diese Methoden aber langsamer mit steigernder Fensterlnge. Nachdem der Mittelwert linear ist, kann ich die Summe auch einfach zerlegen und spare mir, então jedesmal die Summe auszuwerten. Define WindowSize 4 int samplesWindowSize int index 0 int média 0 enquanto (1) Alten Wert abziehen. Média - samplesindex Neuen Wert zufgen. Inputindex input WindowSize Neuen Mittelwert bilden. Amostra média de índice Im Ringbuffer weiterstellen index index WindowSize Der Code ist keinesfalls quotoptimalquot, sondern sollte nur die Funktionsweise demonstrieren. Desweiteren muss man bei diesem Verfahren morre Rundungsfehler beachten, d. h. Bei Benutzung von Integer-Arithmetik ist der gewonnene Mittelwert etwas ungenauer. Autor: Martin Datum: 02.05.2009 03:29 mal ein ganz anderer Ansatz: Warum erhhst Du nicht einfach die Amostragem-Zeit am AD-Wandler. Somit hast Du ein Hardware-Moving-Average-Filter Nimm einfach ne viermal so hohe Samplingrate, ist das gleiche, wie wenn Dein AD-Wandler vier Werte aufnimmt und Du Sie dann wieder mittelst (Ok. Gesame Sampling - und Convert - Zeit betrachten) ) Die vier Einzelwerte interessieren Dich ja eh nicht und die Werte die der AD-Wandler liefert werden auch besser (Im Datenblatt des AD-Wandlers drfte auch ne Formel fr die Mindest-Sample-Zeit angegeben sein). Nur, então, ein Gedanke. Mal ein ganz anderer Ansatz: Warum erhhst Du nicht einfach die Sampling-Zeit am AD-Wandler. Somit hast Du ein Hardware-Moving-Average-Filter N, então o homem do chapéu é melhor que Falle eine Unterabtastung. Wenn man vor dem ADC Eingang noch einen RC-Tiefpass mit passender Grenzfrequenz setzt dann wird ein Schuh draus. Ohne diesen schlgt die SampleampHoldstufe des ADCs zu, wir reden ja vom AVR. Indicar o índice 1.5 ADC Takte um das Eingangssignal zu sampeln. Antwort schreiben Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail ber Antworten auf Ihren Beitrag informiert werden mchten, melden Sie sich bitte an. Wichtige Regeln - erst lesen, dann posten Gro - und Kleinschreibung verwenden Lngeren Sourcecode nicht im Texto einfgen, sondern als Dateianhang Formatierung (mehr Informationen.) CC-Codec avrasmAVR-Assembler-Codeavrasm códigoCódigo em anderen Sprachen, ASCII-Zeichnungencode mathFormel em LaTeX-Syntaxmath Titel - Link zu Artikel Verweis auf anderen Beitrag einfgen: Rechtsklick auf Beitragstitel, Adresse kopieren, und in den Texto einfgen

No comments:

Post a Comment