Glidande medelvärde filter c källkod
Är det möjligt att implementera ett glidande medelvärde i C utan att det behövs ett fönstervindu Ive fann 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 behöver inte 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 Definiera ett exempel glidande medelvärde, över ett fönster med 4 prov att vara: Lägg till nytt prov e: Ett glidande medel kan implementeras rekursivt , men för en exakt beräkning av det rörliga genomsnittet måste du komma ihåg det äldsta inmatningsprovet i summan (dvs a i ditt exempel). För ett längd N rörligt medelvärde beräknar du: var yn är utsignalen och xn är ingångssignalen. Eq. (1) kan skrivas rekursivt som Så du behöver alltid komma ihåg provet xn-N för att beräkna (2). Som påpekat av Conrad Turner kan du använda ett (oändligt långt) exponentiellt fönster istället, vilket gör det möjligt att beräkna utmatningen endast från tidigare utmatning och aktuell ingång: men detta är inte ett vanligt (obetydligt) glidande medelvärde men exponentiellt viktat 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 implementerade 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. Sedan lägger jag till ett prov och delar upp med 2 till den nuvarande avg. Detta fortsätter tills jag når längden på medelvärdet. 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öra det. Jag tänkte att det skulle vända på magen 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 bara ihåg att ju högre längden desto långsammare följer du vad du vill följa. Det kan inte ha betydelse för det mesta, men när du följer satelliter, kan du vara långsiktig, om det är långt ifrån det faktiska läget och det kommer att se dåligt ut. Du kan få ett mellanrum mellan mitten och de efterföljande prickarna. Jag valde en längd på 15 uppdaterad 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. svarat 16 november 16 kl 23:03 initialisera totalt 0, count0 (varje gång vi ser ett nytt värde) Då en inmatning (scanf), en lägg till totalnewValue, en ökning (räkning), en delningsgenomsnitt (totalantal) Detta skulle vara ett glidande medelvärde över alla ingångar För att beräkna medelvärdet över endast de fyra sista 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 det nya glidande medlet. Som summan av de fyra ingångsvariablerna dividerat med 4 (höger skift 2 skulle vara bra om alla ingångar var positiva för att göra den genomsnittliga beräkningen besvarad 3 feb 15 kl 4:06 som faktiskt kommer att beräkna det totala genomsnittet och INTE det rörliga genomsnittet. När räkningen blir större blir effekten av ett nytt ingångsprov försvinnande liten ndash Hilmar Feb 3 15 kl 13:53 Ditt svar 2017 Stack Exchange, Inc Jag vet att detta kan uppnås med boost enligt: 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 rör på sig Medelvärdet av en pågående ström av en ström av flytpunkten med de senaste 1000 siffrorna som ett dataprov. Vad ä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. frågade 12 juni 12 kl 4:38 Om dina behov är enkla kan du bara försöka använda ett exponentiellt glidande medelvärde. Enkelt du skapar en ackumulatorvariabel, och när din kod tittar på varje prov uppdateras koden med ackumulatorn med det nya värdet. 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 prover. Hmm, jag är inte säker på att det här passar dig, nu när 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 medelvärdet över de senaste 1000 siffrorna, utan underflöde i flytpunktsberäkningen. Men om du ville ha ett mindre medelvärde, som 30 nummer eller så, är det här ett mycket enkelt och snabbt sätt att göra det. svarade 12 jun 12 kl 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 för att beräkna tidsbaserade medelvärden (t ex byte per sekund). Om tiden sedan den senaste ackumulatorns uppdatering är mer än 1 sekund, låter du alpha vara 1,0. Annars kan du låta alpha vara (usecs sedan senaste uppdateringen1000000). ndash jxh Jun 12 12 at 6:21 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 punkttal med de senaste 1000 siffrorna som ett dataprov. Observera att nedanstående uppdaterar summan som element som läggs ut och undviker kostsam O (N) - korsning för att beräkna summan som behövs för genomsnittet - efterfrågan. Totalt görs en annan parameter från T för att stödja t. ex. använder en lång lång när totalt 1000 lång s, ett int för char s, eller en dubbel till totalt float s. Det här är lite bristfälligt i att numsamples kan gå förbi INTMAX - om du bryr dig att du kan använda en unsigned long long. 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ämndes något oskyldigt som pos). svarade den 12 juni 12 på 5:19 en förutsätter att kvoträttsoperatören (T-provet) kvot är faktiskt kvittooperatör (T-prov) citat. ndash oPless 8 juni 14 kl 11:52 oPless ahhh. välspotted. egentligen menade jag att det skulle vara tomt operatör () (T-prov) men självklart kunde du använda vilken anteckning du gillade. Kommer att fixa, tack. ndash Tony D Jun 8 14 at 14:27Mean filter, eller medelfilter Kategori. Digital signal - och bildbehandling (DSP och DIP) mjukvaruutveckling. Abstrakt. 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 medelfilter Medelfilter. eller medelfilter är windowed-filter av linjär klass, som släpper ut signalen (bild). Filtret fungerar som lågpass en. Den grundläggande tanken bakom filteret är att någon del av signalen (bilden) tar ett medelvärde över hela sitt grannskap. För att förstå hur det görs i praktiken, låt oss börja med fönsteridee. 2. Filterfönster eller mask Låt oss föreställa oss att du borde läsa ett brev och vad du ser i text begränsad av hål i speciell stencil så här. Så, resultatet av behandlingen är ljudet t. Ok, låt oss läsa brevet igen, men med hjälp av en annan stencil: Nu är resultatet av att läsa t ljud 240. Låt oss göra det tredje försöket: Nu läser du bokstaven t som ljud 952. Vad händer här Att säga det I matematiskt språk gör du en operation (läsning) över elementet (bokstav t). Och resultatet (ljudet) beror på elementets grannskap (bokstäver bredvid t). Och den stencilen, som hjälper till att hämta elementet grannskap, är fönster Ja, fönstret är bara en stencil eller ett mönster, genom vilket du väljer elementet grannskapet 0151 en uppsättning av element runt den givna 0151 för att hjälpa dig att fatta beslut. Ett annat namn för filterfönstret är mask 0151 mask är en stencil, som döljer element vi inte uppmärksammar på. I vårt exempel är det element vi arbetar på placerat längst till vänster i fönstret, men i praktiken är dess vanliga läge mitt i fönstret. Låt oss se några fönster exempel. I en dimension. Fig. 4. Fönster eller mask av storlek 5 i 1D. I två dimensioner. Fig. 5. Fönster eller mask av storlek 3times3 i 2D. I tre dimensioner. Tänk på att bygga. Och nu mdash om rum i den byggnaden. Rummet är som 3D-fönster, vilket skär ner en del delrum från hela byggnaden. Du kan hitta 3D-fönster i volym (voxel) bildbehandling. 3. Förstå genomsnittliga filter Nu får vi se hur man ldquotake ett genomsnitt över element neighborhoodredquo. Formeln är enkla 0151 sammanfatta element och dela summan av antalet element. Låt oss exempelvis beräkna ett medelvärde för fallet, som visas i fig. 7. Fig. 7. Med ett medelvärde. 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. Medelfilter eller medelfilteralgoritm: Lägg ett fönster över elementet Ta en genomsnittlig summa upp för 0151 och dela summan av antalet element. Nu när vi har algoritmen är det dags att skriva lite kod mdash låt oss komma ner till programmering. 4. 1D-medelfilterprogrammering I detta avsnitt utvecklar vi 1D-medelfilter med fönster av storlek 5. Låt oss ha 1D-signal med längd N som ingång. Det första steget är att placera fönstret 0151 så gör vi det genom att ändra indexet på det ledande elementet: Var uppmärksam på att vi börjar med det tredje elementet och slutar med det sista men två. Problemet är att vi inte kan börja med det första elementet, eftersom det här är den vänstra delen av filterfönstret tomt. Vi kommer att diskutera nedan, hur man löser det problemet. Det andra steget tar medeltalet ok: Låt oss nu skriva ner algoritmen som funktion: Typelementet kan definieras som: 5. Behandla kanter För alla fönsterfilter finns det något problem. Det är kantbehandling. Om du placerar fönstret över första (sista) elementet kommer den vänstra (högra) delen av fönstret att vara tomt. För att fylla gapet bör signalen utökas. För medelfilter är det en bra idé att utvidga signalen eller bilden symmetriskt så här: Så innan signalen skickas till vår genomsnittliga filterfunktion, ska signalen utökas. Låt oss skriva ner omslaget, 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 0151-signalen bör inte vara NULL, och signallängden ska vara positiv: Andra steg 0151 kontrollerar vi fall N1. Det här fallet är speciellt, för att bygga tillägg behöver vi minst två delar. För signalen med 1 elementlängd är resultatet själva signalen. Också uppmärksamma, vårt genomsnittliga filter fungerar på plats, om utgångsparameterresultatet är NULL. Låt oss nu tilldela minne för signalförlängning. Och kolla minnesallokering.
Comments
Post a Comment