Är det möjligt att implementera ett glidande medelvärde i C utan att det behövs ett fönster av prover. Jag har funnit att jag kan optimera lite, genom att välja en fönsterstorlek som är en kraft av två för att tillåta bitskiftning istället för att dela men Inte behöva en buffert 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 rörande medelvärde, över ett fönster på 4 prover att vara. Lägg till nytt prov eA Glidande medelvärde kan implementeras rekursivt men för en exakt beräkning av glidande medelvärde måste du komma ihåg det äldsta inmatningsprovet 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ångssignalen Eq 1 kan skrivas rekursivt som. Så du behöver alltid komma ihåg provet x nN för att beräkna 2. Som påpekad av Conrad Turner kan du använda ett oändligt långt exponentialfönster istället, vilket gör att du kan beräkna Utgången endast från det förflutna ut Put och nuvarande input. but detta är inte ett vanligt obetydligt glidande medelvärde, men ett exponentiellt vägat glidande medelvärde, där prov i det förflutna får en mindre vikt, men åtminstone teoretiskt glömmer du aldrig någonting, vikterna blir bara mindre och mindre för Prover långt ifrån. Jag genomförde ett glidande medelvärde utan individuellt objektminne för ett GPS-spårningsprogram 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 delar upp med 2 till Nuvarande avg. This fortsätter tills jag når längden på 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 matematiker men det verkade som ett bra sätt att Gör det jag trodde 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 ihåg att ju högre längden desto långsammare följer det du vill följa Det kan inte ha betydelse för det mesta Tiden, men när du följer satelliter, kan du vara långsiktig om du är långsam, 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 uppdaterade 6 gånger per minut för att Få tillräcklig utjämning och inte komma för långt från den faktiska lätta positionen 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 inmatningsscannf, lägger man till totalt nyttValue, Ett inkrementstal, en dela upp genomsnittlig totalräkning. Detta skulle vara ett glidande medelvärde för alla inmatningar. För att beräkna medelvärdet över endast de senaste 4 ingångarna, skulle det behöva 4 ingångsvariabler, kanske kopiering av varje ingång till en äldre ingångsvariabel och sedan beräkning av den nya rörelsen Genomsnittet som summan av de fyra 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. 15 06. Det kommer faktiskt att beräkna det totala genomsnittet och INTE det glidande medlet som Räkna få S större påverkan av något nytt ingångsprov blir vanishingly liten Hilmar Feb 3 15 på 13 53. Ditt svar.2017 Stack Exchange, Inc. 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 hitta några lämpliga eller läsbara exempel. Basiskt 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 numren som ett dataprov. Vilket är det enklaste sättet att uppnå detta. 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. Skakad 12/12 12 på 4 38. Om dina behov är enkla kan du bara försöka använda en Exponentiell glidande medelvärde. Du gör helt enkelt en ackumulatorvariabel och när din kod tittar på varje prov uppdaterar koden 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 Att hitta ett värde av a Lpha där effekten av ett givet prov endast varar för cirka 1000 prov. Hmm, jag är inte säker på att det här är lämpligt för dig, nu när 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 siffrorna, 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 It. answered 12 juni 12 på 4 44. 1 på ditt inlägg Det exponentiella glidande medlet kan tillåta alfabet att vara variabelt Så här gör det att det kan 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 alpha vara 1 0 Annars kan du låta alfa vara usecs sedan senaste uppdateringen 1000000 jxh Jun 12 12 på 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 hjälp av De senaste 1000 siffrorna som ett dataprov E att nedanstående uppdaterar summan som element som tillsatt ersatt, för att undvika kostsam ON-traversering för att beräkna summan som behövs för genomsnittet - på begäran. Totala görs en annan parameter från T för att stödja t ex med en lång längd när det sammanlagda 1000 lång s , En int för char s eller en dubbel till total float s. Det här är lite fel i att numsamples kan 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 cykeltalsprover runt arrayen bäst omdöpas till något oskyldigt som pos. answered 12/12 12 på 5 19.one antar att tomrumsoperatör T-provet är faktiskt tomt operatör T-prov oPless 8 juni 14 vid 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 vill, kommer att fixa, tack Tony D Jun 8 14 vid 14 27.C-algoritm för noll-latens exponentiell rörlig average. Last Modified 2012-08- 13. Jag har försökt att genomföra en Lågfrekvens cutoff i c som väsentligen tar en ström av siffror och släpper ut utgången som filtrerar ut högfrekventa rörelsesjitter 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 en bit av 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 artiklar 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 hans pseudokod så jag antog att detta var det sista samtalet s zlema och jag antar också 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ö i alla andra än att bara byta alla värden ett till slutet och sätta in det senaste i början Koden 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 kunde 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 inmatning, 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 att det kommer att finnas 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 naturen av formeln. Till 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. Exponentiell Flytande Genomsnittlig Float Ema Float Vals, Int NumVals, Int CurrentSample Statisk Float Faktor 0 Statisk Float Lastema 0 Float Ema. if CurrentSample 1 EmaVals 0 Faktor 2 0 Float NumVals 1 0 Andra Ema FactorVals 0 1 0 - Factor 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. Den kallas 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, ber om ursäkt 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 borde vara enkelt att fixa. 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 jämna 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 satt 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ångsargruppen har det senaste värdet.3 Samma 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ångsomvandling 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