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. cppDette er en samling av rutiner for å utføre matematisk analyse av tallskalaer. Nåværende funksjonstøtte: Alle funksjonene er fullt overbelastede for å støtte følgende datatyper: Med unntak av stddev () returnerer de alle samme datatype som arrayet. En rekke int-verdier returnerer en enkelt int. stddev () returnerer alltid en flyte. Alle funksjonene unntatt rollingAverage () tar to argumenter. Den første er arenaen å jobbe med. Den andre er antall innlegg i gruppen. rollingAverage () tar et tredje argument - den nye oppføringen som skal legges til i gruppen. Rullende gjennomsnitt Format: Gjennomsnittlig rullemengde (historisk rekkefølge, slicecount, verdi) Legger til verdi for arrayhistorikkrapporteringen som skifter alle verdiene ned ett sted. Det gjennomsnittlige gjennomsnittet returneres deretter. Format: gjennomsnittlig gjennomsnitt (array, slicecount) Beregner gjennomsnittet av verdiene i array. slicecount er antall innlegg i gruppen. Format: gjennomsnittlig modus (array, slicecount) Finn det vanligste nummeret i arrayet. Format: maks maksimum (array, slicecount) Finn den største verdien i arrayen. Format: min minimum (array, slicecount) Finn den minste verdien i arrayen. Standardavviksformat: avvik stddev (array, slicecount) Standardavviket er kvadratroten av gjennomsnittet av summen av kvadrater av forskjellen mellom hvert datapunkt og gjennomsnittet av gjennomsnittet. Dette er den eneste funksjonen som ikke returnerer samme datatype som matrisen. Standardavviket returneres alltid som flyte. Jeg jobber på en mobilrobot som styres via en trådløs 2,4 GHz-kobling. Mottakeren er koblet til Arduino Uno som fungerer som hovedkontroller. Den mest kritiske (og viktigste) inngangskanalen som kommer fra mottakeren, gir et meget støyende signal, noe som fører til mange mindre endringer i utgangene til aktuatorene, selv om disse ikke er nødvendig. Jeg ser etter biblioteker som kan utføre effektiv utjevning. Er det noen signalutjevningsbiblioteker tilgjengelig for Arduino (Uno) spurte Feb 16 14 kl 13:57 Jeg tror jeg ser mange enkeltprøve støypiker i ditt støyende signal. Medianfilteret gjør det bedre å kvitte seg med enkeltprøve støypik enn et lineært filter. (Det er bedre enn noe lavpassfilter, glidende gjennomsnitt, vektet glidende gjennomsnitt osv. Med hensyn til responstid og dets evne til å ignorere slike enkeltprøve-støypistolutviklere). Det er faktisk mange signalutjevningsbiblioteker for Arduino, hvorav mange inkluderer et medianfilter. Signalutjevning av biblioteker hos arduino. cc: Signalutjevning av biblioteker ved Github: Vil noe slikt fungere i roboten din (Median-of-3 krever svært lite CPU-kraft, og dermed rask): Du kan filtrere dette digitalt ved hjelp av en lav pass filter: Endre 0.99 for å endre kuttfrekvensen (nærmere 1,0 er lavere frekvens). Det egentlige uttrykket for den verdien er exp (-2piffs) hvor f er cutofffrekvensen du vil ha, og fs er frekvensen dataene samples på. En annen type digitalt filter er et hendelsesfilter. Det fungerer bra på data som har avvikere, f. eks. 9,9,8,10,9,25,9. Et hendelsefilter returnerer den hyppigste verdien. Statistisk er dette modusen. Statistiske gjennomsnitt som Mean, Mode etc. kan beregnes ved hjelp av Arduino Average Library. Et eksempel tatt fra Arduino bibliotekssiden referert til:
Comments
Post a Comment