Friday 3 November 2017

Flytte Gjennomsnittet Filter Maskinvare


Jeg mangerer noe for øyeblikket der jeg tar en mengde verdier over tid fra et maskinvarekompass Dette kompasset er veldig nøyaktig og oppdateres veldig ofte, med det resultat at hvis det jiggles litt, ender jeg med den merkelige verdien som er vilt I motsetning til naboene vil jeg glatte ut disse verdiene. Etter å ha gjort noe å lese rundt, ser det ut til at det jeg vil ha, er et høypassfilter, et lavpasfilter eller et bevegelige gjennomsnitt. Flytende gjennomsnitt kan jeg komme ned med, bare holde en historie om de siste 5 verdiene eller hva som helst, og bruk gjennomsnittet av disse verdiene nedstrøms i koden min, hvor jeg en gang bare brukte den nyeste verdien. Det burde, tror jeg, glatt ut de jiggles pent, men det slår meg som det er sannsynligvis ganske ineffektivt, og dette er sannsynligvis en av de kjente problemene til de riktige programmene som det er en veldig fin Clever Math-løsning. Jeg er imidlertid en av de forferdelige selvlærte programmene uten en formell utdanning i noe selv vagt relatert til CompSci eller Math Lese rundt litt tyder på at dette kan være et høyt eller lavt passfilter, men jeg kan ikke finne noe som forklarer i forståelse for en hack som meg, hvordan effekten av disse algoritmene ville være på en rekke verdier, la alene hvordan matematikken fungerer Svaret som er gitt her, for eksempel, svarer teknisk på spørsmålet mitt, men bare når det gjelder forståelig for de som trolig allerede vet hvordan de skal løse problemet. Det ville være en veldig fin og smart person som faktisk kunne forklare slags problem dette er, og hvordan løsningene fungerer, forståelig for en Arts graduate. asked 21 september 10 på 13 01. Hvis ditt bevegelige gjennomsnitt må være lang for å oppnå den nødvendige utjevningen, og du trenger ikke virkelig hvilken som helst bestemt form for kjernen, så blir du bedre hvis du bruker et eksponentielt forfallende glidende gjennomsnitt. Deretter velger du lite for å være en passende konstant, for eksempel hvis du velger liten 1 - 1 N, vil den ha samme mengde gjennomsnitt som et vindu av størrelse N, men distribueres annerledes over eldre poeng. Uansett, siden den neste verdien av det bevegelige gjennomsnittet bare avhenger av den forrige og dataene dine, må du ikke holde en kø eller noe. Og du kan tenke på dette som å gjøre noe som, vel, Jeg har et nytt poeng, men jeg stoler ikke på det, så jeg skal holde 80 av mitt gamle estimat av målingen, og bare stol på dette nye datapunktet 20 Det er stort sett det samme som å si, vel jeg bare stol på dette nye punktet 20, og jeg skal bruke 4 andre poeng som jeg stoler på i samme mengde, bortsett fra at i stedet for å eksplisitt ta de 4 andre poengene, antar du at gjennomsnittsverdien du gjorde sist var fornuftig, slik at du kan bruke din tidligere work. answered 21 september 10 på 14 27.Hey, jeg vet at dette er 5 år sent, men takk for et fantastisk svar Jeg m arbeider på et spill hvor lyden endres basert på hastigheten din, men på grunn av å kjøre spillet sakte - En datamaskin, hastigheten ville svinge vilt, noe som var fint for styring, men super irriterende i ter ms of sound Dette var en veldig enkel og billig løsning på noe jeg trodde ville være et veldig komplekst problem. Adam Mar 16 15 20 20. Hvis du prøver å fjerne en og annen merkelig verdi, er et lavpassfilter det beste av tre alternativer som du har identifisert lavpasningsfiltre tillater lavhastighetsendringer, for eksempel de som skyldes å rotere et kompass for hånd, mens du avviser høyhastighetsendringer, for eksempel de som skyldes støt på veien, for eksempel. Et glidende gjennomsnitt vil sannsynligvis ikke være tilstrekkelig, siden effekten av et enkelt blip i dataene dine vil påvirke flere påfølgende verdier, avhengig av størrelsen på det bevegelige gjennomsnittsvinduet. Hvis de ulike verdiene enkelt oppdages, kan du til og med være bedre med en glitch - fjerningsalgoritmen som fullstendig ignorerer dem. Her er en gigdiagram for å illustrere. Den første grafen er inngangssignalet, med en ubehagelig glitch. Den andre grafen viser effekten av et 10-sample glidende gjennomsnitt. Den endelige grafen er en kombinasjon av 10- prøve gjennomsnitt og th En enkel gjenkjenningsalgoritme vist ovenfor Når feilen oppdages, blir 10-prøve gjennomsnittet brukt i stedet for den faktiske verdien. Gjennomsnittlig gjennomsnitt kan jeg komme ned med, men det ser ut til at det er sannsynligvis ganske ineffektivt. Det er virkelig ingen grunn til en glidende gjennomsnitt bør være ineffektivt Du beholder antall datapunkter du vil ha i noen buffer som en sirkulær kø På hvert nytt datapunkt poperer du den eldste verdien og trekker den fra en sum og trykker den nyeste og legger den til summen Så hvert nytt datapunkt innebærer egentlig bare et pop-trykk, et tillegg og en subtraksjon. Gjennomsnittlig glidende verdi er alltid denne forskyvningsbeløpet delt på antall verdier i bufferen. Det blir litt vanskeligere hvis du mottar data samtidig fra flere tråder, men siden dataene kommer fra en maskinvareenhet som synes svært tvilsom for meg. Åh og også forferdelige selvlærte programmører forene. Det bevegelige gjennomsnittet virket ineffektivt for meg fordi du må lagre en buffer av verdier - bedre å bare gjøre noen klare matematikk med inntaksverdi og nåværende arbeidsverdi Jeg tror det er hvordan eksponentiell glidende gjennomsnittlig arbeid En optimalisering jeg har sett for denne typen bevegelige gjennomsnitt innebærer å bruke en fastlengdekø en peker til hvor du er i den køen, og bare innpakker pekeren rundt med eller en hvis Voila Ingen dyr push push Kraft til amatørene, bror Henry Cooke 22. september 10 på 0 54. Henry For et glatt gjennombruddsmiddel trenger du bare bufferen slik at du vet hvilken verdi som blir poppet Når den neste verdien blir presset Når det er sagt, er den faste lengden køen en peker du beskriver, akkurat hva jeg mente med sirkulær kø Det er derfor jeg sa det er ikke ineffektivt Hva syntes du jeg mente Og hvis svaret ditt er en matrise som skifter sine verdier tilbake på hver indeksert fjerning som std vektor i C brønnen, så er jeg så skadet jeg vil ikke engang snakke med deg lenger Dan Tao 22. september 10 på 1 58. Henry Jeg vet ikke om AS3, men en Java-programmerer har samlinger som CircularQueue til sin disposisjon jeg er ikke en Java-utvikler, så jeg er sikker på at det finnes bedre eksempler der ute, det er bare det jeg fant av et raskt Google-søk, som nøyaktig utfører funksjonaliteten vi snakker om, jeg er ganske sikker på at flertallet av mellomstore - og språk på lavt nivå med standardbibliotek har noe lignende, for eksempel der er køen T Uansett var jeg filosofi selv, så alt er tilgitt. Dan Tao 22. september 10 på 12 44. Et eksponentielt forfallende glidende gjennomsnitt kan beregnes for hånd med bare trend hvis du bruker de riktige verdiene Se for en ide om hvordan du gjør dette raskt med en penn og papir hvis du er ute etter eksponentielt glatt glatt gjennomsnitt med 10 utjevning. Men siden du har en datamaskin, vil du sannsynligvis gjøre binær skifting som i motsetning til desimalforskyvning. Denne måten er alt du trenger, en variabel for din nåværende verdi og en for gjennomsnittet. Det neste gjennomsnittet kan da beregnes fra that. answered 21 september 10 på 14 39. det var en teknikk som heter en rekkevidde gate t hatten fungerer bra med lav forekomst av falske prøver, forutsatt at bruk av en av filterteknikkene som er nevnt ovenfor, beveger seg gjennomsnittlig, eksponentiell, når du har tilstrekkelig historie en tidskonstant, kan du teste den nye innkommende datasammen med rimelighet før det legges til beregningen. noen kjennskap til den maksimale fornuftige endring av signalet er nødvendig, er den raske prøven sammenlignet med den siste glattede verdien, og hvis absoluttverdien av denne forskjellen er større enn det tillatte området, blir prøven kastet ut eller erstattet med noen heuristiske, for eksempel en prediksjon basert på skrå differensial eller trend prediksjon verdien fra dobbel eksponensiell utjevning. Ansatt April 30 16 ved 6 56. Forskeren og ingeniør s Guide til digital signalbehandling av Steven W Smith, Ph D. Kapittel 15 Flytte gjennomsnittlige filtre. Relativer for den bevegelige gjennomsnittsfiltret. I en perfekt verden ville filterdesignere bare måtte håndtere tiddomene eller frekvensdomenekodet informasjon, men aldri en blanding av de to i det samme signalet Dessverre er det noen applikasjoner der begge domenene er samtidig viktige. For eksempel faller TV-signaler inn i denne ekkelkategorien. Videoinformasjon er kodet i tidsdomene, det vil si formen på bølgeformen korresponderer til lysstyrkenes mønstre i bildet Imidlertid behandles videosignalet under overføring av videosignalet i henhold til frekvenssammenstillingen, for eksempel total båndbredde, hvordan bærebølger for lydfarge legges til, eliminering restaurering av DC-komponenten osv. Som et annet eksempel , er elektromagnetisk interferens best forstått i frekvensdomenet, selv om signalinformasjonen er kodet i tidsdomene. For eksempel kan temperaturmåleren i et vitenskapelig eksperiment være forurenset med 60 hertz fra kraftledninger, 30 kHz fra en vekselstrømforsyning, eller 1320 kHz fra en lokal AM-radiostasjon. Tilhenger av det bevegelige gjennomsnittsfilteret har bedre frekvensdomener nce og kan være nyttig i disse blandede domeneapplikasjoner. Multiple-pass-glidende gjennomsnittlige filtre innebærer å sende inngangssignalet gjennom et bevegelig gjennomsnittlig filter to eller flere ganger Figur 15-3a viser den samlede filterkjernen som resulterer fra en, to og fire passerer to passerer tilsvarer bruk av en trekantet filterkjerne en rektangulær filterkjerne som er forbundet med seg selv Etter fire eller flere passerer, ser den tilsvarende filterkjernen ut som en Gaussisk tilbakekalling av den sentrale grenseretningen. Som vist i b, produserer flere passerer et s-formet trinnsvar, som sammenlignet med den rette linjen i enkeltpasset Frekvensresponsene i c og d er gitt av Eq 15-2 multiplisert med seg selv for hvert pass. Dvs., hver gang domenekonvolusjon resulterer i en multiplikasjon av frekvensspektrene. Figur 15-4 viser frekvensresponsen til to andre slektninger av det bevegelige gjennomsnittsfilteret Når en ren Gaussian brukes som en filterkjerne, er frekvensresponsen også en Gauss, som omtalt i kapittel 11 T Han Gauss er viktig fordi det er impulsresponsen til mange naturlige og menneskeskapte systemer. For eksempel vil en kort lyspuls inn i en lang fiberoptisk overføringslinje gå ut som en Gaussisk puls på grunn av de forskjellige veiene tatt av fotene i fiberen Den gaussiske filterkjernen brukes også mye i bildebehandlingen fordi den har unike egenskaper som tillater raske todimensjonale konvolutter, se kapittel 24 Det andre frekvensresponset i figur 15-4 tilsvarer bruk av et Blackman-vindu som en filterkjerne. Termvinduet har ingen betyr her er det bare en del av det aksepterte navnet på denne kurven. Den nøyaktige formen til Blackman-vinduet er gitt i kapittel 16 Eq 16-2, figur 16-2. Det ser likevel ut som en gauss. Hvordan er disse slektninger av den bevegelige gjennomsnittlig filter bedre enn det bevegelige gjennomsnittsfilteret selv Tre måter Først og viktigst, disse filtrene har bedre stoppbåndsdemping enn det bevegelige gjennomsnittsfilteret. For det andre taper filterkjernene til en mindre amplitude i nærheten av enden Husk at hvert punkt i utgangssignalet er en vektet sum av en gruppe prøver fra inngangen Hvis filterkjernen fester, blir prøver i inngangssignalet som er lengre unna gitt mindre vekt enn de som ligger i nærheten av Tredje, trinnresponsene er glatte kurver, i stedet for den raske rettlinjen til det bevegelige gjennomsnittet. Disse to sistnevnte er vanligvis av begrenset nytte, selv om du kanskje finner applikasjoner der de er ekte fordeler. Det bevegelige gjennomsnittsfilteret og dets slektninger handler om det samme ved reduserer tilfeldig støy mens du opprettholder et skarpt trinnrespons Tvetydigheten ligger i hvordan reaksjonstiden for trinnresponsen måles Hvis reistiden måles fra 0 til 100 av trinnet, er det glidende gjennomsnittsfilter det beste du kan gjøre, som tidligere vist i sammenligning, måling av risetid fra 10 til 90 gjør Blackman-vinduet bedre enn det bevegelige gjennomsnittsfilteret. Poenget er, dette er bare teoretisk skjever, vurder disse filtene like i denne parameteren. Den største forskjellen i disse filtrene er utførelseshastighet. Ved hjelp av en rekursiv algoritme som beskrives neste, vil det bevegelige gjennomsnittsfilteret løpe som lyn i datamaskinen. Faktisk er det det raskeste digitale filteret tilgjengelig. Flere passerer av det bevegelige gjennomsnittet vil være tilsvarende langsommere , men fortsatt veldig rask Til sammenligning er de gaussiske og blackman-filtre ubøyelig sakte, fordi de må bruke konvolusjon Tenk en faktor på ti ganger antall poeng i filterkjernen basert på multiplikasjon er omtrent 10 ganger langsommere enn tillegg. Forventer for eksempel en 100-punkts gussisk til å være 1000 ganger langsommere enn et bevegelige gjennomsnittsmål ved hjelp av rekursjon. Som andre har nevnt, bør du vurdere et IIR uendelig impulsresponsfilter i stedet for det FIR-finale impulsresponsfilteret du bruker nå. Det er mer til det, men på første blikk FIR-filtre er implementert som eksplisitte konvolutter og IIR-filtre med ligninger. Det spesielle IIR-filteret bruker jeg mye i mikrofon rocontrollers er et enkeltpolet lavpasfilter Dette er den digitale ekvivalenten til et enkelt RC-analogfilter. For de fleste applikasjoner vil disse ha bedre egenskaper enn det boksfilteret du bruker. De fleste bruksområder av et boksfilter jeg har opplevd er et resultat av noen som ikke betaler oppmerksomhet i digital signalbehandlingsklasse, ikke som følge av at de trenger spesielle egenskaper. Hvis du bare vil dempe høyfrekvenser som du vet er støy, er et enkeltpolet lavpasfilter bedre. Den beste måten å implementere en digitalt på i en microcontroller er vanligvis. FILT - FILT FF NEW - FILT. FILT er et stykke vedvarende tilstand Dette er den eneste vedvarende variabelen du trenger å beregne dette filteret NYTT er den nye verdien som filteret blir oppdatert med denne iterasjonen FF er filteret brøkdel som justerer filterets tyngde Se på denne algoritmen og se at for FF 0 er filteret uendelig tungt siden utgangen aldri endres. For FF 1 er det egentlig ingen filter på alt siden utgangen følger bare inngangen Nyttige verdier er mellom På små systemer velger du FF til å være 1 2 N slik at multipliseringen med FF kan oppnås som en rettforskyvning med N biter. For eksempel kan FF være 1 16 og multipliserer med FF derfor en riktig skift på 4 biter Ellers trenger dette filteret bare en avtrekk og ett tillegg, selv om tallene vanligvis må være bredere enn inngangsverdien mer på numerisk presisjon i et eget avsnitt nedenfor. Jeg bruker vanligvis AD-lesinger betydelig raskere enn de trengs, og bruk to av disse filtre kaskad Dette er den digitale ekvivalenten til to RC-filtre i serie og demper med 12 dB oktav over rolloff-frekvensen. Men for AD-avlesninger er det vanligvis mer relevant å se på filteret i tidsdomene ved å vurdere trinnresponsen Dette forteller deg hvor fort systemet ditt vil se en endring når tingen du måler endringer. For å lette utformingen av disse filtrene, som bare betyr å plukke FF og bestemme hvor mange av dem til å kaskade, bruker jeg mitt program FILTBITS Du angir antall skiftbiter for hver FF i den kaskade serien av filtre, og den beregner trinnsvaret og andre verdier. Egentlig kjører jeg vanligvis dette via min wrapper script. PLOTFILT Dette kjører FILTBITS, som lager en CSV-fil, og plottar deretter CSV-filen For eksempel, her er resultatet av PLOTFILT 4 4.De to parameterne til PLOTFILT betyr at det vil være to filtre kaskade av typen beskrevet ovenfor. Verdiene 4 angir antall skiftbiter til realiser multiplikasjonen med FF De to FF-verdiene er derfor 1 16 i dette tilfellet. Det røde sporet er enhetens trinnrespons, og er det viktigste å se på. Dette for eksempel forteller deg at hvis inngangen endres øyeblikkelig, blir utgangen av det kombinerte filteret vil bosette seg til 90 av den nye verdien i 60 iterasjoner. Hvis du bryr deg om 95 oppgjørstid, må du vente på 73 iterasjoner, og i 50 oppgjørstid bare 26 iterasjoner. Det grønne sporet viser utdataene fra en enkelt full amplitud e spike Dette gir deg en ide om tilfeldig støyundertrykking. Det ser ut til at ingen enkelt prøve vil forårsake mer enn en 2 5 endring i utgangen. Det blå sporet er å gi en subjektiv følelse av hva dette filteret gjør med hvit støy. Dette er ikke en streng test siden det ikke er noen garanti for hvor nøyaktig innholdet av tilfeldige tall ble plukket som den hvite støyinngangen for denne runden av PLOTFILT. Det er bare for å gi deg en grov følelse av hvor mye det blir squashed og hvor glatt det er. PLOTFILT, kanskje FILTBITS, og mange andre nyttige ting, spesielt for PIC-fastvareutvikling, er tilgjengelig i PIC Development Tools-programvareutgivelsen på min nedlastinger for programvare. I tillegg til numerisk presisjon. Jeg ser fra kommentarene og nå et nytt svar at det er interessert i å diskutere antall bits som trengs for å implementere dette filteret Merk at multipliseringen med FF vil skape Log 2 FF nye biter under binærpunktet På små systemer blir FF vanligvis valgt til å være 1 2 N slik at denne multipliseringen er ac tually realisert ved en rett forskyvning av N bits. FILT er derfor vanligvis et fast punkt heltall. Merk at dette ikke endrer noen av matematikken fra prosessorens synspunkt. For eksempel, hvis du filtrerer 10 bit AD-avlesninger og N 4 FF 1 16, så trenger du 4 brøkdeler under 10 biters heltall-AD-avlesninger. En av de fleste prosessorer gjør at du gjør 16 biters heltall operasjoner på grunn av 10-biters AD-avlesning. I dette tilfellet kan du likevel gjøre nøyaktig de samme 16 biters heltalloperasjoner , men begynner med AD-lesingene til venstre skiftet av 4 biter Prosessoren vet ikke forskjellen og trenger ikke å gjøre matematikken på hele 16 bit heltall fungerer, om du anser dem for å være 12 4 fast punkt eller ekte 16 bit heltall 16 0 fast punkt. Generelt må du legge til N biter hver filterpole hvis du ikke vil legge til lyd på grunn av den numeriske representasjonen. I eksemplet ovenfor må det andre filteret på to ha 10 4 4 18 biter for ikke å miste informasjon I praksis på en 8-bits maskin som betyr yo ut bruk 24 bit verdier Teknisk bare den andre polen på to ville trenge den bredere verdien, men for fastvare enkelhet bruker jeg vanligvis den samme representasjonen, og dermed den samme koden, for alle polene i et filter. Vanligvis skriver jeg en subrutine eller makro til utfør en filterpoleoperasjon, og bruk deretter den til hver pølle Enten en subrutine eller makro avhenger av om sykluser eller programminnet er viktigere i det aktuelle prosjektet. Uansett, bruker jeg noen skrapelodus til å sende NEW til subrutinen makroen, som oppdaterer FILT , men laster også inn i den samme riper staten NYTT var i Dette gjør det enkelt å bruke flere poler siden den oppdaterte FILT av en pol er den NYE av den neste. Når en subrutine er, er det nyttig å ha en pointer punkt til FILT på veien i, som oppdateres til like etter FILT på vei ut På den måten fungerer subrutinen automatisk på etterfølgende filtre i minnet hvis det kalles flere ganger. Med en makro trenger du ikke en peker siden du sender inn adressen til operere på hver iteration. Code Examples. Here er et eksempel på en makro som beskrevet ovenfor for en PIC 18.Og her er en lignende makro for en PIC 24 eller dsPIC 30 eller 33.But disse eksemplene implementeres som makroer ved hjelp av min PIC assembler preprosessor som er bedre enn noen av de innebygde makroanleggene. clabacchio Et annet problem jeg burde ha nevnt, er implementering av fastvare Du kan skrive en enkeltpolet lavpassfilter subrutine en gang, og deretter bruke den flere ganger Faktisk skriver jeg vanligvis en slik subrutine for å ta en peker i minnet til filtertilstanden, så har du det på forhånd pekeren slik at den kan kalles i rekkefølge lett for å realisere flerpolige filtre Olin Lathrop Apr 20 12 til 15 03.1 Takk for svarene dine - alle av dem bestemte jeg meg for å bruke dette IIR-filteret, men dette filteret brukes ikke som et Standard LowPass-filter, siden jeg trenger gjennomsnittlige counterverdier og sammenligner dem for å oppdage endringer i et bestemt område, siden disse verdiene er av svært forskjellige dimensjoner avhengig av maskinvare jeg ønsket å ta et gjennomsnitt for å kunne reagere på disse maskinvarene spesifikke endringer automatisk senselen 21 mai 12 kl 12 06. Hvis du kan leve med begrensningen av en kraft på to antall elementer til gjennomsnittet, dvs. 2,4,8,16,32 etc, kan dividen enkelt og effektivt gjøres på en lav ytelse mikro med ingen dedikert deling fordi det kan gjøres som en bit skift Hvert skift høyre er en kraft på to f. eks. OPen trodde han hadde to problemer, delt i en PIC16 og minne for hans ring buffer Dette svaret viser at delingen Det er ikke vanskelig. Det tar ikke opp minneproblemet, men SE-systemet tillater delvise svar, og brukerne kan ta noe fra hvert svar for seg selv, eller til og med redigere og kombinere andre svar. Siden noen av de andre svarene krever en splittelse, er likevel ufullstendig fordi de ikke viser hvordan man effektivt oppnår dette på en PIC16 Martin 20 april 12 på 13 01. Det er et svar på et ekte glidende gjennomsnittsfilter aka boxcar filter med mindre minnebehov, hvis du ikke har det galt, kalt et kaskadeintegrator-kamfilter CIC Ideen er at du har en integrator som du tar forskjeller over en tidsperiode, og nøkkelminnebesparende enheten er at ved nedsampling behøver du ikke å lagre eve ry verdi av integratoren Det kan implementeres ved hjelp av følgende pseudokode. Din effektive bevegelige gjennomsnittslengde er decimationFactor stateize, men du trenger bare å beholde stateize-prøver. Selvfølgelig kan du få bedre ytelse dersom stateize og decimationFactor er krefter på 2, slik at divisjon og resten operatører blir erstattet av skift og maske-og. Postscript Jeg er enig med Olin om at du alltid bør vurdere enkle IIR-filtre før et glidende gjennomsnittlig filter. Hvis du ikke trenger frekvens-nullene til et boxcarfilter, en 1-polet eller 2-polet lavpasfilter vil trolig fungere fint. Hvis du imidlertid filtrerer med henblikk på dekimering, tar du en høyprøve-hastighetsinngang og gjennomsnittsverdi den for bruk ved en lavprosessprosess, da et CIC-filter kan være akkurat det du leter etter, spesielt hvis du kan bruke stateize 1 og unngå ringbufferen helt med bare en enkelt tidligere integrator verdi. Det er noen grundig analyse av matematikken bak ved å bruke de første ordene er IIR-filteret som Olin Lathrop allerede har beskrevet over på Digital Signal Processing-stakkutvekslingen, inneholder mange flotte bilder. Ligningen for dette IIR-filteret er. Dette kan implementeres ved hjelp av heltall, og ingen deling ved hjelp av følgende kode kan trenge litt feilsøking som jeg var å skrive fra minnet. Dette filteret tilnærmer et glidende gjennomsnitt av de siste K-prøvene ved å sette verdien av alfa til 1 K Gjør dette i forrige kode ved å definere BITS til LOG2 K, dvs. for K 16 sett BITS til 4, for K 4 sett BITS til 2, etc. Jeg vil verifisere koden som er oppført her så snart jeg får en endring og rediger dette svaret hvis nødvendig. Ansatt Jun 23 12 kl 04 04. Her er enpolet lavpasfilter glidende gjennomsnitt, med cutoff frekvens CutoffFrequency Svært enkel, veldig rask, fungerer bra, og nesten ingen minne overhead. Note Alle variabler har omfang utover filterfunksjonen, bortsett fra det passerte i newInput. Note Dette er et enkeltstadiefilter Flere stadier kan bli kaskad sammen for å øke skarphet av filteret Hvis du bruker mer enn ett trinn, må du justere DecayFactor som angår Cutoff-Frequency for å kompensere. Og åpenbart alt du trenger er de to linjene plassert hvor som helst, de trenger ikke egen funksjon. Dette filteret har en rampetid før det bevegelige gjennomsnittet representerer det av inngangssignalet. Hvis du trenger å omgå denne oppkjøretiden, kan du bare initialisere MovingAverage til den første verdien av newInput istedenfor 0, og håper at den første newInput ikke er en outlier. CutoffFrequency SampleRate har en rekkevidde mellom 0 og 0 5 DecayFactor er en verdi mellom 0 og 1, vanligvis i nærheten av 1.Single-presisjon flyter er gode nok for de fleste ting, jeg foretrekker bare dobbeltrom Hvis du trenger å holde fast med heltall, kan du konvertere DecayFactor og Amplitude Factor til brøkdelte tall, hvor telleren er lagret som heltallet, og nevneren er et heltall på 2, slik at du kan bitskifte til høyre som nevner i stedet for å måtte dele seg under filtersløyfen For For eksempel, hvis DecayFactor 0 99, og du vil bruke heltall, kan du angi DecayFactor 0 99 65536 64881 Og så når du multipliserer med DecayFactor i filtersløyfen, skift du bare resultatet 16.For mer informasjon om dette, en utmerket bok som s online, kapittel 19 om rekursive filtre. PS For det Moving Average paradigmet, en annen tilnærming til å sette DecayFactor og AmplitudeFactor som kan være mer relevant for dine behov, la oss si at du vil ha det forrige, ca 6 elementer i gjennomsnitt tog eter, gjør det diskret, du d legger til 6 elementer og deler med 6, slik at du kan sette AmplitudeFactor til 1 6 og DecayFactor til 1 0 - AmplitudeFactor. answered 14 mai 12 på 22 55. Alle andre har kommentert grundig på verktøyet av IIR vs FIR, og på power-of-two divisjon Jeg vil bare gi noen implementasjonsdetaljer. Nedenfor fungerer bra på små mikrocontrollere uten FPU. Det er ingen multiplikasjon, og hvis du beholder N en kraft på to, vil hele divisjonen er single-cycle bit-shifting. Basic FIR ring buffer holde en kjører buffer av de siste N verdiene, og en kjører SUM av alle verdiene i bufferen Hver gang en ny prøve kommer inn, trekker du den eldste verdien i bufferen fra SUM , erstatt den med den nye prøven, legg til den nye prøven til SUM, og utdata SUM N. Modified IIR ringbufferen holde en løpende SUM av de siste N-verdiene Hver gang en ny prøve kommer inn, SUM - SUM N, legger du til den nye prøve og utdata SUM N. answered 28 Aug 13 på 13 45. Hvis jeg leser deg riktig, beskriver du en første ordre IIR filtrere verdien du trekker, er ikke den eldste verdien som faller ut, men er i stedet gjennomsnittet av tidligere verdier. Førstegangs IIR-filtre kan sikkert være nyttig, men jeg er ikke sikker på hva du mener når du foreslår at utgangen er den samme for alle periodiske signaler Ved en 10 kHz samplingsfrekvens vil fôring av en 100 Hz firkantbølge i et 20-trinns boksfilter gi et signal som stiger jevnt for 20 prøver, sitter høyt for 30, faller jevnt for 20 prøver og sitter lavt for 30 En førstegangs IIR filter supercat Aug 28 13 til 15 31. vil gi en bølge som skarpt begynner å stige og gradvis avtar nær, men ikke ved inngangs maksimum, så begynner det å falle og gradvis avstand nær, men ikke ved inngangen minimum Svært ulik adferd supercat Aug 28 13 til 15 32. Et problem er at et enkelt bevegelige gjennomsnitt kan eller ikke kan være nyttig Med et IIR-filter kan du få et fint filter med relativt få beregninger. Den FIR du beskriver kan bare gi deg en rektangel i tid - en sync i freq - og du kan ikke styre sidelobene. Det kan være vel verdt det å kaste inn noen få heltall multipliserer for å gjøre det til en fin symmetrisk tunbar FIR hvis du kan spare klokken ticks Scott Seidman Aug 29 13 på 13 50. ScottSeidman Nei behov for multipliserer hvis man bare har hvert trinn i FIR, enten utdataene gjennomsnittet av inngangen til det stadiet og dets tidligere lagrede verdi, og deretter lagre inngangen hvis man har numerisk rekkevidde, man kan bruke summen heller enn gjennomsnittet, enten det s bedre enn et boksfilter avhenger av applikasjonen, vil trinnresponsen til et boksfilter med en total forsinkelse på 1 ms for eksempel ha en stygg d2 dt spike når inngangen endres, og igjen 1 m senere, men vil ha det minste mulige d dt for et filter med totalt 1ms forsinkelse supercat Aug 29 13 på 15 25. Hvis mikeselektriske stoffer sa at hvis du virkelig trenger å redusere minnebehovet, og du ikke husker at ditt impulsrespons er eksponentielt i stedet for en rektangulær puls, ville gå for en eksponentiell flytende ave raser filter Jeg bruker dem i stor grad Med den typen filter trenger du ikke noen buffer Du trenger ikke å lagre N forbi prøvene Bare en Så, dine minnekrav blir kuttet ned med en faktor N. Også du trenger ikke noen divisjon for det Bare multiplikasjoner Hvis du har tilgang til flytpunkt-aritmetikk, bruk flytende punktmultiplikasjoner Ellers gjør vi multipeltall og skift til høyre Vi er imidlertid i 2012, og jeg vil anbefale deg å bruke kompilatorer og MCUer som tillater deg for å arbeide med flytende punktnumre. I tillegg til å være mer minneeffektiv og raskere, trenger du ikke å oppdatere elementer i noen sirkulær buffer, jeg vil si det er også mer naturlig fordi en eksponentiell impulsrespons passer bedre til måten naturen oppfører seg, i de fleste tilfeller. ansvaret 20. april 12 på 9 59. Et problem med IIR-filteret som nesten berørt av olin og supercat, men tilsynelatende ignorert av andre, er at avrundingen introduserer noe upresisjon og potensielt bias trunkering forutsatt at N jeg en kraft av to, og bare heltall aritmetikk er brukt, skiftet rett eliminerer systematisk LSBene i den nye prøven. Det betyr at hvor lenge serien kan være, vil gjennomsnittet aldri ta hensyn til disse. For eksempel antar du sakte fallende serie 8,8,8 8,7,7,7 7,6,6, og antar at gjennomsnittet faktisk er 8 i begynnelsen. Neven 7-prøven vil gi gjennomsnittet til 7, uansett filterstyrken Bare for en prøve Samme historie for 6 osv. Tenk på det motsatte serien går opp. Gjennomsnittet vil forbli på 7 for alltid, inntil prøven er stor nok til å gjøre det endres. Selvfølgelig kan du korrigere for bias ved å legge 1 2 N 2, men som vant t virkelig løse presisjon problemet i så fall vil den avtagende serien forbli for alltid ved 8 til prøven er 8-1 2 N 2 For N 4 for eksempel vil enhver prøve over null holde gjennomsnittet uendret. Jeg tror en løsning for Det ville innebære å holde en akkumulator av de tapte LSBene. Men jeg gjorde det ikke så langt å ha kode klar, og jeg er ikke sikker på at det ikke ville skade IIR-strømmen i noen andre tilfeller av serier, for eksempel om 7,9,7,9 ville gjennomsnittlig til 8 da. Olin, din to-trinns kaskade vil også trenge en forklaring. Mener du å holde to gjennomsnittsverdier med resultatet av den første som er matet inn i det andre i hver iterasjon. Hva er fordelen med dette.

No comments:

Post a Comment