Jeg har i hovedsak en rekke verdier som dette: Ovennevnte array er forenklet, jeg samler 1 verdi per millisekund i min ekte kode og jeg må behandle utdataene på en algoritme som jeg skrev for å finne nærmeste topp før et tidspunkt. Min logikk feiler fordi i mitt eksempel over, er 0.36 den virkelige toppen, men min algoritme vil se bakover og se det aller siste nummeret 0,25 som toppen, da det er en reduksjon til 0,24 før den. Målet er å ta disse verdiene og bruke en algoritme til dem som vil glatte dem ut litt, slik at jeg har mer lineære verdier. (dvs.: Jeg synes at resultatene mine skal være svingete, ikke sjokkerende) Jeg har blitt fortalt å bruke et eksponentielt glidende gjennomsnittsfilter til mine verdier. Hvordan kan jeg gjøre dette? Det er veldig vanskelig for meg å lese matematiske ligninger, jeg har mye bedre med kode. Hvordan behandler jeg verdier i mitt utvalg, og bruker en eksponentiell glidende gjennomsnittlig beregning til selv dem ut spurt 8. februar kl 20:27 For å beregne et eksponentielt glidende gjennomsnitt. du trenger å holde noen stat rundt og du trenger en tuning parameter. Dette krever en liten klasse (forutsatt at du bruker Java 5 eller nyere): Instantiate med decay-parameteren du vil ha (kanskje ta tuning skal være mellom 0 og 1) og bruk deretter gjennomsnittlig () for å filtrere. Når du leser en side om matematisk tilbakevending, trenger du bare å vite når du gjør det til kode, at matematikere liker å skrive indekser i arrays og sekvenser med abonnementer. (De har også et par andre notater, noe som ikke hjelper.) EMA er imidlertid ganske enkel, da du bare trenger å huske en gammel verdi, ingen kompliserte tilstandsarrayer kreves. svarte 8. februar kl 12:42 TKKocheran: Ganske mye. Det er ikke bra når ting kan være enkle (Hvis du starter med en ny sekvens, får du en ny gjennomsnittlig.) Vær oppmerksom på at de første betingelsene i gjennomsnittssekvensen vil hoppe rundt litt på grunn av grenseeffekter, men du får de med andre bevegelige gjennomsnitt også. En god fordel er imidlertid at du kan pakke den bevegelige gjennomsnittlige logikken inn i avvergeren og eksperimentere uten å forstyrre resten av programmet for mye. ndash Donal Fellows 9 Feb 12 kl 0:06 Jeg har det vanskelig å forstå dine spørsmål, men jeg vil prøve å svare uansett. 1) Hvis algoritmen din fant 0,25 i stedet for 0,36, så er det feil. Det er feil fordi det forutsetter en monotonisk økning eller reduksjon (det går alltid opp eller går alltid ned). Med mindre du gjennomsnittlig ALLE dataene dine, er datapunktene dine --- som du presenterer dem --- ikke-lineære. Hvis du virkelig vil finne den maksimale verdien mellom to poeng i tid, skar du matrisen din fra tmin til tmax og finn maksimalt for den subarrayen. 2) Nå er begrepet bevegelige gjennomsnitt veldig enkle: forestill deg at jeg har følgende liste: 1.4, 1.5, 1.4, 1.5, 1.5. Jeg kan glatte det ut ved å ta gjennomsnittet av to tall: 1,45, 1,45, 1,45, 1,5. Legg merke til at første nummer er gjennomsnittet på 1,5 og 1,4 (andre og første tall) den andre (nye listen) er gjennomsnittet på 1,4 og 1,5 (tredje og andre gamle liste) den tredje (nye listen) gjennomsnittet på 1,5 og 1,4 (fjerde og tredje), og så videre. Jeg kunne ha gjort det perioden tre eller fire, eller n. Legg merke til hvordan dataene er mye jevnere. En god måte å se glidende gjennomsnitt på jobben er å gå til Google Finance, velg en aksje (prøv Tesla Motors ganske flyktig (TSLA)) og klikk på technicals nederst i diagrammet. Velg Moving Average med en gitt periode, og eksponentiell glidende gjennomsnitt for å sammenligne forskjellene sine. Eksponentielt glidende gjennomsnitt er bare en annen utbygging av dette, men veier de eldre dataene mindre enn de nye dataene, dette er en måte å forvirre utjevningen mot baksiden. Vennligst les Wikipedia-oppføringen. Så dette er mer en kommentar enn et svar, men den lille kommentarboksen var bare for liten. Lykke til. Hvis du har problemer med matematikken, kan du gå med et enkelt bevegelige gjennomsnitt i stedet for eksponentiell. Så utgangen du får, vil være de siste x-vilkårene delt med x. Ikke testet pseudokode: Vær oppmerksom på at du må håndtere start - og sluttdelene av dataene, siden du klart ikke kan gjennomsnittlig de siste 5 vilkårene når du er på ditt andre datapunkt. Det er også mer effektive måter å beregne dette glidende gjennomsnittet (sum sum - eldste nyeste), men dette er å få konseptet av hva som skjer over. svarte 8. februar kl 20: 41. Det er mulig å implementere et bevegelig gjennomsnitts i C uten at det er behov for et vindu med prøver. Jeg har funnet ut at jeg kan optimalisere litt ved å velge en vindustørrelse som er en kraft på to for å tillate bitskifting 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 å 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, Inc Jeg må designe et glidende gjennomsnittsfilter som har en avskjæringsfrekvens på 7,8 Hz. Jeg har brukt glidende gjennomsnittlige filtre før, men så vidt jeg er klar over, er den eneste parameteren som kan mates inn er th e antall poeng som skal gjennomsnittes. Hvordan kan dette forholde seg til en avskjæringsfrekvens Den inverse av 7,8 Hz er 130 ms, og jeg jobber med data som samples ved 1000 Hz. Betyr dette at jeg burde bruke et bevegelige gjennomsnittlig filtervinduestørrelse på 130 prøver, eller er det noe annet jeg savner her, spurte Jul 18 13 klokken 9:52 Det glidende gjennomsnittsfilteret er filteret som brukes i tidsdomene for å fjerne støyen er lagt til og også for utjevningsformålet, men hvis du bruker det samme bevegelige gjennomsnittsfilteret i frekvensområdet for frekvensseparasjon, vil ytelsen være verst. så i så fall bruk frekvensdomener filtre ndash user19373 Feb 3 16 at 5:53 Det glidende gjennomsnittsfilteret (noen ganger kjent som en boxcar filter) har en rektangulær impulsrespons: Eller, oppgitt annerledes: Husk at en diskret tidssystemfrekvensrespons er lik den diskrete tiden Fourier-transformasjonen av impulsresponsen, kan vi beregne det som følger: Det som var mest interessert i for ditt tilfelle er størrelsesresponsen til filteret, H (omega). Ved hjelp av et par enkle manipulasjoner kan vi få det på en enklere måte: Dette ser kanskje ikke ut til å være lettere å forstå. Men på grunn av Eulers identitet. husk det: Derfor kan vi skrive ovenstående som: Som jeg sa før, hva du virkelig bekymret for, er størrelsen på frekvensresponsen. Så, vi kan ta størrelsen på det ovennevnte for å forenkle det videre: Merk: Vi kan slippe de eksponentielle betingelsene ut fordi de ikke påvirker størrelsen på resultatet e 1 for alle verdier av omega. Siden xy xy for to todelige komplekse tall x og y, kan vi konkludere med at tilstedeværelsen av eksponentielle termer ikke påvirker den generelle størrelsesresponsen (i stedet påvirker de systemfasesponsen). Den resulterende funksjonen inne i størrelsesbeslagene er en form for Dirichlet-kjernen. Det kalles noen ganger en periodisk sinc-funksjon, fordi den ligner sinc-funksjonen noe i utseende, men er periodisk i stedet. Uansett, siden definisjonen av cutoff-frekvensen er noe underspecified (-3 dB punkt -6 dB poeng første sidelobe null), kan du bruke ovennevnte ligning for å løse alt du trenger. Spesifikt kan du gjøre følgende: Sett H (omega) til verdien som svarer til filterresponsen du vil ha ved cutoff-frekvensen. Sett omega lik til cutoff frekvensen. For å kartlegge en kontinuerlig tidsfrekvens til diskretidsdomenet, husk at omega 2pi frac, hvor fs er samplingsfrekvensen. Finn verdien av N som gir deg den beste avtalen mellom venstre og høyre side av ligningen. Det skal være lengden på det bevegelige gjennomsnittet. Hvis N er lengden på det bevegelige gjennomsnittet, er en omtrentlig avskjæringsfrekvens F (gyldig for N gt 2) i normalisert frekvens Fffs: Den inverse av denne er Denne formel er asymptotisk riktig for stor N og har om lag 2 feil for N2 og mindre enn 0,5 for N4. PS! Etter to år, her endelig hva var tilnærmingen fulgt. Resultatet ble basert på tilnærming av MA-amplitudespektret rundt f0 som en parabola (2. rekkefølge Serie) i henhold til MA (Omega) ca. 1 frac - frac Omega2 som kan gjøres mer nøyaktig nær nullkryssing av MA (Omega) - frac ved å multiplisere Omega med en koeffisient som oppnår MA (Omega) ca. 10.907523 (frac - frac) Omega2 Oppløsningen av MA (Omega) - frac 0 gir resultatene ovenfor, hvor 2pi F Omega. Alt ovenfor gjelder 3 dB cutoff frekvensen, emnet for dette innlegget. Noen ganger, selv om det er interessant å oppnå en dempingsprofil i stoppbånd som er sammenlignbar med en 1-ords IIR Low Pass Filter (single pole LPF) med en gitt -3dB cut-off frekvens (en slik LPF kalles også leaky integrator, å ha en stolpe ikke akkurat ved likestrøm men nær det). Faktisk har både MA og den første rekkefølgen IIR LPF -20dBdecade-skråningen i stoppbåndet (en trenger en større N enn den som brukes i figuren, N32, for å se dette), men mens MA har spektrale nuller ved FkN og en 1f evelope, har IIR filteret bare en 1f profil. Hvis man ønsker å skaffe et MA-filter med lignende støyfiltreringsegenskaper som dette IIR-filteret, og samsvarer med 3dB-kuttfrekvensene for å være det samme, ved å sammenligne de to spektrene, ville han innse at stoppbåndets rippel av MA-filteret ender opp 3dB under det av IIR-filteret. For å få det samme stoppbåndet ripple (dvs. samme støydempning) som IIR-filteret, kan formlene modifiseres som følger: Jeg fant tilbake Mathematica-skriptet der jeg beregnet kuttet av for flere filtre, inkludert MA-en. Resultatet ble basert på tilnærming av MA-spektret rundt f0 som en parabola ifølge MA (Omega) Sin (OmegaN2) Sin (Omega2) Omega 2piF MA (F) ca. N16F2 (N-N3) pi2. Og dermed krysse med 1sqrt derfra. ndash Massimo Jan 17 16 kl 2:08
No comments:
Post a Comment