Thursday 2 November 2017

Flytting Gjennomsnitt Filter C Kildekoden


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 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 inngangsvariabler, kanskje kopiering av hvert inngang til en eldre inputvariable og deretter beregning av det nye glidende gjennomsnittet. Som summen av de 4 inngangsvariablene delt med 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 vet at dette kan oppnås 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 flytting gjennomsnitt 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 addreplaced, unngå kostbare O (N) traversal å beregne summen som trengs for gjennomsnittet - on demand. 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:27Man filter, eller gjennomsnittlig filter Kategori. Programvareutvikling for digitalt signal og bildebehandling (DSP og DIP). Abstrakt. Artikkelen er en praktisk veiledning for gjennomsnittlig filter, eller gjennomsnittlig filterforståelse og - implementering. Artikkelen inneholder teori, C kildekode, programmeringsinstruksjoner og prøveapplikasjon. 1. Introduksjon til gjennomsnittlig filter, eller gjennomsnittlig filter Gjennomsnittlig filter. eller gjennomsnittlig filter er windowed filter av lineær klasse, som jevner signalet (bilde). Filteret fungerer som lavpass en. Den grunnleggende ideen bak filteret er for ethvert element av signalet (bildet) et gjennomsnitt over hele nabolaget. For å forstå hvordan det gjøres i praksis, la oss begynne med vinduets ide. 2. Filter vindu eller maske La oss forestille oss, bør du lese et brev og det du ser i tekst begrenset av hull i spesiell stencil som dette. Så, resultatet av lesing er lyd t. Ok, la oss lese brevet igjen, men ved hjelp av en annen stencil: Nå er resultatet av å lese t lyd 240. La oss gjøre det tredje forsøket: Nå leser du brev t som lyd 952. Hva skjer her Å si det I matematisk språk, gjør du en operasjon (lesing) over element (bokstav t). Og resultatet (lyden) avhenger av elementet nabolaget (bokstaver ved siden av t). Og den stencilen, som bidrar til å hente elementet nabolag, er vindu Ja, vinduet er bare en stencil eller et mønster, ved hjelp av hvilket du velger elementet nabolaget 0151 et sett med elementer rundt den givne 0151 for å hjelpe deg med å ta avgjørelse. Et annet navn for filtervindu er maske 0151 maske er en stencil, som skjuler elementer vi ikke betaler oppmerksomhet til. I vårt eksempel er elementet vi opererer på plassert på venstre side av vinduet, men i praksis er dens vanlige posisjon midt i vinduet. La oss se noen vindueksempler. I en dimensjon. Fig. 4. Vindu eller maske av størrelse 5 i 1D. I to dimensjoner. Fig. 5. Vindu eller maske av størrelse 3times3 i 2D. I tre dimensjoner. Tenk på bygging. Og nå mdash om rom i den bygningen. Rommet er som 3D-vindu, noe som skjærer ut noe underrom fra hele rommet. Du kan finne 3D-vindu i volum (voxel) bildebehandling. 3. Forstå gjennomsnittlig filter Nå la oss se hvordan å ldquotake et gjennomsnitt over elementer neighborhoodrdquo. Formelen er enkle 0151 oppsummeringselementer og deler summen av antall elementer. La oss for eksempel beregne et gjennomsnitt for saken, vist i fig. 7. Fig. 7. Ta et gjennomsnitt. Og det er alt. Ja, vi har bare filtrert 1D-signal ved gjennomsnittlig filter. La oss lage CV og skrive ned trinnvise instruksjoner for behandling av gjennomsnittlig filter. Gjennomsnittlig filter eller gjennomsnittlig filteralgoritme: Sett et vindu over elementet. Ta en gjennomsnittlig oppsummeringselement på 0151 og del summen av antall elementer. Nå, når vi har algoritmen, er det på tide å skrive noen kode mdash la oss komme ned til programmering. 4. 1D gjennomsnittlig filterprogrammering I denne delen utvikler vi 1D-middelfilter med vindu med størrelse 5. La oss få 1D-signal med lengde N som inngang. Det første trinnet er å plassere vinduet 0151, vi gjør det ved å endre indeksen for det ledende elementet: Vær oppmerksom på at vi starter med det tredje elementet og avsluttes med det siste, men to. Problemet er at vi ikke kan starte med det første elementet, fordi i dette tilfellet er venstre del av filtervinduet tomt. Vi vil diskutere nedenfor, hvordan du løser dette problemet. Det andre trinnet tar gjennomsnittet, ok: Nå, la oss skrive ned algoritmen som funksjon: Typeelementet kan defineres som: 5. Behandling av kanter For alle vindusfiltre er det noe problem. Det er kanten behandling. Hvis du plasserer vinduet over første (siste) elementet, vil venstre (høyre) del av vinduet være tomt. For å fylle gapet, bør signalet forlenges. For gjennomsnittlig filter er det god ide å utvide signal eller bilde symmetrisk, slik: Så før signalet sendes til vår gjennomsnittlige filterfunksjon, bør signalet utvides. La oss skrive ned wrappen, som gjør alle forberedelser. Som du ser, tar vår kode hensyn til noen praktiske problemer. Først og fremst sjekker vi innspillparametrene 0151 signalet skal ikke være NULL, og signallengden skal være positiv: Andre trinn 0151 vi sjekker tilfelle N1. Denne saken er spesiell en, for å bygge utvidelse trenger vi minst to elementer. For signalet med 1 elementlengde er resultatet selve signalet. Vær også oppmerksom på at vårt gjennomsnittlige filter fungerer på plass, hvis utgangsparameterresultatet er NULL. La oss nå tildele minne for signalutvidelse. Og sjekk minneallokering.

No comments:

Post a Comment