Thursday 26 October 2017

Flytting Gjennomsnitt Sirkulær Buffer


Jeg vet at dette er mulig med boost som per. Men jeg virkelig vil unngå å bruke boost jeg har googled og ikke funnet noen egnede eller lesbare eksempler. Basalt vil jeg spore det bevegelige gjennomsnittet av en pågående strøm av en strøm av flytende punktnumre bruker de nyeste 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 den sirkulære gruppen som passer meg, trenger best. asked 12. juni 12 på 4 38. Hvis dine behov er enkle, kan du bare prøve å bruke et eksponentielt bevegelige gjennomsnitt. Du gjør bare en akkumulatorvariabel, og når koden ser på hver prøve, oppdaterer koden akkumulatoren med ny verdi 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 ikke sikker på at dette er egnet for deg, nå t hatten jeg har satt den 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 ønsket et mindre gjennomsnitt, som 30 tall eller så, dette er en veldig enkel og rask måte å gjøre det på. Ansatte Jun 12 12 på 4 44. 1 på ditt innlegg Det eksponentielle glidende gjennomsnittet kan tillate at alfaet er variabelt Så dette tillater det brukes til å beregne tidsbasert gjennomsnitt, f. eks. bytes per sekund Hvis tiden siden den siste akkumulatoroppdateringen er mer enn 1 sekund, lar du alpha være 1 0 Ellers kan du la alfa være usecs siden sist oppdatert 1000000 jxh Jun 12 12 ved 6 21.Basisk 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 dataprøve. Merk at under oppdateringer summen som elementene som lagt til erstattet, slik at kostbare ON-traverser ikke kan beregnes summen som trengs for th e gjennomsnittlig - på forespørsel. Totalt er det laget en annen parameter fra T for å støtte f. eks. ved å bruke lang lang når det er totalt 1000 lange s, en int for char s eller en dobbel til total float s. Dette er litt feil i at numsamples kunne gå forbi INTMAX - hvis du bryr deg om at du kan bruke en usignert lang lang eller bruke et ekstra bool data medlem til å registrere når beholderen er først fylt mens sykkel numempler rundt arrayet best deretter omdøpt noe uskyldig som pos. answered 12 juni 12 på 5 19.En antar at tomromoperatøren T-prøven faktisk er ugyldig operatør T-prøve, uansett 8. juni kl. 14 på 11 52. oPless ahhh godt oppdaget egentlig, jeg mente det skulle være tomt operatør T-prøve, men selvfølgelig kunne du bruke hvilken som helst notasjon du likte Vil rette, takk Tony D 8. juni kl 14 14. Vitenskapsmannens og ingeniørens veiledning til digital signalbehandling av Steven W Smith, Ph D. Chapter 28 digitale signalprosessorer. Digitale signalprosessorer er utviklet for å raskt utføre FIR-filtre og lignende teknikker For å forstå Hardwar e vi må først forstå algoritmene I denne delen skal vi lage en detaljert liste over trinnene som trengs for å implementere et FIR-filter. I neste avsnitt vil vi se hvordan DSPs er utformet for å utføre disse trinnene så effektivt som mulig. For å starte, trenger vi å skille mellom off-line behandling og sanntidsbehandling I off-line prosessering, ligger hele inngangssignalet i datamaskinen samtidig. For eksempel kan en geofysiker bruke et seismometer til å registrere jordbevegelsen under et jordskjelv. Etter risting er over, kan informasjonen leses inn i en datamaskin og analyseres på en eller annen måte. Et annet eksempel på behandling utenfor nettverket er medisinsk bildebehandling, for eksempel computertomografi og MR. Datasettet er oppnådd mens pasienten er inne i maskinen, men bildet rekonstruksjon kan bli forsinket til et senere tidspunkt Hovedpunktet er at all informasjonen er samtidig tilgjengelig for prosessprogrammet Dette er vanlig i vitenskapelig forskning og ingeniørarbeid, men ikke i forbrukerprodukter Off-line behandling er rike på personlige datamaskiner og mainframes. I sanntidsprosessering produseres utgangssignalet samtidig som inngangssignalet blir kjøpt. Dette er for eksempel nødvendig i telefonkommunikasjon, høreapparater, og radar Disse programmene må ha informasjonen umiddelbart tilgjengelig, selv om den kan bli forsinket med kort tid. For eksempel kan en 10 millisekond forsinkelse i en telefonsamtale ikke oppdages av høyttaleren eller lytteren. På samme måte spiller det ingen rolle om et radar signal er forsinket med noen få sekunder før det blir vist til operatøren Real-time-applikasjoner skriver inn et eksempel, utfører algoritmen og skriver ut en prøve, over og over Alternativt kan de skrive inn en gruppe. av prøver, utføre algoritmen og utdata en gruppe prøver Dette er en verden av digitale signalprosessorer. Nå ser du tilbake på figur 28-2 og forestiller deg at dette er et FIR-filter som implementeres i sanntid. For å beregne utgangsprøven må vi ha ve tilgang til et visst antall av de siste prøvene fra inngangen For eksempel, anta at vi bruker åtte koeffisienter i dette filteret, en 0 a 1 a 7 Dette betyr at vi må vite verdien av de åtte siste prøvene fra inngangssignalet, xn, xn -1, xn -7 Disse åtte prøvene må lagres i minnet og oppdateres kontinuerlig når nye prøver blir anskaffet. Hva er den beste måten å håndtere disse lagrede prøvene på. Svaret er sirkulær buffering. Figur 28-3 illustrerer en åtte prøve sirkulær buffer Vi har plassert denne sirkulære bufferen i åtte sammenhengende minnesteder, 20041 til 20048 Figur a viser hvordan de åtte prøvene fra inngangen kan lagres på et bestemt tidspunkt, mens b viser endringene etter at neste prøve er anskaffet. Ideen om sirkulær buffering er at slutten av denne lineære gruppen er koblet til begynnelsesminneplasseringen 20041 blir sett på som ved siden av 20048, akkurat som 20044 er ved siden av 20045 Du holder oversikt over arrayet med en peker en variabel hvis verdi jeg s en adresse som angir hvor den nyeste prøven er. For eksempel inneholder pekeren adressen 20044, mens i b inneholder den 20045 Når en ny prøve er anskaffet, erstatter den den eldste prøven i matrisen, og pekeren er flyttet Én adresse fremover Sirkulære buffere er effektive fordi bare en verdi må endres når en ny prøve blir kjøpt. Det er nødvendig med parametere for å administrere en sirkulær buffer. Først må det være en peker som angir starten på den sirkulære bufferen i minnet i dette for eksempel 20041 For det andre må det være en peker som indikerer slutten av arrayet, for eksempel 20048, eller en variabel som holder lengden f. eks. 8 Tredje må strekstørrelsen til minnesadresseringen spesifiseres. I figur 28-3 er trinnstørrelsen en for eksempel adresse 20043 inneholder en prøve, adresse 20044 inneholder neste eksempel, og så videre Dette er ofte ikke tilfellet For eksempel kan adresseringen referere til byte, og hver prøve kan kreve to eller fire byte for å holde verdien I I disse tilfellene må trinnstørrelsen være henholdsvis to eller fire. Disse tre verdiene definerer størrelsen og konfigurasjonen til den sirkulære bufferen, og vil ikke endres under programoperasjonen. Den fjerde verdien, pekeren til den nyeste prøven, må modifiseres etter hvert som hver ny prøve er anskaffet. Med andre ord må det være programlogikk som styrer hvordan denne fjerde verdien oppdateres basert på verdien av de tre første verdiene. Denne logikken er ganske enkel, men det må være veldig fort. Dette er den hele punktet i denne diskusjonen DSPs bør optimaliseres ved å administrere sirkulære buffere for å oppnå høyest mulig utførelseshastighet. Som en side er sirkulær buffering også nyttig i off-line behandling. Vurder et program hvor både inngangs - og utgangssignalene er helt inneholdt i minne Cirkulær buffering er ikke nødvendig for en konvoluttberegning, fordi hver prøve kan umiddelbart nås. Imidlertid implementeres mange algoritmer i etapper med et mellomliggende signal være For eksempel blir et rekursivt filter utført som en serie biquader, operert på denne måten. Den brute force-metoden er å lagre hele lengden på hvert mellomliggende signal i minnet. Cirkulær buffering gir en annen opsjonsbutikk kun de mellomliggende prøver som trengs for Beregningen på hånden Dette reduserer den nødvendige mengden minne på bekostning av en mer komplisert algoritme. Den viktige ideen er at sirkulære buffere er nyttige for off-line behandling, men kritisk for sanntidsapplikasjoner. Nå kan vi se på trinnene trengte å implementere et FIR-filter ved hjelp av sirkulære buffere for både inngangssignalet og koeffisientene Denne listen kan virke trivial og overeksaminert. Det er ikke Den effektive håndteringen av disse individuelle oppgavene er det som skiller en DSP fra en tradisjonell mikroprosessor. For hver ny prøve, alle Følgende trinn må tas. Målet er å gjøre disse trinnene kjøres raskt Siden trinn 6-12 blir gjentatt mange ganger en gang for hvert koeffisient i filteret, må spesiell oppmerksomhet gis til disse operasjonene. Tradisjonelle mikroprosessorer må vanligvis utføre disse 14 trinnene i seriell en etter en, mens DSPs er utformet for å utføre dem parallelt. I noen tilfeller kan alle operasjonene i loop-trinnene 6 -12 kan fullføres i en enkelt klokke syklus La oss se på den interne arkitekturen som gir denne praktfulle ytelsen. En av de viktigste applikasjonene til Arduino-kortet er å lese og logge av sensordata. For eksempel overvåker man trykk hvert sekund av dagen. Som høye samplingsfrekvenser genererer ofte pigger i grafene. Man ønsker også å ha et gjennomsnitt av målingene. Da målingene ikke er statiske i tid, trenger vi ofte et løpende gjennomsnitt. Dette er gjennomsnittet av en bestemt periode og svært verdifull når det gjør trendanalyse. Simpleste form av et løpende gjennomsnitt kan gjøres med kode som bygger på forrige løpende gjennomsnitt. Hvis man ikke vil bruke flytende punktmatematikk - som thi s tar opp minne og reduserer hastighet - man kan gjøre det samme helt i integer-domenet Divisjonen med 256 i sample-koden er en shift-høyre 8 som er raskere enn å si divisjonen med f. eks. 100 Dette gjelder for hver kraft på 2 som skillelinje 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, vurder å bruke usignert lang. Hvis du trenger et mer nøyaktig løpende gjennomsnitt, i konkret fra de siste 10 målinger, du trenger en matrise eller en koblet liste for å holde dem. Dette arrayet fungerer som en sirkulær buffer og med hver ny måling blir den eldste fjernet. Running gjennomsnittet beregnes som summen av alle elementene dividert med antall elementer i gruppen The kode for det løpende gjennomsnittet vil være noe som dette. Drawback av 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 serie på 60 an gjennomsnitt per time ville trenge 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 godt ansvarsfraskrivelse ikke for alle målinger I psuedo-kode. Som en nytt internt statisk system er nødvendig for hver runningAverage-funksjon, dette skrikene skal implementeres som en klasse. RunningAverage-biblioteket. RunAverage-biblioteket gjør en klasse av funksjonen over, slik at den kan brukes flere ganger i en skisse. Det avbryter tillegget og avg funksjonen til å være litt mer fleksibel, for eksempel kan man ringe gjennomsnittet flere ganger uten å legge til ting. Vær oppmerksom på at alle forekomster av klassen legger til sitt eget array for å holde målinger, og at dette legger til minnebruk Grensesnittet til klassen er holdes så liten som mulig. Merk med versjon 0 2 navnene på metodene blir alle gjort mer beskrivende. En liten skisse viser hvordan den kan brukes En tilfeldig generator brukes til å etterligne en sensor. Ved oppsett blir myRAen fjernet så w e kan begynne å legge til nye data. I sløyfe først blir et tilfeldig tall generert og konvertert til en float som skal legges til minRA Så blir runningAverage trykt til seriell port. En kan også vise den på noen LCD eller sende over ethernet osv. Når 300 elementer legges til minRA blir ryddet for å starte igjen. For å bruke biblioteket, lag en mappe i SKETCHBOOKPATH libariene med navnet RunningAverage, og legg h og der Valgfritt lage en eksemplar underkatalog for å plassere prøven app.2011-01-30 første versjon .2011-02-28 Fixed missing destructor i h file.2011-02-28 fjernet default constructor.2012- - trimValue Yuval Naveh lagt til trimValue funnet på web.2012-11-21 refactored.2012-12-30 added fillValue refactored for publishing.2014-07-03 lagt til minnebeskyttelseskode - hvis intern array ikke kan tildeles størrelse blir 0 Dette er for å løse problemet beskrevet her. Test omfattende. Template class. RunningAverage h. RunningAverage.

No comments:

Post a Comment