Viktat glidande medelvärde c kod
Jag försöker beräkna det rörliga genomsnittet av en signal. Signalvärdet (en dubbel) uppdateras vid slumpmässiga tider. Jag letar efter ett effektivt sätt att beräkna sitt tidsvägda genomsnitt över ett tidsfönster, i realtid. Jag skulle kunna göra det själv, men det är mer utmanande än jag trodde. De flesta resurser som Ive hittat över internet beräknar glidande medelvärde av periodisk signal, men min uppdateringar slumpmässigt. Vet någon bra resurser för det? Tricket är följande: Du får uppdateringar i slumpmässiga tider via tomt uppdatering (int tid, float värde). Men du måste också spåra när en uppdatering faller utanför tidsfönstret, så du ställer in ett larm som kallas vid tidpunkt N som tar bort den föregående uppdateringen från att någonsin ses över i beräkningen. Om det händer i realtid kan du begära att operativsystemet gör ett samtal till en metod som inte kan hämtas i tid. N Om det här är en simulering, kan du inte få hjälp från operativsystemet och du behöver gör det manuellt. I en simulering skulle du anropa metoder med tiden som levereras som ett argument (vilket inte korrelerar med realtid). Ett rimligt antagande är emellertid att samtalen garanteras vara sådan att tidsargumenten ökar. I det här fallet behöver du behålla en sorterad lista över alarmtidvärden, och för varje uppdatering och lässamtal kontrollerar du om tidsargumentet är större än huvudet på larmlistan. Medan det är större gör du den larmrelaterade behandlingen (släpp av den äldsta uppdateringen), ta bort huvudet och kontrollera igen tills alla larm före den angivna tiden behandlas. Då uppdaterar uppdateringen. Jag har hittills antagit att det är uppenbart vad du skulle göra för den faktiska beräkningen, men jag kommer att utveckla just i fallet. Jag antar att du har en metod float read (int tid) som du använder för att läsa värdena. Målet är att göra detta samtal så effektivt som möjligt. Så du beräknar inte det glidande genomsnittet varje gång läsmetoden heter. I stället precomputerar du värdet som den senaste uppdateringen eller det senaste larmet, och tweak det här värdet med ett par flytande punkter för att beräkna tidens gång sedan senaste uppdateringen. (dvs ett konstant antal operationer förutom att kanske bearbeta en lista med uppstartade larm). Förhoppningsvis är detta klart - det här borde vara en ganska enkel algoritm och ganska effektiv. Ytterligare optimering. Ett av de återstående problemen är om ett stort antal uppdateringar händer inom tidsfönstret, då finns det en lång tid som det varken läser eller uppdateringar, och sedan kommer en läsning eller uppdatering att komma med. I det här fallet kommer ovanstående algoritm att vara ineffektiv när man stegvis uppdaterar värdet för varje uppdatering som faller av. Det här är inte nödvändigt eftersom vi bara bryr oss om den senaste uppdateringen bortom tidsfönstret, så om det finns ett sätt att effektivt släppa bort alla äldre uppdateringar, skulle det hjälpa. För att göra detta kan vi modifiera algoritmen för att göra en binär sökning av uppdateringar för att hitta den senaste uppdateringen före tidsfönstret. Om det finns relativt få uppdateringar som behöver släppas kan man stegvis uppdatera värdet för varje uppladdad uppdatering. Men om det finns många uppdateringar som behöver släppas kan man ompröva värdet från början efter att ha släppt bort de gamla uppdateringarna. Tillägg till inkrementell beräkning: Jag borde klargöra vad jag menar med inkrementell beräkning ovan i meningen tweak detta värde med ett par flytande punkter för att beräkna tidens gång sedan den senaste uppdateringen. Initial icke-inkrementell beräkning: sedan iterera över relevanta uppdateringar i enlighet med ökande tid: movingaverage (summa lastupdate timesincelastupdate) windowlength. Nu om exakt en uppdatering faller utanför fönstret men inga nya uppdateringar anländer, justera summan som: (notera att det är priorupdate som har sin tidstämpel modifierad till början av sista fönstret). Och om exakt en uppdatering kommer in i fönstret men inga nya uppdateringar faller av, justera summan som: Som det är uppenbart är det här en grov skiss men förhoppningsvis visar det hur du kan behålla medelvärdet så att det är O (1) operationer per uppdatering amorterad. Men notera ytterligare optimering i föregående stycke. Observera också stabilitetsproblem hänvisade till i ett äldre svar, vilket innebär att floating point-fel kan ackumuleras över ett stort antal sådana inkrementella operationer så att det skiljer sig från resultatet av den fullständiga beräkningen som är signifikant för applikationen. Om en approximation är OK och det är en minimal tid mellan proverna, kan du prova superprovtagning. Har en matris som representerar jämnt fördelade tidsintervaller som är kortare än minimumet och vid varje tidsperiod lagrar det senaste provet som mottogs. Ju kortare intervallet desto närmare är medelvärdet det verkliga värdet. Perioden ska inte vara större än hälften av lägsta eller det finns en chans att missa ett prov. svarat dec 15 11 kl 18:12 svarat dec 15 11 at 22:38 Tack för svaret. En förbättring som skulle behövas för att faktiskt citerar värdet av det totala genomsnittet så att vi inte slog hela tiden. Det kan också vara en liten punkt, men skulle det inte vara mer effektivt att använda en deque eller en lista för att lagra värdet, eftersom vi antar att uppdateringen kommer i rätt ordning. Infoga skulle vara snabbare än i kartan. ndash Arthur Dec 16 11 at 8:55 Ja, du kan cache värdet av summan. Subtrahera värdena för de prov du raderar, lägg till värdena för de prov du lägger in. Ja, en dequeltpairltSample, Dategtgt kan också vara effektivare. Jag valde kartan för läsbarhet, och det enkla att påkalla kartan :: övre delen. Skriv alltid rätt kod först och alltid, profilera och mät stegvisa ändringar. ndash Rob Dec 16 11 kl 15:00 Anm .: Det här är tydligen inte sättet att närma sig detta. Lämna den här för hänvisning till vad som är fel med detta tillvägagångssätt. Kontrollera kommentarerna. UPPDATERAD - baserat på Olis kommentar. inte säker på instabiliteten som han pratar om. Använd en sorterad karta över ankomsttider mot värden. Vid ankomsten av ett värde lägg till ankomsttiden till den sorterade kartan tillsammans med dess värde och uppdatera det glidande medelvärdet. varning detta är pseudokod: där. Inte helt fleshed ut men du får tanken. Saker att notera. Som jag sa ovanstående är pseudokoden. Du måste välja en lämplig karta. Ta inte bort paren när du itererar genom att du kommer att ogiltiggöra iteratorn och måste börja om igen. Se också Olis kommentar nedan. svarat dec 15 11 at 12:22 Det här fungerar inte: det tar inte hänsyn till vilken andel av fönstrets längd som varje värde existerar för. Dessutom är detta tillvägagångssätt för att lägga till och sedan subtrahera endast stabilt för heltalstyper, inte flytande. ndash Oliver Charlesworth Dec 15 11 at 12:29 OliCharlesworth - ledsen Jag missade några viktiga punkter i beskrivningen (dubbel och tidsvägd). Jag kommer att uppdatera. Tack. ndash Dennis Dec 15 11 at 12:33 Tidsvägningen är ännu ett problem. Men det är inte det jag talar om. Jag hänvisade till det faktum att när ett nytt värde först når tidsfönstret är dess bidrag till medeltalet minimalt. Dess bidrag fortsätter att öka tills ett nytt värde går in. ndash Oliver Charlesworth Dec 15 11 på 12:35 Jag vet att det här är möjligt med boost enligt: 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 punkttal med de senaste 1000 siffrorna som ett dataprov. Vad ä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. frågade 12 juni 12 kl 4:38 Om dina behov är enkla kan du bara försöka använda ett exponentiellt glidande medelvärde. Enkelt du skapar en ackumulatorvariabel, och när din kod tittar på varje prov uppdateras koden med 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 visst 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 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 medelvärdet ö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 det. svarade 12 jun 12 kl 4:44 1 på ditt inlägg. Det exponentiella glidande medlet kan låta alfabetet vara variabelt. Så här tillåter det att det används för att beräkna tidsbaserade 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 alpha vara (usecs sedan senaste uppdateringen1000000). ndash jxh Jun 12 12 at 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 punkttal med de senaste 1000 siffrorna som ett dataprov. Observera att nedanstående uppdaterar summan som element som läggs ut och undviker kostsam O (N) - korsning för att beräkna summan som behövs för genomsnittet - efterfrågan. Totalt görs en annan parameter från T för att stödja t. ex. använder 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. Det här är lite bristfälligt i att numsamples kan gå förbi INTMAX - om du bryr dig att du kan använda en unsigned long long. eller använd en extra bool-data medlem för att spela in när behållaren fylls först medan cykeltalsprover runt arrayen (bäst omnämndes något oskadd som pos). svarade den 12 juni 12 på 5:19 en förutsätter att kvoträttsoperatören (T-provet) kvot är faktiskt kvittooperatör (T-prov) citat. ndash oPless 8 juni 14 kl 11:52 oPless ahhh. välspotted. egentligen menade jag att det skulle vara tomt operatör () (T-prov) men självklart kunde du använda vilken anteckning du gillade. Kommer att fixa, tack. ndash Tony D Jun 8 14 14: 27moving average s tekniker hög frekvens trading targetblank MA moving average s tekniker högfrekvent handel Adaptiv glidande medelteknik, CSI 300 index futures högre frekvens databehandling, för att uppnå simulerad handel. Delta i vinster Visuella, enkla att studera, för att identifiera marknadsmöjligheter, fånga handelsmöjligheter, förändringar i realtidsstrategi för att uppnå maximala vinster. Men handelsskylt. glidande medel s tekniker hög frekvens handel targetblank glidande medel s tekniker hög frekvens handel targetblank flytta AVG filter targetblank hitta tröskel genom att flytta AVG filter den här metoden som används för att hitta bästa tröskeln i bild med flyttande avrage filter denna metod som används i bildbehandling och används för skuggning soloution kod och resultat bifogas i den mapp som du använde och sett dessa resultattankar för din webbplats amin tolou nb. flytta AVG filter targetblank flytta AVG filter targetblank rörlig ledd displaymatris targetblank rörlig ledd visning matris programmering av 8051 microcontroller med AT89S51 där ett rörligt meddelande visas på led matris. rörlig ledd displaymatris målblank rörlig ledd displaymatris targetblank rörlig Bilprojekt targetblank rörande Bilprojekt Detta är ett java Projekt där en bil flyttar från höger till vänster genom att minska den allmänna vägen med 60 enheter som beskriver att bil och blixtbelysningstjärnor med polygon objekt som en matris från grått till gult med svart bakgrund med färgmetod och ritning av väg som rektangel med grå färg. Flytta bilprojektet målblankrörelse Bilprojekt targetblank viktat medianfilter targetblank viktat medianfilter viktat Medianfilter: Det är samma som medianfilter, endast skillnaden är att masken inte är tom. Det kommer att ha lite vikt (eller värden) och genomsnittet d. Stegen för att utföra viktad medianfiltrering är följande: 1) Antag en 3x3-vägd mask. 2) Placera masken till vänster. viktat medianfilter targetblank weighted medianfilter targetblank glidande medelfilter targetblank glidande medelfilterfunktion kallas genom att tillhandahålla den önskade inmatningen t. ex. bildläsning av imread () eller kan vara en enkel vektor som bildas av en ljudfil eller data från någon annan källa. Tillsammans med ingången måste funktionen ges med fönstermarginalerna ie. e, M1 och M2 som används i funktion till av. glidande medelvärde Filter målblank glidande medelvärde Filter targetblank genomsnitt Filter eller Mask målblank genomsnitt Filter eller Mask Medelfilter, eller medelfilter är windowed filter av linjär klass som släpper signal (bild). Filtret fungerar som lågpass en. Den grundläggande tanken bakom filteret är att någon del av signalen (bilden) tar ett medelvärde över hela sitt grannskap. För att förstå hur det görs i praktiken, låt oss s. genomsnittlig Filter eller Mask målblank genomsnittlig Filter eller Mask targetblank rörlig t-Test Teknik targetblank rörlig t-Test Teknik Variabilitetsdiagnos av tidsföljd trendanalys. rörlig t-testteknik targetblank rörlig t-testteknik targetblank exponentiell fördelning av paketlängdgenerator targetblank Antalet paket genererade Poisson-fördelning med exponentiell fördelning av paketlängdsgenerator Själv skrev litet program, inklusive kommunikationssystem FIFO-kö i programmet och antal paket genererade Poisson fördelning med exponentiell fördelning av paketlängdsgenerator, absolut praktisk. exponentiell fördelning av paketlängdsgenerator targetblank exponentiell fördelning av paketlängdgenerator targetblank Förlängd: 25.337ms - init: 0.7b: 1.5r: 24.9 5.199 CodeForge Kinesisk Version CodeForge English Version Var ska du Gå till CodeForge användarcenter Slutför din profil, skaffa poäng 8 Sec stanna här oj. Tyvärr, den här killen är mystisk, dess blogg har inte öppnats, prova en annan, snälla OKIs det möjligt att genomföra ett glidande medelvärde i C utan att det behövs ett fönster i prover. Jag har funnit att jag kan optimera lite, genom att välja ett fönsterstorlek som är en kraft av två för att tillåta bitskiftning istället för att dela men inte behövde 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 Definiera ett exempel glidande medelvärde, över ett fönster med 4 prov att vara: Lägg till nytt prov e: Ett glidande medel kan implementeras rekursivt , men för en exakt beräkning av det rörliga genomsnittet måste du komma ihåg det äldsta inmatningsprovet i summan (dvs a i ditt exempel). För ett längd N rörligt medelvärde beräknar du: var yn är utsignalen och xn är ingångssignalen. Eq. (1) kan skrivas rekursivt som Så du behöver alltid komma ihåg provet xn-N för att beräkna (2). Som påpekat av Conrad Turner kan du använda ett (oändligt långt) exponentiellt fönster istället, vilket gör det möjligt att beräkna utmatningen endast från tidigare utmatning och aktuell ingång: men detta är inte ett vanligt (obetydligt) glidande medelvärde men exponentiellt viktat 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 implementerade 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. Sedan lägger jag till ett prov och delar upp med 2 till den nuvarande avg. Detta fortsätter tills jag når längden på medelvärdet. 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öra det. Jag tänkte att det skulle vända på magen 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 följer du vad du vill följa. Det kan inte ha betydelse för det mesta, men när du följer satelliter, kan du vara långsiktig, om det är långt ifrån det faktiska läget och det kommer att se dåligt ut. Du kan få ett mellanrum mellan mitten och de efterföljande prickarna. Jag valde en längd på 15 uppdaterad 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. svarat 16 november 16 kl 23:03 initialisera totalt 0, count0 (varje gång vi ser ett nytt värde) Då en inmatning (scanf), en lägg till totalnewValue, en ökning (räkning), en delningsgenomsnitt (totalantal) Detta skulle vara ett glidande medelvärde över alla ingångar För att beräkna medelvärdet över endast de fyra sista 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 det nya glidande medlet. Som summan av de fyra ingångsvariablerna dividerat med 4 (höger skift 2 skulle vara bra om alla ingångar var positiva för att göra den genomsnittliga beräkningen besvarad 3 feb 15 kl 4:06 som faktiskt kommer att beräkna det totala genomsnittet och INTE det rörliga genomsnittet. När räkningen blir större blir effekten av ett nytt ingångsprov försvinnande liten ndash Hilmar Feb 3 15 kl 13:53 Ditt svar 2017 Stack Exchange, Inc
Comments
Post a Comment