Sunday 19 November 2017

Flytting Gjennomsnitt Filter Mikrokontroller


En av hovedapplikasjonene til Arduino-brettet er lesing og logging av sensordata. For eksempel overvåker man trykket hvert sekund av dagen. Som høye samplingsfrekvenser genererer ofte pigger i grafene, men man vil også ha et gjennomsnitt av målingene. Da målingene ikke er statiske i tide, er det ofte et løpende gjennomsnitt som vi ofte trenger. Dette er gjennomsnittet av en viss periode og svært verdifull når du gjør trendanalyse. Enkeleste form for et løpende gjennomsnitt kan gjøres med kode som bygger på forrige løpende gjennomsnitt: Hvis man ikke vil bruke flytende punktmatematikk - da dette tar opp minne og reduserer hastighet - kan man gjøre det samme helt i heltalldomenet. Divisjonen med 256 i prøvekoden er en shift-høyre 8, som er raskere enn å si divisjonen ved f. eks. 100. Dette gjelder for hver kraft av 2 som divider og en må bare passe summen av veiene er lik kraften til 2. Og selvfølgelig må man passe på at det ikke er mellomliggende overløp (vurdere å bruke usignert lenge) Hvis du trenger Et mer nøyaktig løpende gjennomsnitt, i konkret fra de siste 10 målingene, trenger du en matrise (eller lenket liste) for å holde dem. Dette arrayet fungerer som en sirkulær buffer og med hver ny måling fjernes den eldste. Running gjennomsnittet beregnes som summen av alle elementene dividert med antall elementer i gruppen. Koden for løpende gjennomsnitt vil være noe slikt: Ulempen med denne koden er at arrayet for å holde alle verdier kan bli ganske stort. Hvis du har en måling per sekund, og du vil ha et løpende gjennomsnitt per minutt, trenger du en rekkevidde på 60 en gjennomsnittlig per time, trenger en rekkevidde på 3600. Det kunne ikke gjøres på denne måten på en Arduino, da den bare har 2K RAM. Men ved å bygge et 2-trinns gjennomsnitt kan det nærmer seg ganske bra (ansvarsfraskrivelse: ikke for alle målinger). I psuedo-kode: Som et nytt internt statisk system er nødvendig for hver runningAverage-funksjon, skriker dette for å bli implementert som en klasse. RunningAverage-biblioteket RunningAverage-biblioteket gjør en klasse av funksjonen over, slik at den kan brukes flere ganger i en skisse. Den decouples add () og avg () - funksjonen til å være litt mer fleksibel, f. eks. man kan ringe gjennomsnittet flere ganger uten å legge til noe. Vær oppmerksom på at hver forekomst av klassen legger til sitt eget array for å holde målinger, og at dette legger til minnebruken. Grensesnittet til klassen holdes så lite som mulig. Merk: med versjon 0.2 er navnene på metodene alle gjort mer beskrivende. En liten skisse viser hvordan den kan brukes. En tilfeldig generator brukes til å etterligne en sensor. I oppsettet () er myRAen fjernet, slik at vi kan begynne å legge til nye data. I loop () først genereres et tilfeldig tall og konverteres til en float som skal legges til myRA. Deretter skrives runningAverage til seriell port. Man kan også vise den på noen LCD eller sende over Ethernet etc. Når 300 elementer blir lagt til, blir MyRA fjernet for å starte på nytt. For å bruke biblioteket, lag en mappe i SKETCHBOOKPATHlibaries med navnet RunningAverage og sett. h og. cpp der. Du kan også lage en eksemplar underkatalog for å plassere prøveappen. 2011-01-30: Initial versjon 2011-02-28: Fixed missing destructor i. h-fil 2011-02-28: fjernet default constructor 2012--. trimValue () Yuval Naveh lagt til trimValue (funnet på nettet) 2012-11-21: refactored 2012-12-30: added fillValue () refactored for publisering 2014-07-03: lagt til minnebeskyttelseskode - hvis intern array ikke kan tildeles størrelse blir 0. Dette er å løse problemet beskrevet her - forum. arduino. ccindex. phptopic50473.msg1790086msg1790086 - Test mye. Template klasse RunningAverage. h RunningAverage. cppAs andre har nevnt, bør du vurdere et IIR (uendelig impulsrespons) filter i stedet for det FIR (finite impulse response) filteret du bruker nå. Det er mer til det, men ved første øyekast implementeres FIR-filtre som eksplisitte konvolutter og IIR-filtre med ligninger. Det spesielle IIR-filteret jeg bruker mye i mikrokontrollere, er et enkeltpolet lavpasfilter. Dette er den digitale ekvivalenten til et enkelt R-C analog filter. For de fleste applikasjoner vil disse ha bedre egenskaper enn det boksfilteret du bruker. De fleste bruksområdene til et boksfilter som jeg har møtt, er et resultat av at noen ikke betaler oppmerksomhet i digital signalbehandlingsklasse, ikke som følge av at de trenger deres spesielle egenskaper. Hvis du bare vil dempe høye frekvenser som du vet er støy, er et enkeltpolet lavpasfilter bedre. Den beste måten å implementere en digital på i en mikrokontroller er vanligvis: FILT lt-- FILT FF (NEW - FILT) FILT er et stykke vedvarende tilstand. Dette er den eneste vedvarende variabelen du trenger for å beregne dette filteret. NEW er den nye verdien som filteret blir oppdatert med denne iterasjonen. FF er filterfraksjonen. som justerer filterets tyngdekraft. Se på denne algoritmen og se at for FF 0 er filteret uendelig tungt siden utgangen aldri endres. For FF 1, er det egentlig ikke noe filter i det hele tatt, siden utgangen følger bare inngangen. Nyttige verdier er i mellom. På små systemer velger du FF til å være 12 N, slik at multipliseringen med FF kan oppnås som en riktig forskyvning med N bits. FF kan for eksempel være 116 og multiplisere med FF derfor en rettforskyvning på 4 biter. Ellers trenger dette filteret bare ett avtrekk og ett tillegg, selv om tallene vanligvis må være bredere enn inngangsverdien (mer på numerisk presisjon i et eget avsnitt nedenfor). Jeg tar vanligvis AD-lesinger betydelig raskere enn de trengs, og bruker to av disse filtene kaskade. Dette er den digitale ekvivalenten til to R-C-filtre i serie, og demper med 12 dBoctave over rullefrekvensen. 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 som skal kaskade), bruker jeg mitt program FILTBITS. Du angir antall skiftbiter for hver FF i den kaskade serien med filtre, og den beregner trinnresponsen 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 parametrene til PLOTFILT betyr at det vil være to filtre kaskade av typen beskrevet ovenfor. Verdiene 4 angir antall skiftbiter for å realisere multiplikasjonen med FF. De to FF-verdiene er derfor 116 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, vil utgangen av det kombinerte filteret slå 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 utgangen fra en enkelt full amplitude spike. Dette gir deg en ide om tilfeldig støyundertrykkelse. 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 vil bli 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å siden Programvareoverføringer. Lagt til om numerisk presisjon jeg ser fra kommentarene og nå et nytt svar at det er interesse i å diskutere antall biter som trengs for å implementere dette filteret. Merk at multipliseringen med FF vil skape logg 2 (FF) nye biter under binærpunktet. På små systemer blir FF vanligvis valgt til å være 12 N, slik at denne multiplikasjonen faktisk realiseres ved en rettforskyvning av N bits. FILT er derfor vanligvis et fast punkt heltall. Merk at dette ikke endrer noen av matematikkene fra prosessorens synspunkt. Hvis du for eksempel filtrerer 10 bit AD-avlesninger og N 4 (FF 116), trenger du 4 fraksjonsbiter under 10-bits heltall-AD-avlesningene. En av de fleste prosessorer, du gjør 16 bit heltall operasjoner på grunn av 10-biters AD-avlesning. I dette tilfellet kan du likevel gjøre nøyaktig de samme 16 biters integeroperasjoner, men begynner med AD-avlesningene skiftet med 4 bits. Prosessoren vet ikke forskjellen og trenger ikke. Å gjøre matematikken på hele 16 bit heltall virker 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 bits hver filterpole hvis du ikke vil legge til lyd på grunn av den numeriske representasjonen. I eksemplet ovenfor må det andre filteret av to ha 1044 18 bits for ikke å miste informasjon. I praksis på en 8-bits maskin betyr det at du bruker 24 bitverdier. Teknisk sett ville bare den andre polen av to 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 for å utføre en filterpoleoperasjon, og deretter bruke det til hver stolpe. Om en subrutine eller makro avhenger av om sykluser eller programminne er viktigere i det aktuelle prosjektet. Uansett, jeg bruker noe skrapelodd til å sende NEW inn i subroutinemacroen, som oppdaterer FILT, men laster også inn i den samme scratch-tilstanden NYTT var inne. 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 peker på FILT på vei inn, som oppdateres til like etter FILT på vei ut. På den måten fungerer subrutinen automatisk på påfølgende filter i minnet hvis det kalles flere ganger. Med en makro trenger du ikke en peker siden du sender inn adressen for å operere på hver iterasjon. Kodeeksempler Her 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: Begge disse eksemplene implementeres som makroer ved hjelp av min PIC assembler preprocessor. 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å få den fremover pekeren, slik at den kan kalles i rekkefølge lett for å realisere flerpolede filtre. ndash Olin Lathrop Apr 20 12 kl 15:03 1. Takk veldig mye for svarene dine - alle sammen. Jeg bestemte 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, ønsket jeg å ta et gjennomsnitt for å kunne reagere på disse maskinvarespesifikke endringene automatisk. ndash sensslen 21 mai 12 kl 12:06 Hvis du kan leve med begrensningen av en kraft på to antall gjenstander til gjennomsnittlig (dvs. 2,4,8,16,32 osv.), så kan delingen enkelt og effektivt gjøres på en lav ytelse mikro med ingen dedikert splitt fordi det kan gjøres som et lite skifte. Hver forskyvningsrett er en styrke på to, for eksempel: OP syntes han hadde to problemer, delt i en PIC16 og minne for ringbufferen. Dette svaret viser at delingen ikke er vanskelig. Ganske vist tar det ikke opp minneproblemet, men SE-systemet gir 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 deling, er de likevel ufullstendige fordi de ikke viser hvordan man effektivt oppnår dette på en PIC16. ndash Martin Apr 20 12 at 13:01 Det er et svar på et ekte glidende gjennomsnittsfilter (aka boxcar filter) med mindre minne krav, hvis du ikke tankene nedsampling. Den kalte 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 hjelp av downsampling, trenger du ikke å lagre alle verdier av integratoren. Den kan implementeres ved hjelp av følgende pseudokode: Din effektive bevegelige gjennomsnittslengde er decimationFactorstatesize, men du trenger bare å beholde stateize-prøver. Åpenbart kan du få bedre ytelse dersom stateize og decimationFactor er 2, slik at divisjonen og resten av operatørene blir erstattet av skift og masker. Postscript: Jeg er enig med Olin om at du alltid bør vurdere enkle IIR-filtre før et glidende gjennomsnittsfilter. Hvis du ikke trenger frekvens-nullene til et boxcarfilter, vil et 1-polet eller 2-polet lavpasfilter sikkert fungere fint. På den annen side, hvis du filtrerer med henblikk på dekimering (tar en høyprøve-rateinngang og gjennomsnittsverdi den for bruk med lavprosessprosess), kan et CIC-filter være akkurat det du leter etter. (spesielt hvis du kan bruke stateize1 og unngå ringbufferen helt med bare en enkelt tidligere integrator verdi) Det er noen grundig analyse av matematikken bak ved å bruke det første rekkefølgen IIR-filteret som Olin Lathrop allerede har beskrevet over på Digital Signal Processing stack exchange (inneholder mange flotte bilder.) Ligningen for dette IIR-filteret er: Dette kan implementeres ved hjelp av bare heltall og ingen deling ved hjelp av følgende kode (kanskje noen feilsøking som jeg skrev fra minnet.) Dette filteret tilnærmer et glidende gjennomsnitt av de siste K-prøvene ved å sette verdien av alfa til 1K. 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 bekrefter koden som er oppført her så snart jeg får en endring og rediger dette svaret hvis nødvendig.) Besvart Jun 23 12 kl 4:04 Heres et enkeltpolet lavpasfilter (glidende gjennomsnitt, med cutoff frekvens CutoffFrequency). Veldig enkel, veldig rask, fungerer bra, og nesten ingen minne overhead. Merk: Alle variabler har omfang utover filterfunksjonen, bortsett fra det passerte i newInput Note: Dette er et engangsfiltre. Flere trinn kan bli kaskad sammen for å øke filterets skarphet. Hvis du bruker mer enn ett trinn, må du justere DecayFactor (som gjelder Cutoff-Frequency) for å kompensere. Og åpenbart alt du trenger er de to linjene plassert hvor som helst, de trenger ikke sin egen funksjon. Dette filteret har en rampetid før det bevegelige gjennomsnittet representerer det av inngangssignalet. Hvis du trenger å omgå denne oppstartstiden, kan du bare initialisere MovingAverage til den første verdien av newInput istedenfor 0, og håper den første newInput ikke er en outlier. (CutoffFrequencySampleRate) har et område mellom 0 og 0,5. DecayFactor er en verdi mellom 0 og 1, vanligvis i nærheten av 1. Enkelt-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 nevnen er et heltall på 2 (slik at du kan skifte til høyre som nevner snarere enn å måtte dele seg under filtersløyfen). 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 online, kapittel 19 om rekursive filtre: dspguidech19.htm PS For det Moving Average-paradigmet, kan en annen tilnærming til å angi DecayFactor og AmplitudeFactor som kan være mer relevant for dine behov, la oss si at du vil ha det forrige, omtrent 6 elementer i gjennomsnitt, gjør det diskret, du legger til 6 elementer og deler med 6, så Du kan sette AmplitudeFactor til 16, og DecayFactor til (1.0 - AmplitudeFactor). besvart 14 mai 12 kl. 22:55 Alle andre har kommentert grundig om bruken av IIR vs FIR, og på power-of-two divisjon. Jeg liker bare å gi noen detaljer om implementering. Nedenfor fungerer bra på små mikrokontroller uten FPU. Theres ingen multiplikasjon, og hvis du beholder N en kraft på to, er hele divisjonen enkelt-syklusbitskiftende. Grunnleggende FIR-ringbuffer: Hold en kjørerbuffer med de siste N-verdiene, og en kjører SUM for 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 SUMN. Modifisert IIR ringbuffer: hold en løpende SUM av de siste N-verdiene. Hver gang en ny prøve kommer inn, SUM - SUMN, legg til i den nye prøven, og utdata SUMN. besvart 28. august kl 13:45 Hvis jeg leser deg riktig, så beskriver du en førsteordens IIR-filtre verdien du trekker, ern39t den eldste verdien som faller ut, men er i stedet gjennomsnittet av tidligere verdier. Første-ordens 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 prøvefrekvens 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ørste rekkefølge IIR filter. ndash supercat Aug 28 13 på 15:31 vil gi en bølge som skarpt begynner å stige og gradvis nivåer av nær (men ikke på) innspillings maksimumet, så begynner det kraftig å falle og gradvis nivåer av nær (men ikke på) inngangsminimum. Veldig annerledes oppførsel. ndash supercat Aug 28 13 på 15:32 Ett problem er at et enkelt bevegelige gjennomsnitt kanskje eller ikke kan være nyttig. Med et IIR-filter kan du få et fint filter med relativt få beregninger. FIR du beskriver kan bare gi deg et rektangel i tide - 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. Scott Scott Seidman Aug 29 13 kl 13:50 ScottSeidman: Det er ikke behov for multipliserer hvis man bare har hvert trinn i FIR, enten utdata gjennomsnittet av inngangen til det stadiet og den tidligere lagrede verdien, og deretter lagre inngangen (hvis man har tallområdet, man kan bruke summen i stedet for gjennomsnittet). Enten det er bedre enn et boksfilter, avhenger av søknaden (trinnresponsen av et boksfilter med en total forsinkelse på 1 ms vil for eksempel ha en stygg d2dt-spike når inngangen endres, og igjen 1 m senere, men vil ha det minste mulig ddt for et filter med totalt 1 ms forsinkelse). ndash supercat Aug 29 13 kl 15:25 Som mikeselektriske stoffer sa, hvis du virkelig trenger å redusere minnebehovet, og du ikke bryr deg om at ditt impulsrespons er eksponentielt (i stedet for en rektangulær puls), ville jeg gå for et eksponentielt glidende gjennomsnittsfilter . Jeg bruker dem i stor utstrekning. Med den typen filter trenger du ikke noen buffer. Du trenger ikke å lagre N tidligere prøver. Bare én. Så, minnekravene dine blir kuttet ned med en faktor på N. Også du trenger ikke noen divisjon for det. Bare multiplikasjoner. Hvis du har tilgang til flytende punkt aritmetikk, bruk flytende punktmultiplikasjoner. Ellers gjør du tallmultiplikasjoner og skifter til høyre. Vi er imidlertid i 2012, og jeg vil anbefale deg å bruke kompilatorer (og MCUer) som lar deg arbeide med flytende punktnumre. I tillegg til å være mer minneverdig og raskere (du trenger ikke å oppdatere elementer i en hvilken som helst sirkulær buffer), vil jeg si det er også mer naturlig. fordi en eksponentiell impulsrespons passer bedre til måten naturen oppfører seg, i de fleste tilfeller. besvart apr 20 12 kl 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 biastrunkering). Forutsatt at N er en kraft av to, og bare heltall aritmetikk er brukt, eliminerer shift høyre systematisk LSBene i den nye prøven. Det betyr at hvor lenge serien kan være, vil gjennomsnittet aldri ta hensyn til disse. Anta for eksempel en sakte avtagende serie (8,8,8, 8,7,7,7, 7,6,6,) og anta at gjennomsnittet faktisk er 8 i begynnelsen. Neven 7-prøven vil bringe gjennomsnittet til 7, uansett filterstyrken. Bare for en prøve. Samme historie for 6, etc. Tenk på det motsatte. serien går opp. Gjennomsnittet vil forbli på 7 for alltid, til prøven er stor nok til å gjøre det endret. Selvfølgelig kan du korrigere for bias ved å legge til 12N2, men det vil egentlig ikke løse presisjonsproblemet. I så fall vil den avtagende serien forbli for alltid ved 8 til prøven er 8-12 (N2). For eksempel for N4 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 langt nok til å 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 litt forklaring. Mener du å holde to gjennomsnittsverdier med resultatet av den første matet i den andre i hver iterasjon. Hva er fordelene med dette forumet: Digitale Signalverarbeitung DSP Flytte AVERAGE FILTER i FastAVR Dim-indeksen som byte dim-verdi (4) som byte dim gjennomsnitt som ord dim teller som byteindeks 1 39arrays i bascom begynner mit 1 :-( gjør verdi (indeks) getadc (x) 39messen incr-indeks hvis indeks 5 deretter indeks 1 for telle 1 til 4 gjennomsnittlig gjennomsnittlig verdi (telle) neste skift gjennomsnitt, høyre, 2 39geht schneller als 4 loop Fastavr wird ja nicht sooo andre sein. Anstatt do-loop kannst Du er dazwischen steht natrlich auch als sub aufrufen oder wie auch immer. Dann mach es doch så wie mein Beispiel (nur ohne den Fehler gjennomsnittlig bis ins unendliche hochzuaddieren -)), nur da der lettzte Mittelwert den Westen des arrays ersetzt: do inntektsverdi (indeks) getadc (x) 39messen verdi (indeks-1) gjennomsnitt hvis indeks 5 deretter indeks 1 gjennomsnitt 0 for telling 1 til 4 gjennomsnittlig gjennomsnittlig verdi (telle) neste skift gjennomsnitt, høyre, 2 39geht schneller als 4 loop Noch ne Idee zum gltten, ev. etwas trge: - Wert messen als Anfang Dann immer: - neuen Wert messen Wert (3Wert neuer Wert) 4 nur falls es noch einen interessiert. Soweit ich die bisherigen Varianten hier berblickt habe, wird immer die Summe fr den Mittelwert ausgewertet. Das macht diese Metoden aber langsamer mit steigernder Fensterlnge. Nachdem der Mittelwert lineær ist, kann ich die Summe auch einfach zerlegen und spare mir so jedesmal die Summe auszuwerten. definer WindowSize 4 int samplesWindowSize int indeks 0 int gjennomsnitt 0 mens (1) Alten Wert abziehen. gjennomsnittlig - sampleindex Neuen Wert zufgen. sampleindex input WindowSize Neuen Mittelwert bildet. gjennomsnittlig sampleindex Im Ringbuffer weiterstellen indeksindeks WindowSize Der Code er valgfeil quotoptimalquot, sondern sollte nur die Funktionsweise demonstrieren. Desweiteren muss man bei diesem Verfahren die Rundungsfehler beachten, d. h. Bei Benutzung von Integer-Arithmetik ist der gewonnene Mittelwert etwas ungenauer. Autor: Martin (Gast) Dato: 02.05.2009 03:29 mal ein ganz anderer Ansatz: Warum erhhst Du er ikke en eneste av de prøvetakerne i AD-Wandler. Somit har du en Maskinvare-Flytende-Gjennomsnittlig Filter Nimm einfach ne viermal så hohe Samplingrate, ist das gleiche, wie wenn Dein AD-Wandler vier Werte aufnimmt und Du Sie dann wieder mittelst (Okay. Sampling - og Convert-Zeit betrachten) ) Die vier Einzelwerte interessieren Dich ja eh nicht und die Werte die der AD-Wandler liefert werden auch besser (Im Datenblatt des AD-Wandlers drfte auch ne Formel fr die Mindest-Sample-Zeit angegeben sein). Nur so ein Gedanke. Mannen min er en annen Ansat: Warum erhhst Du er ikke en eneste av dem som har prøvet prøvetaking og AD-Wandler. Somit har du en Maskinvare-Flytende-Gjennomsnittlig Filter Du er så snill, men du er ikke sikker på det. Wenn man vor dem ADC Eingang noch einen RC-Tiefpass mit passerer Grenzfrequenz satt opp med et slag. Ohne diesen schlgt die SampleampHoldstufe des ADCs zu, wir reden ja av AVR. und die bentigt nur 1.5 ADC Takte um easangssignal zu sampeln. Antwort schreiben Die Angabe einer E-Mail-Adresse er freiwillig. Wenn Sie automatisk per E-mail ber Antworten auf Ihren Beitrag informiert werden mchten, melden Sie sich bitte an. Wichtige Regeln - erstatte, skrive innlegg Gro - og Kleinschreibung verwende Lngeren Kildekode noicht Text einfgen, sondern als Dateianhang Formatierung (mehr Informationen.) CC-Codec avrasmAVR-Assembler-Codeavrasm codeCode i anderen Sprachen, ASCII-Zeichnungencode mathFormel i LaTeX-Syntaxmath Titel - Link zu Artikel Verweis auf anderen Beitrag einfgen: Rechtsklick auf Beitragstitel, Adresse kopieren, und in den Text einfgen

No comments:

Post a Comment