Är det möjligt att implementera ett glidande medelvärde i C utan att det behövs ett fönster av prover. Jag har funnit att jag kan optimera lite, genom att välja en fönsterstorlek som är en kraft av två för att tillåta bitskiftning istället för att dela men Inte behöva en buffert skulle vara trevligt Finns det ett sätt att uttrycka ett nytt glidande medelresultat endast som en funktion av det gamla resultatet och det nya provet. Ange ett exempel rörande medelvärde, över ett fönster på 4 prover att vara. Lägg till nytt prov eA Glidande medelvärde kan implementeras rekursivt men för en exakt beräkning av glidande medelvärde måste du komma ihåg det äldsta inmatningsprovet i summan, dvs a i ditt exempel. För ett längd N glidande medelvärde beräknar du. Där yn är utsignalen och xn Är ingångssignalen Eq 1 kan skrivas rekursivt som. Så du behöver alltid komma ihåg provet x nN för att beräkna 2. Som påpekad av Conrad Turner kan du använda ett oändligt långt exponentialfönster istället, vilket gör att du kan beräkna Utgången endast från det förflutna ut Put och nuvarande input. but detta är inte ett vanligt obetydligt glidande medelvärde, men ett exponentiellt vägat glidande medelvärde, där prov i det förflutna får en mindre vikt, men åtminstone teoretiskt glömmer du aldrig någonting, vikterna blir bara mindre och mindre för Prover långt ifrån. Jag genomförde ett glidande medelvärde utan individuellt objektminne för ett GPS-spårningsprogram som jag skrev. Jag börjar med 1 prov och dela med 1 för att få nuvarande avg. I lägger sedan till ett exempel och delar upp med 2 till Nuvarande avg. This fortsätter tills jag når längden på genomsnittet. Varje gång efteråt lägger jag till i det nya provet, får medelvärdet och tar bort det genomsnittet från summan. Jag är inte matematiker men det verkade som ett bra sätt att Gör det jag trodde det skulle vända på en riktig matte kille, men det visar sig att det är ett av de accepterade sätten att göra det Och det fungerar bra Kom ihåg att ju högre längden desto långsammare följer det du vill följa Det kan inte ha betydelse för det mesta Tiden, men när du följer satelliter, kan du vara långsiktig om du är långsam, och det kommer att se dåligt ut. Du kan ha ett mellanrum mellan mitten och de efterföljande punkterna jag valde en längd på 15 uppdaterade 6 gånger per minut för att Få tillräcklig utjämning och inte komma för långt från den faktiska lätta positionen med de släta spårpunkterna. Svarade 16 november 16 vid 23 03.initialisera totalt 0, räkna 0 varje gång vi ser ett nytt värde. Då en inmatningsscannf, lägger man till totalt nyttValue, Ett inkrementstal, en dela upp genomsnittlig totalräkning. Detta skulle vara ett glidande medelvärde för alla inmatningar. För att beräkna medelvärdet över endast de senaste 4 ingångarna, skulle det behöva 4 ingångsvariabler, kanske kopiering av varje ingång till en äldre ingångsvariabel och sedan beräkning av den nya rörelsen Genomsnittet som summan av de fyra ingångsvariablerna dividerat med 4 högerskift 2 skulle vara bra om alla ingångar var positiva för att göra den genomsnittliga beräkningen. Svarade 3 februari kl. 15 06. Det kommer faktiskt att beräkna det totala genomsnittet och INTE det glidande medlet som Räkna få S större påverkan av något nytt ingångsprov blir vanishingly liten Hilmar Feb 3 15 på 13 53. Ditt Svar.2017 Stack Exchange, Inc. Mean filter, eller medelfilter. Kategori Digital signal och bildbehandling DSP och DIP mjukvaruutveckling. Artikeln är en praktisk guide för medelfilter eller genomsnittlig filterförståelse och implementering. Artikeln innehåller teori, C-källkod, programmeringsinstruktioner och provapplikation.1 Inledning till medelfilter eller genomsnittligt filter. Manfilter eller medelfilter är fönsterfiltret av linjär klass , Som släpper signalbilden Filtret fungerar som lågpasset En grundtanken bakom filteret är att någon del av signalbilden tar ett medelvärde över dess grannskap. För att förstå hur det görs i praktiken, låt oss börja med fönsteridee.2 Filter Fönster eller mask. Låt oss föreställa dig att du borde läsa en bokstav och vad du ser i text begränsad av hål i speciell stencil som denna. Fig 1 Första stencil. Så är resultatet av läsning ljudet t Ok, låt dig S läs brevet igen, men med hjälp av en annan stencil. Fig 2 Andra stencil. Nå resultatet av att läsa t är ljud Låt oss göra det tredje försöket. Fig 3 Tredje stencil. Nu läser du bokstaven t som ljud. Vad händer Här För att säga det i matematiskt språk gör du en operation som läser över elementstavlet t Och resultatet ljudet beror på elementet grannskap bokstäver bredvid t. And den stencilen, som hjälper till att plocka element grannskap, är fönster Ja, fönstret är Bara en stencil eller ett mönster, genom vilket du väljer elementet grannskapet en uppsättning av element runt den givna för att hjälpa dig att fatta beslut. Ett annat namn för filterfönstret är mask 3 i 2D. I tre dimensioner Tänk på byggnad Och nu om rum I den byggnaden Rummet är som 3D-fönster som skär ut en del delrum från hela byggnaden. Du kan hitta 3D-fönster i volym voxel bildbehandling. Fig 6 Fönster eller mask av storlek 3 3 3 i 3D.3 Förstå genomsnittligt filter. Nå låt oss se hur Ta ett medelvärde över elementets grannskap. Formeln är enkla summeringselement och dela summan av antalet element. Låt oss exempelvis beräkna ett medelvärde för fallet, avbildat i fig. 7.Fig 7 Med ett genomsnitt. Och det är allt Ja, vi har bara filtrerat 1D-signal med medelfilter. Låt oss göra CV och skriva ned steg-för-steg-instruktioner för bearbetning med medelfilter. Använd filter eller genomsnittlig filteralgoritm. Placera ett fönster över elementet. Ta en genomsnittlig summa upp element Och dela summan av antalet element. Nu när vi har algoritmen är det dags att skriva en kod, låt oss komma ner till programmeringen.4 1D-medelfiltrering. I det här avsnittet utvecklar vi 1D-medelfilter med fönster av storlek 5 Låt oss ha 1D-signal om längd N som input Det första steget är att placera fönster genom att ändra det genom att ändra index för det ledande elementet. Uppmärksamma att vi börjar med det tredje elementet och slutar med det sista men två Problemet är vi Kan inte börja med det första elementet, vara Orsak i det här fallet är den vänstra delen av filterfönstret tomt. Vi diskuterar nedan hur man löser det problemet. Det andra steget tar medeltalet ok. Nu, låt oss skriva ner algoritmen som funktion. Typelement kan definieras As.5 Behandling av kanter. För alla fönsterfilter finns det något problem Det är kantbehandling Om du lägger fönster över första sista elementet kommer den vänstra högra delen av fönstret att vara tomt. För att fylla gapet ska signalen utökas För medelfilter där Det är en bra idé att förlänga signalen eller bilden symmetriskt, så här. Så innan signalet skickas till vår genomsnittliga filterfunktion, bör signalen utökas. Låt oss skriva ner wrappen, vilket gör alla förberedelser. Som du kan se tar vår kod hänsyn till Några praktiska problem Först och främst kontrollerar vi våra ingångsparametrar bör signalen inte vara NULL och signallängden ska vara positiv. Andra steg vi kolla fallet N 1 Detta fall är speciellt, för att bygga förlängning behöver vi minst två element För signalen Av 1 element Längden resultatet är själva signalen. Också, uppmärksamma, vårt genomsnittliga filter fungerar på plats, om utgångsparameterresultatet är NULL. Nu kan vi allokera minnet för signalförlängning. Och kontrollera minnesallokering. Jag vet att detta kan uppnås med boost enligt. Är jag verkligen vill undvika att använda boost har jag googled och inte hittat några lämpliga eller läsbara exempel. I grunden vill jag spåra det rörliga genomsnittet av en pågående ström av en ström av flytande punktnummer med de senaste 1000 numren som en data Sample. What ä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 best. asked 12/12 12 vid 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 det nya värdet. Du väljer en konstant alfa tha T är mellan 0 och 1 och beräkna detta. Du behöver bara hitta ett värde av alf, där effekten av ett visst prov endast varar för cirka 1000 prov. Hmm, jag är inte säker på att det passar dig, nu när jag Jag har det 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 siffrorna, utan underflöde i flytpunktsberäkningen. Men om du ville ha en Mindre medelvärde, som 30 nummer eller så, det här är ett mycket enkelt och snabbt sätt att göra it. answered 12 juni 12 på 4 44. 1 på ditt inlägg Det exponentiella glidande medlet kan låta alfabetet vara variabelt Så här tillåter det att det används 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 alfa vara 1 0 Annars kan du låta alfa vara usecs sedan senaste uppdateringen 1000000 jxh jun 12 12 vid 6 21. Basiskt Jag vill spåra det rörliga genomsnittet av en pågående ström av en ström av float Ange siffror med de senaste 1000 siffrorna som ett dataprov. Notera att nedanstående uppdaterar summan som element som tillsatt ersatt, vilket undviker kostnadskrävande ON-traversal för att beräkna summan som behövs för genomsnittet - på begäran. Totalt 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 fel i att numsamples kan gå förbi INTMAX - om du bryr dig att du kan använda en osignerad Länge länge eller använd en extra bool-data medlem för att spela in när behållaren fylls i första gången medan cykeltalsprover runt arrayen bäst omnämns på något oskyldigt som pos. answered 12/12 12 vid 5 19.one förutsätter att tomrumsoperatör T-provet är faktiskt tomt operatör T prov oPless 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 vill, kommer att fixa, tack Tony D Jun 8 14 på 14 27.
No comments:
Post a Comment