Monday 23 October 2017

Flytte Gjennomsnittet Filter Kode


Er det mulig å implementere et bevegelige gjennomsnitt i C uten at det er behov for et vindu med prøver Ive har funnet ut at jeg kan optimalisere litt ved å velge en vindustørrelse som er en kraft på to for å tillate bitforskyvning i stedet for å dele, men ikke trenger en buffer ville være hyggelig. 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 delt gjennomsnitt (totalt antall) Dette ville være et glidende 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 Svaret 2017 Stack Exchange, IncMoving Average Filter (MA filter) Laster. Det glidende gjennomsnittsfilteret er et enkelt Low Pass FIR-filter (Finite Impulse Response) som vanligvis brukes til å utjevne en rekke samplede datasignaler. tar M prøver av inngang av gangen og tar gjennomsnittet av disse M-prøvene og produserer et enkelt utgangspunkt. Det er en veldig enkel LPF-struktur (Low Pass Filter) som er nyttig for forskere og ingeniører å filtrere uønsket støyende komponent fra de tiltenkte dataene. Når filterlengden øker (parameteren M), øker utgangens glatthet, mens de skarpe overgangene i dataene blir stadig stumpere. Dette innebærer at dette filteret har utmerket tidsdomene respons, men en dårlig frekvensrespons. MA-filteret utfører tre viktige funksjoner: 1) Det tar M-inngangspunkter, beregner gjennomsnittet av disse M-punktene og produserer et enkelt utgangspunkt 2) På grunn av beregnede beregninger. filteret introduserer en bestemt mengde forsinkelse 3) Filteret fungerer som et lavpassfilter (med dårlig frekvensdomenerespons og et godt domenerespons). Matlab-kode: Følgende matlab-kode simulerer tidsdomene responsen til et M-punkt Flytende Gjennomsnittlig filter og plotter også frekvensresponsen for ulike filterlengder. Time Domain Response: På den første plottet har vi inngangen som går inn i det bevegelige gjennomsnittsfilteret. Inngangen er støyende og målet vårt er å redusere støyen. Neste figur er utgangsresponsen til et 3-punkts Moving Average-filter. Det kan utledes fra figuren at 3-punkts Flytende Gjennomsnitt-filteret ikke har gjort mye for å filtrere ut støyen. Vi øker filterkranene til 51 poeng, og vi kan se at støyen i utgangen har redusert mye, som er avbildet i neste figur. Vi øker kranen videre til 101 og 501, og vi kan observere at selv om støyen er nesten null, blir overgangene slått ut drastisk (observere skråningen på hver side av signalet og sammenligne dem med den ideelle murveggovergangen i vår innsats). Frekvensrespons: Fra frekvensresponsen kan det hevdes at avrullingen er veldig treg og stoppbåndet demper er ikke bra. Gitt dette stoppbåndet demping, klart, det bevegelige gjennomsnittlige filteret kan ikke skille ett bånd med frekvenser fra en annen. Som vi vet at en god ytelse i tidsdomene resulterer i dårlig ytelse i frekvensdomene, og omvendt. Kort sagt, det bevegelige gjennomsnittet er et usedvanlig godt utjevningsfilter (handlingen i tidsdomenet), men et uvanlig dårlig lavpassfilter (handlingen i frekvensdomenet) Eksterne lenker: Anbefalte bøker: Primær sidebjelkeMed gjennomsnittlig glidende gjennomsnitt GjennomsnittSimple glidende gjennomsnitt Du oppfordres til å løse denne oppgaven i henhold til oppgavebeskrivelsen, ved hjelp av hvilket språk du kanskje kjenner. Beregner det enkle glidende gjennomsnittet av en rekke tall. Opprett en stateful funksjonsklasseinstans som tar en periode og returnerer en rutine som tar et tall som argument og returnerer et enkelt bevegelige gjennomsnitt av sine argumenter så langt. Et enkelt glidende gjennomsnitt er en metode for å beregne et gjennomsnitt av en strøm av tall ved å bare gjennomsnitts de siste 160 P 160 tallene fra strømmen, 160 hvor 160 P 160 er kjent som perioden. Det kan implementeres ved å kalle en initialiseringsrutine med 160 P 160 som argument 160 I (P) 160, som deretter skal returnere en rutine som når det kalles med individuelle suksessive medlemmer av en strøm av tall, beregner gjennomsnittet av (opp til), de siste 160 P 160 av dem, lar vi ringe denne 160 SMA (). Ordet 160 stateful 160 i oppgavebeskrivelsen refererer til behovet for 160 SMA () 160 for å huske visse opplysninger mellom samtaler til den: 160 Perioden, 160 P 160 En bestilt beholder med minst de siste 160 P 160 tallene fra hver av sine individuelle samtaler. Statlig 160 betyr også at etterfølgende samtaler til 160 I (), 160 initialisereren, 160 skal returnere separate rutiner som gjør 160 ikke 160 delte lagrede tilstander, slik at de kan brukes på to uavhengige datastrømmer. Pseudo-kode for en implementering av 160 SMA 160 er: Denne versjonen bruker en vedvarende kø for å holde de nyeste p-verdiene. Hver funksjon som returneres fra init-moving-gjennomsnittet har sin tilstand i et atom som holder en køverdi. Denne implementeringen bruker en sirkulær liste for å lagre tallene i vinduet ved begynnelsen av hver iterasjonspeker refererer til listecellen som holder verdien bare flyttet ut av vinduet og erstattes med den verdiskapende verdien. Bruke en Closure-redigering For øyeblikket kan denne sma ikke være nok fordi den tildeler en lukning på bunken. Noen rømningsanalyser kan fjerne heapfordelingen. Bruke en Struktur-redigering Denne versjonen unngår brønnallokering av lukkingen som holder dataene i stakkrammen til hovedfunksjonen. Samme utgang: For å unngå at floating point-tilnærmingene fortsetter å vokse opp og vokse, kan koden utføre en periodisk sum på hele sirkulær køarrangementet. Denne implementeringen produserer to (funksjon) objekter delingstilstand. Det er idiomatisk i E for å skille inngang fra utgang (les fra skriv) i stedet for å kombinere dem til en gjenstand. Strukturen er den samme som implementeringen av Standard DeviationE. Eliksirprogrammet nedenfor genererer en anonym funksjon med en innebygd periode p, som brukes som perioden for det enkle glidende gjennomsnittet. Kjøringsfunksjonen leser numerisk inngang og overfører den til den nyopprettede anonyme funksjonen, og kontrollerer deretter resultatet til STDOUT. Utgangen vises nedenfor, med gjennomsnittet, etterfulgt av gruppert inngang, som danner grunnlaget for hvert glidende gjennomsnitt. Erlang har nedleggelser, men uutviklede variabler. En løsning er da å bruke prosesser og en enkel melding som passerer basert API. Matrix-språk har rutiner for å beregne glidningsavstandene for en gitt rekkefølge av elementer. Det er mindre effektivt å sløyfe som i følgende kommandoer. Fortløpende ber om en inngang I. som legges til enden av en liste L1. L1 kan bli funnet ved å trykke på 2ND1, og det finnes gjennomsnitt i ListOPS Trykk ON for å avslutte programmet. Funksjon som returnerer en liste som inneholder gjennomsnittlig data for det medfølgende argumentet Program som returnerer en enkel verdi ved hver påkalling: listen er listen som gjennomsnitt: p er perioden: 5 returnerer gjennomsnittslisten: Eksempel 2: Bruke programmet movinav2 (jeg , 5) - Initialisere glidende gjennomsnittlig beregning, og definer periode på 5 movinav2 (3, x): x - nye data i listen (verdi 3), og resultatet lagres på variabel x og vises movinav2 (4, x) : x - nye data (verdi 4), og det nye resultatet lagres på variabel x, og vises (43) 2. Beskrivelse av funksjonen movinavg: variabel r - er resultatet (gjennomsnittslisten) som vil bli returnert variabel i - er indeksvariabelen, og den peker mot slutten av underlisten listen er i gjennomsnitt. variabel z - en hjelpesvariabel Funksjonen bruker variabel i for å bestemme hvilke verdier av listen som skal vurderes i neste gjennomsnittlige beregning. Ved hver iterasjon peker variabel jeg på den siste verdien i listen som vil bli brukt i gjennomsnittlig beregning. Så vi trenger bare å finne ut hvilken vil være den første verdien i listen. Vanligvis må du vurdere p-elementer, så det første elementet vil være det som er indeksert av (i-p1). Men ved de første iterasjonene vil denne beregningen vanligvis være negativ, slik at følgende ligning vil unngå negative indekser: maks (i-p1,1) eller ordne ligningen, maks (i-p, 0) 1. Men antall elementer på de første iterasjonene vil også være mindre, den riktige verdien vil være (sluttindeks - startindeks 1) eller, ordne ligningen, (i - (maks (ip, 0) 1) 1) og deretter , (i-max (ip, 0)). Variabel z har den vanlige verdien (max (ip), 0) slik at begynnelsesindeksen vil være (z1) og tallfeltene vil være (iz) midt (liste, z1, iz) returnere listen over verdi som vil være gjennomsnittlig sum .) vil summe dem sum (.) (iz) ri vil gjennomsnittlig dem og lagre resultatet på riktig sted i resultatlisten fp1 oppretter en delvis applikasjon som fastsetter (i dette tilfellet) andre og tredje parametere

No comments:

Post a Comment