Wednesday 27 December 2017

C glidande medelvärde algoritm


Jag vet att detta kan uppnås med boost som per. Men jag vill verkligen undvika att använda boost jag har googled och inte hittat några lämpliga eller läsbara exempel. 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 Använder de senaste 1000 siffrorna som ett dataprov. Vilket är det enklaste sättet att uppnå detta. Jag experimenterade med att använda ett cirkulärt array, exponentiellt glidande medelvärde och ett enklare glidande medelvärde och fann att resultaten från den cirkulära gruppen passade mina behov bäst. asked jun 12 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 tittar på varje prov uppdaterar koden ackumulatorn med nytt värde 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 visst prov endast varar för cirka 1000 prov. Hmm, jag är inte säker på att det här är Lämplig för dig, nu t Hat jag har lagt den 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 de senaste 1000 talen utan underflöde i flytpunktsberäkningen. Men om du ville ha ett mindre medelvärde, som 30 nummer eller så, det här ä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 Det exponentiella glidande medlet kan låta alfabetet vara variabelt Så det tillåter det Används för att beräkna tidsbasen medelvärden, t. ex. bytes per sekund Om tiden sedan den senaste ackumulatoruppdateringen är mer än 1 sekund, låter du alpha vara 1 0 Annars kan du låta alfa vara usecs sedan senaste uppdateringen 1000000 jxh jun 12 12 vid 6 21.Basiskt vill jag spåra det rörliga genomsnittet av en pågående ström av en ström med flytande punktnummer med de senaste 1000 siffrorna som ett dataprov. Notera att nedanstående uppdaterar summan som element som tillsatt ersatt, så att kostsamma ON-traverser beräknas Summan - behövs för th e genomsnitt - on demand. Total görs en annan parameter från T för att stödja t. ex. genom att använda en lång lång när totalt 1000 lång s, en int för char s eller en dubbel till total float s. This är lite felaktig 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 cykel nummor runt arrayen bäst sedan bytt namn på något oskadd som pos. answered 12 juni 12 på 5 19.an antar att tomrumsoperatör T-provet är faktiskt tomt operatör T-prov oPlats den 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 anteckning du helst vill fixa, tack Tony D Jun 8 14 på 14 27. Det är möjligt att genomföra ett glidande medelvärde i C utan att det behövs ett fönster på prov. Jag har funnit att jag kan optimera lite, genom att välja en fönsterstorlek som motsvarar två till två Tillåta bitskiftning istället för att dela men inte behöv en buf Fer skulle vara trevligt Finns det ett sätt att uttrycka ett nytt glidande medelresultat endast som en funktion av det gamla resultatet och det nya provet. Ange ett exempel på glidande medelvärde, över ett fönster med 4 prov att vara. Lägg till nytt prov eA glidande medelburk Implementeras rekursivt men för en exakt beräkning av det rörliga genomsnittsvärdet måste du komma ihåg det äldsta inmatningsexemplet i summan, dvs a i ditt exempel. För ett längd N glidande medelvärde beräknar du. Där yn är utsignalen och xn är ingången Signalen Eq 1 kan skrivas rekursivt som. Därför behöver du alltid komma ihåg provet x nN för att beräkna 2. Som påpekat av Conrad Turner kan du använda ett oändligt långt exponentialfönster istället, vilket gör det möjligt att beräkna endast utgången Från tidigare utdata och nuvarande input. but detta är inte ett vanligt obetydligt glidande medelvärde, men ett exponentiellt vägt glidmedel, där proverna tidigare har en mindre vikt, men åtminstone teoretiskt glömmer du aldrig någonting vikterna jus t bli mindre och mindre för prover långt tidigare. Jag implementerade ett glidande medelvärde utan individuellt objektminne för ett GPS-spårprogram som jag skrev. Jag börjar med 1 prov och dela med 1 för att få nuvarande avg. I lägger sedan till ett exempel och Dela med 2 till den nuvarande avg. This fortsätter tills jag kommer till längden av genomsnittet. Varje gång efteråt lägger jag till i det nya provet, får medelvärdet och tar bort det genomsnittet från summan. Jag är inte en matematiker men det här verkade som ett bra sätt att göra det Jag tänkte att det skulle vända på en riktig matte kille, men det visar sig att det är ett av de accepterade sätten att göra det Och det fungerar bra Kom bara ihåg att ju högre längden desto långsammare är det Följer vad du vill följa Det kan inte ha betydelse för det mesta, men när du följer satelliter, om du är långsam, kan spåret vara långt ifrån den verkliga positionen och det kommer att se dåligt ut. Du kan ha ett mellanrum mellan mitten och de efterföljande punkterna Jag valde en längd på 15 uppdaterad 6 gånger per minut för att få ade quate utjämning och inte komma för långt från den faktiska sattspositionen med de släta spårpunkterna. svarade 16 november 16 vid 23 03.initialisera totalt 0, räkna 0 varje gång vi ser ett nytt värde. Då en inmatnings-scanf, lägger man till totalt nyttValue, en inkrement räkna, en dela genomsnittlig totalräkning. Detta skulle vara ett glidande medelvärde över alla inmatningar. För att beräkna genomsnittet över endast de senaste 4 ingångarna, skulle kräva 4 inputvariables, kanske kopiering varje ingång till en äldre ingångsvariabel och sedan beräkna det nya glidande medeltalet som summan av de 4 ingångsvariablerna dividerat med 4 högerskift 2 skulle vara bra om alla ingångar var positiva för att göra den genomsnittliga beräkningen. svarade 3 februari kl. 04 06. Det kommer faktiskt att beräkna det totala genomsnittet och INTE det glidande medeltalet som räknas blir större påverkan av något nytt insamlingsprov blir försvinnande liten Hilmar 3 februari kl 13 på 13 53. Ditt svar.2017 Stack Exchange, Inc. C-algoritm för exponentialrörelse med noll-latens. Last Modified 2012-08-13.I ve been Försöker genomföra en lågfrekvens cutoff i c som i huvudsak tar en ström av siffror och släpper ut utgången som filtrerar ut högfrekvent rörelsejitter, men det är viktigt att de främre viktiga numren anses omedelbart eftersom data är tidskritisk att det är att styra en rörelsesimuleringsbas med användning av utmatning från lite spelprogramvara Jag har en arbetsviktad glidande genomsnittlig algoitm men kunde göra med något lite mer responsivt i frontänden, och jag hittade det här. Pseudokoden finns som följer. Inmatningar Pris NumericSeries, Period NumericSimple Variabler faktor 0, lag 0.if CurrentBar 1 börja ZLEMA Prisfaktor 2 Period 1 lag Period-1 2 slut annars börja ZLEMA faktor 2 Pris-prislag 1 faktor ZLEMA 1 end. I har översatt den till C och min kod är som följer. Men det verkar inte som att jag beter sig som jag förväntar mig. Det verkar vara nästan där men ibland får jag ett något lägre värde än alla saker i köen när de är alla högre. Min kö och antalet artiklar i det skickas som parametrar, med den senaste som alltid framgår, passerar jag också en inkrementell räknare som börjar vid 0 som krävs av funktionen. Jag är inte säker på att jag har tolkat betydelsen av ZLEMA 1 korrekt eftersom det inte är klart i sin pseudokod, så jag antog att detta var det sista samtalet s zlema och jag antar även Pris betyder faktiskt Pris 0 Kanske har jag det här fel. Jag skulle kopiera de faktiska zlemaberäknade värdena tillbaka till min ursprungliga kö innan nästa samtal jag inte byter originalkö på alla andra än att bara byta alla värden ett till slutet och sätta in det senaste i början Koden som jag använder för att göra detta är. Var extremt tacksam om någon med bättre förståelse för Matematik kan snälla se till att jag förstår det här för att se om jag har någonting något fel. Tack så mycket i förväg om du kan hjälpa. Först tack alla för din insats, mycket uppskattad. Det är vettigt att jag antar, så jag antar då det bästa Jag kan hoppas på är helt enkelt en expone ntial glidande medelvärde accepterar det kommer att vara en liten fördröjning men detta kommer att minimeras av tyngre frontvikt än vad som anges i typiskt vägd glidande medelvärde. Jag har även denna algoritm men ett liknande problem med att värdena inte verkar rätt korrekta om inte detta är typen av formeln. For exempel, säg att mitt sortiment innehåller 16 värden, alla 0 4775 - utgången är 0 4983, men jag förväntar mig att den ska vara 0 4775.Jag ser det här rätt ut för dig. Exponentiell Flyttande medelflöde ema floatvals, int numVals, int currentSample statisk floatfaktor 0 statisk float lastema 0 float ema. if currentSample 1 ema vals 0 faktor 2 0 float numVals 1 0 andra ema factor vals 0 1 0 - faktor lastema lastema ema. returnera ema Omvänt är utsignalen ibland lägre än var och en av ingångarna, även om alla är högre. Det heter på samma sätt som zlema ovan, med en inkrementell räknare Formeln och pseudokoden för den här är här - Tack igen, ursäkta för mitt missförstånd om några av grunderna Vänliga hälsningar, Chris J. As för koden jag skrev upp, har du rätt om matrisstorleken. Det bör lätt lösas. För dina frågor.1 Filterkonstanten representerar en frekvensavbrott Jag använde en Digital Signal Processing DSP för den här tekniken. Ki Low-pass sfilter är en enkel förklaring. Du vill ha sektionen för diskret tid. I mitt fall är A den RC-Constant som de talar om. Så den frekvens som den skär ut är över 1 2 pi A Om du inte har en förståelse för frekvensdomänteori kan detta bli komplicerat. I ditt fall Ju högre du gör A desto lägre frekvens kommer det här filtret att tillåta, vilket betyder att det kommer att släta ut kurvan mer och mer Ju lägre du gör det desto mer buller tillåts i systemet. Kom ihåg att A måste vara större än eller lika med 1 för att vara effektiv. Jag satte tillbaka XLS igen, den här gången utan att ändra randnummer. Justera A-konstanten och titta på hur det släpper ut eller filtrerar bort högfrekvensvariationerna.2 Den sista punkten i ingångsarrayen har det senaste värdet.3 Detsamma gäller för utmatningsraden Den sista är det senaste värdet.5 NUMVALS är godtyckligt Du kan kontinuerligt lägg till i inmatnings - och utmatningsfältet så många gånger du vill, och det skulle inte påverka filtret. I synnerhet använde jag 49 poäng. Men jag kan enkelt ta bort de senaste 20 och de första 29 utgångarna skulle förbli densamma. Funktionen är inte Baserat på hur många poäng som används. Jag skulle vilja för att nämna att jag utvecklade denna funktion för en engångsomsättning Om du ville göra en omvandling till nästa värde i flygningen kunde du försöka något enklare som bifogat igen jag är rostig på c Jag hoppas att det här är rätt Det enda du skulle ha Behöver leverera är ingången och filtret konstant. Låt mig veta om detta hjälper.

No comments:

Post a Comment