Wednesday 23 August 2017

Cirkulär Glidande Medelvärde


Här är ett helt annat förslag. Jag försökte faktiskt göra det bättre, snarare än mer läsbart. Problemet med din nuvarande kod är att det sammanfattar många nummer om och om igen, när det inte verkligen behövs för båda metoderna efter implementeringskoden. M summerar bara ett gäng för första gången och subtraherar sedan svansen och lägger huvudet igen och igen. Och här är hastighetsprov, jämförelse av fullberäkningsinriktningen mot denna. Eftersom Foo1 är O nm och Foo2 är O Nm det är verkligen inte förvånande att skillnaden är enorm. Resultaten på detta är inte riktigt galen stor skala. Resultaten är lika True. Foo1 5 52 seconds. Foo2 61 1 millisekunder. Och i större skala ersatt 1000 med 10000 på både iterationer och count. Foo1 Stoppades efter 10 minuter. Foo2 6 9 sekunder. En av de viktigaste applikationerna för Arduino-kortet läser och loggar sensordata. Exempelvis övervakar man trycket varje sekund på dagen. Som höga samplingsfrekvenser genererar ofta spikar i graferna en als o vill ha ett medelvärde av mätningarna Eftersom mätningarna inte är statiska i tid, vad vi ofta behöver är ett löpande medelvärde. Detta är medelvärdet av en viss period och mycket värdefull när vi gör trendanalys. Enklaste form av ett löpande medel kan göras Med kod som bygger på tidigare 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 heltalsdomen. Divisionen med 256 i provkoden är en Shift-right 8, vilket är snabbare än säga division med t. ex. 100 Detta ä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 förstås man bör ta hand om det finns ingen mellanliggande överflöd överväga att använda unsigned long. If 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 är den äldsta avlägsnas Det löpande medelvärdet beräknas som summan av alla element dividerat med antalet element i matrisen Koden för löpande medelvärde kommer att vara ungefär så här. Dravback 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 behöver du 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 bygga ett 2-stegs medelvärde kan det nås 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 decouples add och avg funktionen att vara lite mer flexibel t. ex. man kan ringa genomsnittet flera gånger utan att lägga till en sak Vänligen nej Te att varje förekomst av klassen lägger till sin egen matris för att hålla mätningar, och att detta lägger till minnesanvändningen. Gränssnittet i klassen hålls så liten som möjligt. Notera med version 0 2 är namnen på metoderna alla gjorda 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 flottör för att vara Läggs till myRA Sedan skrivs runningAverage ut till seriell port. En kan också visa den på vissa LCD-skärmar eller skicka över Ethernet etc. När 300 objekt läggs till, raderas minRA för att starta om igen. För att använda biblioteket, skapa en mapp i dina SKETCHBOOKPATH-libaries Med namnet RunningAverage och lägg h och där alternativt 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 bort standardkonstruktorn. 2012- - trimValue Yuval Naveh lagt till trim Värde hittat 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 extensively. Template class. RunningAverage h. RunningAverage. I vet att detta kan uppnås med boost per per. Men jag vill verkligen undvika att använda boost jag har googled och inte hittat några lämpliga eller läsbara exempel. Basiskt vill jag spåra det glidande genomsnittet Av en pågående ström av en ström av flytande punktnummer med de senaste 1000 siffrorna som ett dataprov. Vilket är det enklaste sättet att uppnå detta. Jag experimenterade med att använda en cirkulär array, exponentiell glidande medelvärde och ett enklare glidande medelvärde och hittade Att resultaten från den cirkulära gruppen passar mina behov best. asked 12 juni 12 på 4 38. Om dina behov är enkla kan du bara försöka använda ett exponentiellt rörligt medelvärde. Du gör bara en ackumulatorvariabel, och när din kod ser ut Vid varje sam Koden uppdaterar ackumulatorn med det nya värdet. Du väljer en konstant alfa som är mellan 0 och 1 och beräknar detta. Du behöver bara hitta ett värde av alfa där effekten av ett givet prov endast varar för cirka 1000 prover. Hmm, jag är inte säker på att det här är lämpligt för dig nu när jag har lagt det här Problemet är att 1000 är ett ganska långt fönster för ett exponentiellt rörligt medelvärde. Jag är inte säker på att det finns en alfa som skulle sprida genomsnittet över Sista 1000 siffror, utan underflöde i flytpunktsberäkningen Men om du ville ha ett mindre medelvärde, som 30 nummer eller så, är det här ett mycket enkelt och snabbt sätt att göra det. Svarade den 12 juni 12 på 4 44. 1 på ditt inlägg The exponentiell glidande medelvärde kan tillåta alfabet att vara variabel Så här låter det användas för att beräkna tidsbasen medelvärden, t. ex. byte per sekund Om tiden sedan den senaste ackumulatorns uppdatering är mer än 1 sekund, låter du alfa vara 1 0 Annars kan du låta alfa vara usecs sedan senaste uppdatering 1000000 jxh jun 12 12 på 6 21. I grund och botten vill jag spåra det rörliga genomsnittet av en pågående ström av en ström av flytande punktnummer med de senaste 1000 siffrorna som ett dataprov. Notera att nedan uppdaterar summan som element som tillsatt ersatt, vilket undviker dyrt ON-traversal för att beräkna Summa - behövs för genomsnittet - on demand. Total görs en annan parameter från T för att understödja t ex med en lång lång när totalt 1000 lång s, ett int för char s eller en dubbel till totalt float s. This är lite bristfällig I att nummpples kunde gå förbi INTMAX - om du bryr dig att du kan använda en unsigned long long eller använda en extra bool data medlem att spela in när behållaren fylls först medan cykling nummor runt arrayen bäst sedan bytt namn något oskyldigt som pos. answered 12 juni 12 på 5 19.one antar att tomrumsoperatör T-provet är faktiskt tomt operatör T-prov oPless 8 juni 14 på 11 52. oPless ahhh väl spotted egentligen menade jag att det skulle vara tomt operatör T-prov men självklart kan du använda vilken som helst notation du li ked Kommer att fixa, tack Tony D Jun 8 14 på 14 27.

No comments:

Post a Comment