Thursday, 19 October 2017

Viktat glidande medelvärde filter c ++


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 - på begäran. Total görs en annan parameter från T för att stödja t ex med lång längd när det är 1000 lång s, en int för char s eller en dubbel till total float s. Detta är lite bristfälligt i att nummemplar 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 oPlöse 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 är en kraft av två till 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 Ökningstalet, en dela 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 krävas 4 inputvariabler, kanske kopiering av varje ingång till en äldre ingångsvariabel och sedan beräkning av det nya glidande medeltalet 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 den 3 februari på 4 06. Det kommer faktiskt att beräkna det totala genomsnittet och INTE det glidande genomsnittet Som räknat blir större påverkan av något nytt ingångsprov blir försvinnande liten Hilmar 3 feb 15 på 13 53. Ditt svar.2017 Stack Exchange, Inc. Exponential Moving Averages for Irregular Time Series. I tidsserieanalysen är det ofta ett behov av utjämning Funktioner som reagerar snabbt på förändringar i signalen I den typiska applikationen kan du bearbeta en insignal i realtid och vill beräkna sådana saker som det senaste medelvärdet eller få en momentan lutning för det. Men reella världssignaler är ofta Bullriga Några bullriga prover gör det aktuella värdet av signalen eller dess lutning varierar mycket. Flyttmedelvärden. Den enklaste utjämningsfunktionen är ett fönsterfönster som rör sig i rynket När prover kommer in tar du genomsnittsvärdet av de senaste N-värdena Ut spikar, men introducerar en fördröjning eller latens. Ditt medelvärde kommer alltid att fördröjas med bredden på ditt rörliga medelvärde. Exemplet ovan är relativt dyrt att beräkna. För varje prov måste du iterera över hela storleken på fönstret Men det finns billigare sätt behåll summan av alla prover i fönstret i en buffert och justera summan när nya prover kommer in. En annan typ av rörligt medelvärde är det viktade glidande medlet som vikter för varje position i provet w indow Före medelvärdet multiplicerar du varje prov med vikten av det här fönstret. Tekniskt kallas detta en faltning. En typisk viktningsfunktion tillämpar en klockkurva i provfönstret. Detta ger en signal som är mer inställd till mitten av fönstret och fortfarande något tolerant av bullriga prover I ekonomisk analys använder du ofta en viktningsfunktion som värderar de senaste proverna mer för att ge ett glidande medelvärde som spårar närmare de senaste proverna. Äldre prover ges progressivt mindre vikt. Detta mildrar något latentens effekter samtidigt som det fortfarande ger rimligt bra utjämning. Med ett vägt genomsnitt måste du alltid iterera över hela fönsterstorleken för varje prov såvida du inte kan begränsa tillåtna vikter till vissa funktioner. Exponentiell rörlig genomsnittsvärde. En annan typ av medelvärde är exponentiell glidande medelvärde, eller EMA This används ofta där latens är kritisk, till exempel i realtidsfinansiell analys. I genomsnitt minskar vikterna expo Nämligen Varje prov värderas några procent mindre än nästa senaste prov. Med denna begränsning kan du beräkna det rörliga genomsnittet mycket effektivt. Där alfa är en konstant som beskriver hur fönsterviktema minskar över tiden Till exempel om varje prov skulle vägas vid 80 av värdet av det föregående provet, skulle du ställa in alfa 0 2 Den mindre alfa blir desto längre blir ditt glidande medelvärde, t ex blir det mjukare, men mindre reaktivt mot nya prov. Vikten för en EMA med alfa 0 20. Om du kan se för varje nytt prov behöver du bara genomsnittsera det med värdet av föregående medelvärde. Beräkningen är väldigt mycket snabb. I teorin bidrar alla tidigare prover till det nuvarande genomsnittet, men deras bidrag blir exponentiellt mindre över tiden. Detta är en mycket Kraftfull teknik, och förmodligen det bästa om du vill få ett glidande medelvärde som snabbt svarar på nya prover, har bra utjämningsegenskaper och är snabb att beräkna. Koden är trivial. EMA för oregelbunden T ime-serien. Standarden EMA är bra när signalen samplas med regelbundna tidsintervaller Men vad händer om dina prover kommer i oregelbundna intervaller. Ange en kontinuerlig signal som samplas med oregelbundna intervaller. Detta är den vanliga situationen i finansiell analys. Teoretiskt finns det en Kontinuerlig funktion för värdet av något finansiellt instrument, men du kan bara prova den här signalen när någon faktiskt gör en handel. Så dataströmmen består av ett värde plus tiden då den observerades. Ett sätt att hantera detta är att konvertera Den oregelbundna signalen till en vanlig signal, genom att interpolera mellan observationer och resampling Men det här förlorar data och det introducerar latens. Det är möjligt att beräkna en EMA för en oregelbunden tidsserie direkt. I denna funktion passerar du i strömmen prov från din signal och det föregående provet och hur lång tid som har gått mellan de två och det tidigare värdet som returneras av den här funktionen. Så bra fungerar det för att visa att jag är gen betygsatt en sinusvåg, samplades sedan med oregelbundna intervaller och introducerade omkring 20 ljud. Det är signalen varierar slumpmässigt - 20 från den ursprungliga sanna sinusignalen. Hur bra återfår det oregelbundna exponentiella glidande medlet. Den röda linjen är den Original sinusvåg samplad i oregelbundna intervaller Den blå linjen är signalen med ljudet tillagt Den blå linjen är den enda signalen som EMA ser Den gröna linjen är den släta EMA Du kan se att den återställer signalen ganska bra Lite wobbly, men vad kan du förväntar dig från en sådan bullrig källsignal. Den flyttas ungefär 15 till höger, eftersom EMA introducerar viss latens Ju mjukare du vill ha det, desto mer latens kommer du att se Men från det här kan du till exempel beräkna en momentan lutning för en Bullriga oregelbundna signalen. Vad kan du göra med det Hmm.

No comments:

Post a Comment