Enkel glidande medelvärde arduino


En av de viktigaste applikationerna för Arduino-kortet är läsning och loggning av sensordata. Till exempel övervakar man trycket varje sekund på dagen. Eftersom höga samplingsfrekvenser ofta genererar spikar i graferna vill man också ha ett genomsnitt av mätningarna. Eftersom mätningarna inte är statiska i tid, så behöver vi ofta ett löpande medelvärde. Detta är medeltiden för en viss period och mycket värdefull när man gör trendanalys. Enklast form av ett löpande medel kan göras med kod som bygger på föregående löpande medelvärde: Om man inte vill använda flytande punktmatematik - eftersom detta tar upp minne och minskar hastigheten - kan man göra detsamma helt i heltalsdomenet. Uppdelningen med 256 i provkoden är en skift-höger 8, vilken är snabbare än att säga division med t. ex. 100. Detta gäller för varje kraft av 2 som delare och en enda måste ta hand om summan av vikterna motsvarar kraften på 2. Och det är självklart att man bör ta hand om det finns inget mellanliggande överskott (överväga att använda osignerade långa) Om du behöver Ett mer exakt löpande medelvärde, i konkreto från de senaste 10 mätningarna, behöver du en array (eller länkad lista) för att hålla dem. Denna array fungerar som en cirkulär buffert och med varje ny mätning avlägsnas den äldsta. Det löpande genomsnittet beräknas som summan av alla element dividerat med antalet element i arrayen. Koden för löpande medelvärde kommer att vara något så här: Nackdelen med den här koden är att matrisen för att hålla alla värden kan bli ganska stor. Om du har en mätning per sekund och du vill ha ett löpande medel per minut behöver du en uppsättning av 60 en genomsnittlig timme skulle behöva en uppsättning av 3600. Det kunde inte göras så här på en Arduino eftersom den bara har 2K RAM. Men genom att bygga ett 2-stegs medelvärde kan det närmar sig ganska bra (ansvarsfriskrivning: inte för alla mätningar). I psuedo-kod: Eftersom en ny intern statisk matris behövs för varje runningAverage-funktion, skriker detta att implementeras som en klass. RunningAverage library Biblioteket runningAverage gör en klass av funktionen ovan så att den kan användas flera gånger i en skiss. Den avvecklar funktionen add () och avg () för att vara lite mer flexibel, t. ex. man kan ringa genomsnittet flera gånger utan att lägga till en sak. Observera att varje instans av klassen lägger till sitt eget array för att hålla mätningar, och att detta lägger till minnesanvändningen. Klassens gränssnitt hålls så liten som möjligt. Obs! Med version 0.2 görs namnen på metoderna mer beskrivande. En liten skiss visar hur den kan användas. En slumpgenerator används för att efterlikna en sensor. I setup () myRA raderas så kan vi börja lägga till nya data. I loop () först genereras ett slumptal och omvandlas till en float som läggs till i minRA. Sedan skrivs runningAverage till serieporten. Man kan också visa den på vissa LCD-skärmar eller skicka över Ethernet etc. När 300 objekt läggs till rensas MyRA för att börja om igen. För att använda biblioteket, skapa en mapp i dina SKETCHBOOKPATHlibaries med namnet RunningAverage och sätt. h och. cpp där. Gör eventuellt en exempels underkatalog för att placera provappen. 2011-01-30: inledande version 2011-02-28: Fixed missing destructor i. h-fil 2011-02-28: borttagen default constructor 2012--. trimValue () Yuval Naveh lagt till trimValue (hittades på webben) 2012-11-21: refactored 2012-12-30: added fillValue () refactored för publicering 2014-07-03: extra minneskyddskod - om intern array inte kan tilldelas storlek blir 0. Det här är att lösa problemet som beskrivs här - forum. arduino. ccindex. phptopic50473.msg1790086msg1790086 - Testa utförligt. Template class RunningAverage. h RunningAverage. cppDetta är en samling rutiner för att utföra matematisk analys av antal arrays. Aktuellt funktionsstöd: Alla funktioner är fullt överbelastade för att stödja följande datatyper: Med undantag för stddev () returnerar de alla samma datatyp som matrisen. En rad int-värden returnerar en enda int. stddev () returnerar alltid en flottör. Alla funktioner utom rullandeAverage () tar två argument. Den första är arrayen som ska fungera på. Den andra är antalet poster i arrayen. rollingAverage () tar ett tredje argument - den nya posten som ska läggas till i arrayen. Rullande medelvärde Format: genomsnittlig rullandeAverage (historikradie, slicecount, value) Lägger till värdet i arrayhistorikraden som ändrar alla värden på en plats. Medelmedelvärdet returneras sedan. Format: medelvärde (array, slicecount) Beräknar medelvärdet av värdena i array. slicecount är antalet poster i arrayen. Format: medelläge (array, slicecount) Finn det vanligaste numret i arrayen. Format: max maximum (array, slicecount) Finns det största värdet i arrayen. Format: min minimum (array, slicecount) Finns det minsta värdet i arrayen. Standardavvikelseformat: avvikelse stddev (array, slicecount) Standardavvikelsen är kvadratroten av medelvärdet av summan av kvadraterna för skillnaden mellan varje datapunkt och medelvärdet för matrisen. Det här är den enda funktionen som inte returnerar samma datatyp som matrisen. Standardavvikelsen returneras alltid som en float. I arbetar på en mobilrobot som styrs via en trådlös 2,4 GHz-länk. Mottagaren är ansluten till Arduino Uno som fungerar som huvudkontroller. Den mest kritiska (och huvud) ingångskanalen som kommer från mottagaren ger en mycket högljudd signal, vilket leder till många mindre förändringar i utgången från manöverdon, även om dessa inte behövs. Jag letar efter bibliotek som kan utföra effektiv utjämning. Finns det några signalutjämningsbibliotek tillgängliga för Arduino (Uno) frågade 16 feb 14 kl 13:57 Jag tror att jag ser en hel del singelprov buller i din högljudda signal. Medianfiltret gör det bättre att bli av med enstaka ljudspikar än något linjärt filter. (Det är bättre än något lågpassfilter, glidande medelvärde, viktat glidande medelvärde etc. med avseende på dess svarstid och dess förmåga att ignorera sådana exemplar av enstaka ljudstrålar). Det finns faktiskt många signalutjämningsbibliotek för Arduino, varav många inkluderar ett medianfilter. signalutjämningsbibliotek på arduino. cc: Signalutjämningsbibliotek på github: Skulle något liknande fungera i din robot (Median-of-3 kräver mycket liten CPU-kraft och därmed snabb): Du kan filtrera detta digitalt med en låg passfilter: Ändra 0.99 för att ändra avstängningsfrekvensen (närmare 1,0 är lägre frekvens). Det faktiska uttrycket för det värdet är exp (-2piff) där f är cutoff frekvensen du vill och fs är den frekvens data samplas på. En annan typ av digitalt filter är ett händelsefilter. Det fungerar bra på data som har outliers t. ex. 9,9,8,10,9,25,9. Ett händelsefilter returnerar det vanligaste värdet. Statistiskt är det här läget. Statistiska medelvärden som medelvärde, läge etc. kan beräknas med hjälp av Arduino Average Library. Ett exempel som tas från Arduino-bibliotekssidan hänvisas till:

Comments