Friday 17 November 2017

C Bevegelig Gjennomsnitt Algoritme


Jeg vet at dette er mulig med boost per: Men jeg vil virkelig unngå å bruke boost. Jeg har googled og ikke funnet noen egnede eller lesbare eksempler. I utgangspunktet vil jeg spore det bevegelige gjennomsnittet av en pågående strøm av en strøm av flytende punktnumre ved å bruke de siste 1000 tallene som en dataprøve. Hva er den enkleste måten å oppnå dette på, jeg eksperimenterte med å bruke et sirkulært array, eksponentielt glidende gjennomsnitt og et enklere glidende gjennomsnitt og fant ut at resultatene fra det sirkulære arrayet passer mine behov best. spurte 12. juni kl 12:38 Hvis dine behov er enkle, kan du bare prøve å bruke et eksponentielt glidende gjennomsnitt. Enkelt sagt, du lager en akkumulatorvariabel, og når koden ser på hver prøve, oppdaterer koden akkumulatoren med den nye verdien. Du velger en konstant alfa som er mellom 0 og 1, og beregner dette: Du trenger bare å finne en verdi av alfa hvor effekten av en gitt prøve bare varer i ca 1000 prøver. Hmm, jeg er egentlig ikke sikker på at dette passer for deg, nå som jeg har sagt det her. Problemet er at 1000 er et ganske langt vindu for et eksponentielt glidende gjennomsnitt. Jeg er ikke sikker på at det er en alfa som vil spre gjennomsnittet over de siste 1000 tallene, uten understrøm i flytpunktsberegningen. Men hvis du vil ha et mindre gjennomsnitt, som 30 tall eller så, er dette en veldig enkel og rask måte å gjøre det på. svarte 12. juni kl 12:44 1 på ditt innlegg. Det eksponentielle glidende gjennomsnittet kan la alfa variere. Så dette tillater det å bli brukt til å beregne tidsbasen gjennomsnitt (for eksempel bytes per sekund). Hvis tiden siden den siste akkumulatoroppdateringen er mer enn 1 sekund, lar du alfa være 1,0. Ellers kan du la alpha være (usecs siden sist oppdatering1000000). ndash jxh Jun 12 12 at 6:21 I utgangspunktet vil jeg spore det bevegelige gjennomsnittet av en pågående strøm av en strøm av flytende punktnumre ved å bruke de siste 1000 tallene som en datasample. Vær oppmerksom på at under oppdateringer summen som elementer som addrested, unngå kostbare O (N) traversal å beregne summen som trengs for gjennomsnittet - på forespørsel. Totalt er det laget en annen parameter fra T for å støtte f. eks. bruker en lang lang når totalt 1000 lang s, en int for char s, eller en dobbel til total float s. Dette er litt feil i at numsamples kan gå forbi INTMAX - hvis du bryr deg om at du kan bruke en usignert lang lang. eller bruk et ekstra bool data medlem til å registrere når beholderen først fylles mens sykkel nummeprøver rundt arrayet (best deretter omdøpt noe uskyldig som pos). besvart 12. juni 12 klokka 5:19 en antar at kvote-operatør (T-prøve) kvot er faktisk quotvoid operatorltlt (T-prøve) sitat. ndash oPless 8 Jun 14 kl 11:52 oPless ahhh. godt observert. egentlig mente jeg at det skulle være tomt operatør () (T-prøve), men selvfølgelig kunne du bruke hvilken som helst notasjon du likte. Vil fikse, takk. ndash Tony D Jun 8 14 at 14:27Is det mulig å implementere et bevegelige gjennomsnitt i C uten behov for et vindu med prøver Ive fant at jeg kan optimalisere litt, ved å velge et vindu størrelse som er en kraft på to for å tillate litt - skifting i stedet for å dele, men ikke trenger en buffer ville være fint. Er det en måte å uttrykke et nytt glidende gjennomsnittsresultat bare som en funksjon av det gamle resultatet og den nye prøven. Definer et eksempel glidende gjennomsnitt, over et vindu på 4 prøver å være: Legg til ny prøve e: Et glidende gjennomsnitt kan implementeres rekursivt , men for en nøyaktig beregning av det bevegelige gjennomsnittet må du huske den eldste innsatsprøven i summen (dvs. a i eksempelet ditt). For et lengde N bevegelige gjennomsnitt beregner du: hvor yn er utgangssignalet og xn er inngangssignalet. Eq. (1) kan skrives rekursivt som Så du må alltid huske prøven xn-N for å kunne beregne (2). Som påpekt av Conrad Turner, kan du bruke et (uendelig langt) eksponensielt vindu i stedet, som gjør det mulig å beregne utgangen bare fra tidligere utgang og gjeldende inngang: men dette er ikke et standard (uvevet) glidende gjennomsnitt, men eksponentielt vektet glidende gjennomsnitt, hvor prøver tidligere i det siste får en mindre vekt, men (i det minste i teorien) glemmer du aldri noe (vektene blir bare mindre og mindre for prøver langt i det siste). Jeg implementerte et glidende gjennomsnitt uten individuelt elementminne for et GPS-sporingsprogram jeg skrev. Jeg starter med 1 prøve og deler med 1 for å få dagens avg. Jeg legger til en prøve og deler med 2 til den nåværende avg. Dette fortsetter til jeg kommer til lengden av gjennomsnittet. Hver gang etterpå legger jeg til den nye prøven, får gjennomsnittet og fjerner det gjennomsnittet fra totalen. Jeg er ikke en matematiker, men dette virket som en god måte å gjøre det på. Jeg skjønte at det ville slå magen til en ekte matte fyr, men det viser seg at det er en av de aksepterte måtene å gjøre det på. Og det fungerer bra. Bare husk at jo høyere lengden jo tregere følger det du vil følge. Det kan ikke være noe som helst mesteparten av tiden, men når du følger satellitter, hvis du er treg, kan stien være langt fra den faktiske posisjonen, og det vil se dårlig ut. Du kan ha et mellomrom mellom lørdager og de etterfølgende prikkene. Jeg valgte en lengde på 15 oppdatert 6 ganger i minuttet for å få tilstrekkelig utjevning og ikke komme for langt fra den faktiske lette stillingen med glattestrekpunktene. besvart 16 nov 16 kl 23:03 initialiser totalt 0, count0 (hver gang vi ser en ny verdi) En innskriving (scanf), en legger til totalnewValue, ett inkrement (telle), en del av gjennomsnitt (totalt antall) Dette ville være et bevegelige gjennomsnitt over alle innganger For å beregne gjennomsnittet over bare de siste 4 inngangene, ville det kreve 4 inputvariables, kanskje kopiering av hvert inngang til en eldre inputvariable, og deretter beregning av det nye glidende gjennomsnittet. Som summen av de 4 inngangsvariablene delt på 4 (høyre skift 2 ville være bra hvis alle inngangene var positive for å gjøre gjennomsnittlig beregning besvart 3. februar klokken 4:06 som faktisk vil beregne gjennomsnittet og IKKE det bevegelige gjennomsnittet. Etter hvert som tellingen blir større, blir virkningen av en ny inngangsprøve forsvunnet liten ndash Hilmar Feb 3 15 kl 13:53 Ditt svar 2017 Stack Exchange, IncC-algoritme for null-ventetid eksponentiell glidende gjennomsnitt Sist endret: 2012-08-13 Jeg har prøvd å implementere en lavfrekvens cutoff i c som i hovedsak tar en strøm av tall og smoo ths ut produksjonen (filtrering ut høyfrekvent bevegelsesjitter), men det er viktig at de fremveide tallene blir vurdert umiddelbart da dataene er tidskritiske (det er å kontrollere en bevegelsessimulasjonsbase ved bruk av utgang fra litt av spillprogramvaren). Jeg har en arbeidsvektet glidende gjennomsnittlig algoitme, men kan gjøre med noe litt mer responsivt på forsiden, og jeg fant dette: - Pseudokoden er som følger: Inputs: Price (NumericSeries), Period (NumericSimple) Variabler: faktor (0), lag (0) hvis CurrentBar lt 1 deretter begynner ZLEMA Prisfaktor 2 (Period1) lag (Period 1) 2 End else start ZLEMA faktor (2Price-Pricelag) (1-faktor) ZLEMA1 ende Ive oversatt den til C og koden min er som følger: Men det virker ikke å oppføre seg ganske som jeg forventer. Det ser ut til å være nesten der, men noen ganger får jeg en litt lavere verdi enn alle elementene i køen (når de er alle høyere). Min kø og antall elementer i den er bestått som parametere, med den siste som er foran på alle tider, passerer jeg også en inkrementerende teller som starter ved 0 som kreves av funksjonen. Jeg er ikke sikker på at jeg har tolket betydningen av ZLEMA1 riktig, da den ikke er tydelig i sin pseudokode, så jeg antok at dette er de siste samtalene Zlema, og jeg antar at Pris faktisk betyr Pris0. Kanskje jeg har det galt Skal jeg kopiere den faktiske Zlema-kalkulerte verdiene tilbake til min opprinnelige kø før neste anrop, endrer jeg ikke den opprinnelige køen i det hele tatt enn bare skifter alle verdier en til enden og legger inn det siste i begynnelsen . Koden jeg bruker til å gjøre dette er: Ville være ekstremt takknemlig hvis noen med en bedre forståelse av matematikken kunne behage forstanden, sjekk dette for meg for å se om jeg har noe litt galt, takk så mye på forhånd hvis du kan hjelpe Først takk alt for Din innspill, mye verdsatt Det er fornuftig jeg antar, så jeg antar at det beste jeg kan håpe på, er bare et eksponentielt glidende gjennomsnitt, og aksepterer det vil være et lite lag, men dette vil bli minimert av tyngre frontvekt enn gitt i typisk vektet glidende gjennomsnitt Jeg har denne algoritmen også, men et lignende problem ved at verdiene ikke virker ganske riktige (med mindre dette er formens natur). For eksempel, si at mitt utvalg inneholder 16 verdier, alle 0.4775 - utgangen er 0.4983, men Id forventer at den skal være 0.4775 Ser dette ut til deg. Eksponentiell flytende gjennomsnitt. float ema (float vals, int numVals, int currentSample) statisk float faktor 0 statisk float lastema 0 float ema hvis (currentSample lt 1) ema vals0 faktor 2.0 ((float) numVals) 1.0) andre ema (faktor vals0) - faktor) lastema) lastema ema return ema Omvendt er produksjonen lavere enn hver av inngangene, selv om alle er høyere. Den kalles på samme måte som zlema (.) Ovenfor, med en økende teller. Formelen og pseudokoden for denne er her: - autotradingstrategy. wordpress20091130exponential-moving-average Takk igjen, unnskyld for min misforståelse av noen av grunnleggende: (Med vennlig hilsen, Chris J Som for koden jeg postet, har du rett om array størrelse Situasjonen. Det bør være lett å fikse. Som for dine spørsmål: 1) Filterkonstanten representerer en frekvens cutoff. Jeg brukte en digital signalbehandling (DSP) for denne teknikken. en. wikipedia. orgwi kiLow-pas sfilter er en enkel forklaring. Du vil ha avdelingen for diskret tid. I mitt tilfelle er A RC-Konstanten de snakker om. Så frekvensen som den kutter ut er over 1 (2piA). Hvis du ikke har en forståelse av Frequency-Domain teori, kan dette bli komplisert. I ditt tilfelle, jo høyere du lager A, desto lavere frekvens vil dette filteret tillate, noe som betyr at det vil jevne kurven ut mer og mer. Jo lavere du gjør det, jo mer støy som er tillatt i systemet. Husk at en må være større enn eller lik 1 for å være effektiv. Jeg reattached XLS igjen, denne gangen uten endring av rand () tallene. Juster A-konstanten og se hvordan den quotsmoothsquot (eller filter) ut høyfrekvensvariasjonene. 2) Det siste punktet i inngangsarrangementet har den nyeste verdien. 3) Det samme gjelder for utmatningsarrayen. Den siste er den nyeste verdien. 5) NUMVALS er vilkårlig. Du kan kontinuerlig legge til på input og output array så mange ganger du liker, og det ville ikke påvirke filteret. Spesielt brukte jeg 49 poeng. Men jeg kan enkelt slette de siste 20 og de første 29 utgangene vil forbli de samme. Funksjonen er ikke basert på hvor mange poeng blir brukt. Jeg vil nevne at jeg utviklet denne funksjonen for en engangskonvertering. Hvis du ønsket å gjøre en konvertering for den neste verdien på flyet, kan du prøve noe enklere (som vedlagt). Igjen er jeg rusten på c. Jeg håper dette er riktig. Det eneste du trenger å levere er inngang og filter konstant. Gi meg beskjed om dette hjelper.

No comments:

Post a Comment