Viktat glidande medelvärde arduino


En av de viktigaste applikationerna för Arduino-kortet är läsning och loggning av sensordata. Exempelvis övervakar man trycket varje sekund av dagen. Eftersom höga samplingsfrekvenser ofta genererar spikar i diagrammen, vill man också ha ett genomsnitt av mätningarna. Eftersom mätningarna är inte statisk i tid Det som vi ofta behöver är ett löpande medelvärde. Det här är genomsnittet av en viss period och mycket värdefull när vi gör trendanalys. Enklaste form av ett löpande medelvärde kan göras med kod som bygger på tidigare löpande medelvärde. Om man inte gör det T vill använda flytande punktmatematik - eftersom detta tar upp minne och sänker hastigheten - man kan göra detsamma helt i heltalsdomen. Divisionen med 256 i provkoden är en shift-right 8, vilket är snabbare än att säga division av t. ex. 100 Det här är sant för varje kraft av 2 som delare och en måste bara ta hand om summan av vikterna är lika med kraften av 2 Och det är självklart att man bör ta hand om det finns inget mellanliggande överskott överväga att använda unsigned long. If y du behöver ett mer exakt löpande medelvärde, i konkreto från de senaste 10 mätningarna, behöver du en matris eller länkad lista för att hålla dem. Denna matris 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 matrisen Koden för löpande medelvärdet kommer att vara något som här. Drawback av denna kod ä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 du behöver en uppsättning av 60 i genomsnitt per timme skulle behöva en uppsättning av 3600 Det kunde inte bli gjort så här på en Arduino eftersom det bara har 2K RAM men genom att bygga ett 2-stegs medelvärde kan det närmas ganska bra ansvarsfriskrivning inte för alla mätningar I psuedo code. As en ny intern statisk matris behövs för varje runningAverage-funktion, skriker detta för att implementeras som en klass. RunningAverage-biblioteket. RunAverage-biblioteket gör en klass Av funktionen ovan så att den kan användas flera gånger i en skiss Det avvecklar tillägget och avg-funktionen för att vara lite mer flexibel, t ex man kan ringa medelvärdet flera gånger utan att lägga till en sak. Observera att varje förekomst av klassen lägger till dess egen matris för att hålla mätningar, och att detta bidrar till minnesanvändningen Klassens gränssnitt hålls så liten som möjligt. Notera med version 0 2 görs namnen på metoderna mer beskrivande. En liten skiss visar hur det kan användas En slumpgenerator används för att efterlikna en sensor. I inställningen rensas myRA så att vi kan 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 Seriell port En kan också visa den på vissa LCD-skärmar eller skicka över Ethernet osv. När 300 poster läggs till rensas MyRA för att börja om igen. För att använda biblioteket, skapa en mapp i dina SKETCHBOOKPATH-libarier med namnet RunningAverage och sätt h och Där opt jonellt skapa en exemplar underkatalog för att placera provet app.2011-01-30 första versionen 2011-02-28 fixad saknad destructor i h file.2011-02-28 borttagen default constructor.2012- - trimValue Yuval Naveh lagt till trimValue hittades på web.2012-11-21 refactored.2012-12-30 added fillValue refactored for publishing.2014-07-03 lagt till minneskyddskod - om intern array inte kan tilldelas storlek blir 0 Detta är för att lösa problemet som beskrivs här. Test i stor utsträckning. Template class. RunningAverage h. RunningAverage. I arbetar på en mobilrobot som styrs via en trådlös 2 4 GHz-mottagare är ansluten till Arduino Uno som tjänstgör ombord som huvudkontroller. Den viktigaste och viktigaste ingångskanalen som kommer från mottagaren ger en mycket bullrig signal, vilket leder till många mindre förändringar i aktuatorernas utgång, även om det 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. asked Feb 16 14 på 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 ljudstrålar än något linjärt filter. Det är bättre än något lågpassfilter, som rör sig 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 i själva verket många signalutjämningsbibliotek för Arduino, varav många inkluderar ett medianfilter. signal - Mjölkande bibliotek på. signal-utjämning bibliotek på github. Vill något liknande det här arbetet i din robot Median-of-3 kräver mycket liten CPU-effekt och därmed snabb. Du kan filtrera detta digitalt med ett lågpassfilter. Ändra 0 99 för att ändra avskurningsfrekvensen närmare 1 0 är lägre frekvens. Det faktiska uttrycket för det värdet är exp -2 pi f fs där f är cutofffrekvensen du vill och fs är den frekvens som data samplas på. En annan typ av digital 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 mest frekventa värdet Statistiskt är det här läget. Statistiska medelvärden som Mean, Mode etc kan beräknas med hjälp av Arduino Average Library. Ett exempel tagen Från Arduino Library-sidan som refereras till. Detta är en samling rutiner för att utföra matematisk analys av arrayer av nummer. Aktuell funktionstö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 array En array av int värden returnerar en enda int stddev returnerar alltid en float. All funktionerna utom rullandeAverage tar två argument Den första är arrayen att arbeta på Den andra är antalet poster i array rollingAverage tar en tredjedel Argument - den nya posten som ska läggas till i array. Rolling average. Format genomsnittlig rollingAverage historyarray, slicecount, value. Adds värdet till array historyraray förskjuter alla värden ner en plats Medelvärdet är t Hönan returneras. Format genomsnittlig medelvärde array, slicecount. Calculates medelvärdet av värdena i array slicecount är antalet poster i array. Format medelläge array, slicecount. Finds det vanligaste numret i array. Format max maximum array, Slicecount. Finds det största värdet i array. Format min minimum array, slicecount. Finds det minsta värdet i array. Standard Deviation. Format avvikelse stddev array, slicecount. The standardavvikelsen är kvadratroten av medelvärdet av summan av Kvadrater av skillnaden mellan varje datapunkt och medelvärdet för matrisen. Detta är den enda funktionen som inte returnerar samma datatyp som matrisen. Standardavvikelsen returneras alltid som en float.

Comments