Saturday 5 August 2017

Glidande Medelvärde Utan Lagring Värden


Jag försöker hitta ett sätt att beräkna ett rörligt kumulativt medel utan att lagra räkningen och den totala data som hittills har tagits emot. Jag kom fram med två algoritmer men båda måste lagra count. new genomsnittet gamla räkna gamla data nästa data nästa räkning. New genomsnittligt gammalt medelvärde nästa data - gammalt medelvärde nästa count. The problem med dessa metoder är att räkningen blir större och större vilket resulterar i att man förlorar precision i det resulterande genomsnittet. Den första metoden använder det gamla räknet och nästa räkning som uppenbarligen är 1 från varandra Det här fick mig att tänka på att det kanske finns ett sätt att ta bort räkningen, men tyvärr har jag inte hittat det än. Det fick mig lite längre men resulterade i den andra metoden men fortfarande räknas är närvarande. Är det möjligt, eller är jag bara söker efter det omöjliga. asked Sep 28 12 på 8 46.På tiden utvecklar jag ett grafiskt LCD-system för att visa temperaturer, flöden, spänningar, kraft och energi i ett värmepumpsystem. Användningen av en grafisk LCD-skärm betyder att hälften av min SRAM och .75 av min flash ha har använts av en skärmbuffert och strängar. Jag visar för närvarande mina maxmedelvärden för energi Vid midnatt när den dagliga siffran återställs kontrollerar systemet om förbrukningen för dagen är över eller under föregående minimum eller maximalt, och butikerna värdet Medelvärdet beräknas genom att dividera den kumulativa energiförbrukningen med antalet dagar. Jag skulle vilja visa det dagliga genomsnittet under den senaste veckan och månaden 4 veckor för enkelhet, dvs rullande medelvärde. För närvarande innebär det att man behåller en uppsättning värden för den sista 28 dagar och beräkna ett genomsnitt över hela matrisen för månadsvisa och sista 7 dagar för varje vecka. Först gjorde jag det här med en uppsättning floats eftersom energin är i form 12 12 kWh, men det användes 28 4 byte 112 byte 5 4 Av SRAM Jag tänker inte ha en enda decimalpunkt, så jag bytte till att använda uint16t och multiplicera siffran med 100. Det betyder att 12 12 är representerad som 1212 och jag delar upp med 100 för visningsändamål s. Arrayens storlek är nu nere till 56 byte mycket bättre. Det finns inget triviellt sätt att minska figuren ner till en uint8t som jag kan se jag kunde tolerera förlusten av en decimal 12 1kWh istället för 12 12kWh, men konsumtionen är ofta högre än 25 5kWh 255 är det högsta värdet representerat av ett 8-bitars usignerat heltal Förbrukningen har aldrig varit under 10 0kWh eller över 35 0kWh, så tänkbart kunde jag subtrahera 10 från de lagrade siffrorna, men jag vet att vi en dag kommer att överstiga dessa gränser. Jag testade sedan koden för att pakka 9-bitars värden i en array. Detta ger ett intervall på 0-51 2kWh och använder totalt 32 byte. Det är dock ganska långsamt att få tillgång till en array så här, särskilt när man måste iterera över alla värden för att beräkna ett genomsnitt. Så min fråga är - finns det ett effektivare sätt att beräkna ett glidande medelvärde med tre fönster - livslängd, 28 dagar och 7 dagar. Effektivitet betyder mindre när det gäller SRAM-användning, men utan straff på enorma Kod Kan jag undvika att lagra alla värden ar 7 14 på 8 32. Jag har tänkt och du har rätt Så det gör tekniskt mitt svar felaktigt Jag investerar lite mer tid och tålamod i det. Kanske någonting ur lådan ska jag låta dig veta om jag kommer på något Vi gör något så här mycket på min arbetsplats Låt mig fråga dig Tyvärr om förvirringen Aditya Somani Mar 8 14 på 17 15. finns det ett effektivare sätt att beräkna ett glidande medelvärde med 28 dagar och 7 dagar som behöver komma ihåg 27 dagars historia . Du kan få nära nog att lagra 11 värden i stället för 28 värden, kanske något liknande. Med andra ord, istället för att lagra varje detalj varje dag under de senaste 27 dagarna, en butik 7 eller så värden av detaljerad daglig information för de senaste 7 eller så dagar och även b lagra 4 eller så sammanfattade värden av total eller genomsnittlig information för var och en av de senaste 4 eller så veckorna. En av huvudapplikationerna för Arduino-kortet är läsning och loggning av sensordata. Exempelvis övervakar man trycket varje gång andra dagen lika hög samp le-frekvenser genererar ofta spikar i diagrammen. Man vill 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 medelvärdet av 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å det tidigare löpande genomsnittet. Om man inte vill använda flytande punktmatematik - eftersom detta tar upp minne och minskar hastigheten - kan man göra detsamma helt i heltalsdomen. delning med 256 i provkoden är en skift-rätt 8, vilket är snabbare än säga division med t ex 100 Detta gäller för varje kraft av 2 som delare och en måste bara ta hand om summan av vikterna är lika med kraften i 2 och självklart bör man ta hand om det finns inget 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 avlägsnas den äldsta. Körningsgenomsnittet 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 så här. Bakgrunden till denna kod är att Array för att hålla alla värden kan bli ganska stora 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 som inte kunde göras på detta sätt på en Arduino eftersom det bara har 2K RAM Men genom att bygga ett 2-stegs medelvärde kan det närma sig 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, kommer detta skrik att implementeras som en klass. RunningAverage library. The runningAverage-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 av radera 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. Gränssnittet i klassen hålls så liten som möjligt. Notera med version 0 2 namnen på metoderna är 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 är ett slumptal först ett slumptal genereras och konverteras till en float som ska läggas till i minRAA. Sedan körs runningAverage ut till seriell port. En kan också visa den på vissa LCD-skivor eller skicka över Ethernet etc. När 300 objekt läggs till, raderas minRA 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 alternativet 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 standard 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.

No comments:

Post a Comment