Wednesday 27 September 2017

Glidande Medelvärde Cirkulär Buffert


Jag vet att detta kan uppnås med boost som per. Men jag vill verkligen undvika att använda boost jag har googled och inte hittat några lämpliga eller läsbara exempel. I grund och botten vill jag spåra det rörliga genomsnittet av en pågående ström av en ström av flytande punktnummer Använder de senaste 1000 siffrorna som ett dataprov. Vilket är det enklaste sättet att uppnå detta. Jag experimenterade med att använda ett cirkulärt array, exponentiellt glidande medelvärde och ett enklare glidande medelvärde och fann att resultaten från den cirkulära gruppen passade mina behov bäst. asked jun 12 12 på 4 38. Om dina behov är enkla kan du bara försöka använda ett exponentiellt rörligt medelvärde. Du gör bara en ackumulatorvariabel, och när din kod tittar på varje prov uppdaterar koden ackumulatorn med nytt värde Du väljer en konstant alfa som är mellan 0 och 1 och beräknar detta. Du behöver bara hitta ett värde av alfa där effekten av ett visst prov endast varar för cirka 1000 prov. Hmm, jag är inte säker på att det här är Lämplig för dig, nu t Hat jag har lagt den här Problemet är att 1000 är ett ganska långt fönster för ett exponentiellt rörligt medelvärde. Jag är inte säker på att det finns en alfa som skulle sprida genomsnittet över de senaste 1000 talen utan underflöde i flytpunktsberäkningen. Men om du ville ha ett mindre medelvärde, som 30 nummer eller så, det här är ett mycket enkelt och snabbt sätt att göra det. svarade den 12 juni 12 på 4 44. 1 på ditt inlägg Det exponentiella glidande medlet kan låta alfabetet vara variabelt Så det tillåter det Används för att beräkna tidsbasen medelvärden, t. ex. bytes per sekund Om tiden sedan den senaste ackumulatoruppdateringen är mer än 1 sekund, låter du alpha vara 1 0 Annars kan du låta alfa vara usecs sedan senaste uppdateringen 1000000 jxh jun 12 12 vid 6 21.Basiskt vill jag spåra det rörliga genomsnittet av en pågående ström av en ström med flytande punktnummer med de senaste 1000 siffrorna som ett dataprov. Notera att nedanstående uppdaterar summan som element som tillsatt ersatt, så att kostsamma ON-traverser beräknas Summan - behövs för th E genomsnitt - på begäran. Total görs en annan parameter från T för att stödja t ex med lång längd när det är 1000 lång s, en int för char s eller en dubbel till total float s. Detta är lite bristfälligt i att nummemplar kunde gå förbi INTMAX - om du bryr dig att du kan använda en unsigned long long eller använda en extra bool data medlem att spela in när behållaren fylls först medan cykel nummor runt arrayen bäst sedan bytt namn på något oskadd som pos. answered 12 juni 12 på 5 19.an antar att tomrumsoperatör T-provet är faktiskt tomt operatör T-prov oPlats den 8 juni 14 på 11 52. oPless ahhh väl spotted egentligen menade jag att det skulle vara tomt operatör T-prov men självklart kan du använda vilken anteckning du helst vill fixa, Tack Tony D Jun 8 14 på 14 27. Forskaren och ingenjörens guide till digital signalbehandling av Steven W Smith, Ph D. Chapter 28 digitala signalprocessorer. Digitala signalprocessorer är utformade för att snabbt utföra FIR-filter och liknande tekniker För att förstå Hardwar E vi måste först förstå algoritmerna I det här avsnittet kommer vi att göra en detaljerad lista över de steg som behövs för att implementera ett FIR-filter I nästa avsnitt kommer vi att se hur DSPs är utformade för att utföra dessa steg så effektivt som möjligt. För att starta behöver vi Att skilja mellan offline-bearbetning och realtidsbehandling Vid off-line-bearbetning ligger hela insignalen i datorn samtidigt. En geofysiker kan till exempel använda en seismometer för att registrera markrörelsen under en jordbävning. Efter skakningen Är över, kan informationen läsas in i en dator och analyseras på något sätt Ett annat exempel på off-line-bearbetning är medicinsk bildbehandling, såsom beräknad tomografi och MR. Datasetet förvärvas när patienten är inne i maskinen, men bildrekonstruktionen kan fördröjas till en senare tid. Kärnpunkten är att all information är samtidigt tillgänglig för bearbetningsprogrammet. Detta är vanligt inom vetenskaplig forskning och teknik, men inte i konsumentprodukter Off-line bearbetning är riken för persondatorer och mainframes. I realtidsbearbetning produceras utsignalen samtidigt som ingångssignalen förvärvas. Det behövs till exempel i telefonkommunikation, hörselhjälpmedel, Och radar Dessa applikationer måste ha informationen omedelbart tillgänglig, även om den kan fördröjas med en kort mängd. Exempelvis kan en 10-sekunders fördröjning av ett telefonsamtal inte detekteras av högtalaren eller lyssnaren. På samma sätt spelar det ingen roll om en radarsignal är Fördröjt med några sekunder innan det visas för operatören. Realtidsprogram matar in ett prov, utför algoritmen och matar ut ett prov, över och över. Alternativt kan de mata in en grupp. Av prover, utföra algoritmen och mata ut En grupp av prover Detta är en värld av digitala signalprocessorer. Nu ser du tillbaka på Fig 28-2 och föreställer dig att det här är ett FIR-filter som implementeras i realtid. För att beräkna utmatningsprovet måste vi ha ve tillgång till ett visst antal av de senaste proverna från inmatningen Till exempel, anta att vi använder åtta koefficienter i detta filter, en 0 a 1 a 7 Detta betyder att vi måste veta värdet av de åtta senaste proven från ingångssignalen, Xn, xn -1, xn -7 Dessa åtta prover måste lagras i minnet och uppdateras kontinuerligt när nya prover förvärvas. Vad är det bästa sättet att hantera dessa lagrade prover Svaret är cirkulär buffring. Fig. 28-3 visar ett åtta prov cirkulärt buffert Vi har placerat den här cirkulära bufferten i åtta på varandra följande minnesplatser, 20041 till 20048 Figur a visar hur de åtta proverna från ingången kan lagras vid en viss tidpunkt, medan b visar ändringarna efter det att nästa prov har förvärvats. Idén om cirkulär buffring är att slutet av denna linjära array är kopplad till sitt startminnesplats 20041 ses som närmast 20048, precis som 20044 ligger bredvid 20045 Du håller reda på arrayen med en pekare en variabel vars värde jag S en adress som anger var det senaste provet finns. I en pekare innehåller adressen 20044, medan i b innehåller den 20045 När ett nytt prov förvärvas ersätter det det äldsta provet i matrisen och pekaren flyttas en adress framåt Cirkulära buffertar är effektiva eftersom endast ett värde måste ändras när ett nytt prov förvärvas. Fyra parametrar behövs för att hantera en cirkulär buffert Först måste det finnas en pekare som anger starten på den cirkulära bufferten i minnet i detta Exempel 20041 För det andra måste det finnas en pekare som indikerar slutet av matrisen, t. ex. 20048, eller en variabel som rymmer sin längd, t. ex. 8 För det tredje måste stegadressen för minnesadressering anges. I Fig 28-3 är stegstorleken en till exempel adress 20043 innehåller ett exempel, adress 20044 innehåller nästa exempel osv. Detta är ofta inte fallet. Exempelvis kan adresseringen referera till byte och varje prov kan kräva två eller fyra byte för att hålla sitt värde I I dessa fall måste steget vara två eller fyra. Dessa tre värden definierar storleken och konfigurationen för den cirkulära bufferten och kommer inte att ändras under programoperationen. Det fjärde värdet, pekaren till det senaste provet, Måste ändras när varje nytt prov förvärvas. Med andra ord måste det finnas programlogik som styr hur detta fjärde värde uppdateras baserat på värdet av de tre första värdena. Medan denna logik är ganska enkel måste den vara mycket snabb. Detta är Hela punkten i denna diskussions-DSP bör optimeras vid hantering av cirkulära buffertar för att uppnå högsta möjliga körhastighet. Som en sido är cirkulär buffring också användbar vid off-line-bearbetning. Tänk på ett program där både ingångs - och utsignalerna är fullständigt inrymda i minne Cirkulär buffring behövs inte för en konvolutionsberäkning, eftersom varje prov kan omedelbart nås. Men många algoritmer implementeras i steg med en mellanliggande signal vara Exempelvis skapas ett rekursivt filter som utförs som en serie biquader. Brutkraftsmetoden är att lagra hela längden på varje mellansignal i minnet. Cirkulär buffring ger en annan alternativbutik endast de mellanprover som behövs för Beräkningen vid handen Detta minskar den önskade mängden minne på bekostnad av en mer komplicerad algoritm Den viktiga tanken är att cirkulära buffertar är användbara för off-line-bearbetning men kritisk för realtidsapplikationer. Nu kan vi titta på stegen behövs för att implementera ett FIR-filter med hjälp av cirkulära buffertar för både ingångssignalen och koefficienterna. Denna lista kan verka trivial och överexaminerad. Det är inte. Den effektiva hanteringen av dessa enskilda uppgifter är vad som skiljer en DSP från en traditionell mikroprocessor. För varje nytt prov, alla Följande steg måste vidtas. Målet är att få dessa steg att utföras snabbt Eftersom steg 6-12 kommer att upprepas många gånger en gång för varje Koefficient i filtret måste särskild uppmärksamhet ägnas åt dessa operationer Traditionella mikroprocessorer måste i allmänhet utföra dessa 14 steg i seriell en efter en, medan DSPs är utformade för att utföra dem parallellt. I vissa fall kan alla operationer inom loop-steg 6 -12 kan slutföras i en enda klockcykel Låt oss titta på den interna arkitekturen som möjliggör denna magnifika prestanda. En av de viktigaste applikationerna för Arduino-kortet är läsning och loggning av sensordata. Exempelvis övervakar man trycket varje sekund på dagen. Som höga samplingsfrekvenser genererar ofta spikar i diagrammen. Man vill också ha ett medelvärde av mätningarna. Eftersom mätningarna inte är statiska i tid, så behöver vi ofta ett löpande medelvärde. Detta är medelvärdet av en viss period och mycket värdefull när man gör trendanalys. Simplaste form av ett löpande medelvärde kan göras med kod som bygger på tidigare löpande medelvärde. Om man inte vill använda flytande punktmatematik - som thi S tar upp minne och minskar hastigheten - man kan göra detsamma helt i heltalsdomen. Divisionen med 256 i provkoden är en shift-right 8, vilket är snabbare än att säga division med t. ex. 100. Detta gäller för varje kraft på 2 Som delare och en måste bara ta hand om summan av vikterna är lika med kraften på 2 Och det är självklart att man inte får överväga att använda mellanliggande överflöd. Om du behöver ett mer korrekt löpande medelvärde, i konkreta fall från de senaste 10 mätningar behöver du en array eller länkad lista för att hålla dem. Denna array fungerar som en cirkulär buffert och med varje ny mätning avlägsnas den äldsta. Körningsgenomsnittet beräknas som summan av alla element dividerat med antalet element i arrayen. Kod för löpande medelvärdet kommer att vara något som detta. Drawback av denna kod är att matrisen för att hålla alla värden kan bli ganska stor Om du har en mätning per sekund och du vill ha ett löpande medel per minut behöver du en uppsättning av 60 an Genomsnittet per timme skulle behöva en uppsättning av 3600 som inte kunde göras på detta sätt på en Arduino eftersom det bara har 2K RAM men genom att bygga ett 2-stegs medelvärde kan det närma sig ganska bra ansvarsfriskrivning inte för alla mätningar i psuedo code. As a En ny intern statisk matris behövs för varje runningAverage-funktion, detta skriker ska implementeras som en klass. RunningAverage-biblioteket. RunAverage-biblioteket gör en klass av funktionen ovan så att den kan användas flera gånger i en skiss. Det avkodar tillägget och avg funktionen är lite mer flexibel, t. ex. man kan ringa medeltalet flera gånger utan att lägga till en sak. Observera att varje instans av klassen lägger till sitt eget array för att hålla mätningar och att detta lägger till minnesanvändningen. Gränssnittet i klassen är hålls så liten som möjligt. Notera med version 0 2 namnen på metoderna är alla gjorda mer beskrivande. En liten skiss visar hur den kan användas En slumpgenerator används för att efterlikna en sensor. I inställningen rensas myRA så w E kan börja lägga till nya data. I loop först genereras ett slumptal och omvandlas till en float som läggs till i minRA. Sedan skrivs runningAverage ut till seriell port. En kan också visa den på vissa LCD eller skicka över Ethernet etc. När 300 objekt läggs till minRA rensas för att starta igen. För att använda biblioteket, skapa en mapp i dina SKETCHBOOKPATH libaries med namnet RunningAverage och sätt h och där. Gör eventuellt en exemplar underkatalog för att placera provet app.2011-01-30 första versionen .2011-02-28 fixad saknad destructor i h file.2011-02-28 borttagen default constructor.2012- - trimValue Yuval Naveh lagt till trimValue hittades på web.2012-11-21 refactored.2012-12-30 added fillValue refactored for Publicering.2014-07-03 lagt till minneskyddskod - om intern array inte kan tilldelas storlek blir 0 Detta är för att lösa problemet som beskrivs här. Test i stor utsträckning. Template class. RunningAverage h. RunningAverage.

No comments:

Post a Comment