Friday, 20 October 2017

Glidande medelvärde implementering c


Är det möjligt att implementera ett glidande medelvärde i C utan att det behövs ett fönster i prov. Jag har funnit att jag kan optimera lite genom att välja en fönsterstorlek som motsvarar två för att tillåta bitskiftning istället för att dela men behöver inte en buffert 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 utsignalen 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 delas 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 bara 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 av tiden men när du följer satelliter, om du är långsam kan spåret vara långt ifrån den verkliga positionen 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 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. 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 medelvärde som summa av de 4 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 den 3 februari kl 04 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 försvinnande liten Hilmar 3 feb kl 15 på 13 53. Ditt svar.2017 Stack Exchange, Inc. The Moving Average som ett filter. Det rörliga genomsnittet används ofta för att utjämna data i närvaro av brus Det enkla glidande medlet är inte alltid känt som FIT-filteret Finite Impulse Response, det är det, men det är faktiskt ett av de vanligaste filtren i signalbehandling. Behandling av det som ett filter gör det möjligt att jämföra det med till exempel fönsterfönster med synkronisering se artiklarna på lågpass-högpass och bandpass och bandavvisningsfilter för exempel på dem. Den största skillnaden med dessa filter är att det rörliga medlet är lämpligt för signaler för vilka den användbara informationen finns i tidsdomänen av vilken utjämningsmätningar med medelvärde är ett utmärkt exempel Windowed-sinc-filter är å andra sidan starka utövande i frekvensdomänen med utjämning i ljudbehandling som ett typiskt exempel. Det finns en mer detaljerad jämförelse Ison av båda typerna av filter i Time Domain vs Frekvens domänprestanda för filter Om du har data för vilka både tid och frekvensdomän är viktiga, kan du kanske titta på variationer på det rörliga genomsnittet som presenterar ett antal viktade versioner av det glidande medlet som är bättre vid det. Rörande medelvärdet av längden N kan definieras som. skrivet som det typiskt implementeras med det aktuella utgångsprovet som medeltalet av de föregående N-proverna Sikt som ett filter, rörelsen Medelvärdet utför en konvolvering av ingångssekvensen xn med en rektangulär puls med längd N och höjd 1 N för att göra pulsens område, och därmed förstärkningen av filtret, en i praktiken är det bäst att ta N udda ett glidande medel kan också beräknas med användning av ett jämnt antal prover, med användning av ett udda värde för N har fördelen att fördröjningen av filtret kommer att vara ett heltal antal prover, eftersom fördröjningen av ett filter med N-prover är exakt N - 1 2 Den rörliga Medelvärdet kan sedan justeras exakt med de ursprungliga uppgifterna genom att flytta det med ett heltal antal prover. Tidsdomän. Eftersom det rörliga medlet är en konvolvering med en rektangulär puls, är dess frekvensrespons en sinc-funktion. Det gör det något som det dubbla av windowed-sinc-filtret, eftersom det är en konvolvering med en sinc-puls som resulterar i ett rektangulärt frekvenssvar. Det är detta sinc-frekvensrespons som gör det rörliga medlet en dålig artist i frekvensdomänen. Det fungerar emellertid mycket bra under tiden domän Det är därför perfekt att släta data för att ta bort brus samtidigt som de fortfarande håller ett snabbt stegsvar. Figur 1.Figur 1 Utjämning med ett glidande medelfilter. För det typiska Additiv White Gaussian Noise AWGN som ofta antas är medelvärdet N prover medför att SNR ökas med en faktor kvt. N Eftersom bullret för de enskilda proverna är okorrelerat finns det ingen anledning att behandla varje prov olika. Därför flyttar rörelsen genomsnittet, vilket ger varje prov samma vikt, kommer att bli av med den maximala bullernivån för ett givet stegresponsskärpa. Eftersom det är ett FIR-filter kan det glidande medlet implementeras genom konvolvering. Det kommer då att ha samma effektivitet eller brist av det som något annat FIR-filter. Det kan också implementeras rekursivt på ett mycket effektivt sätt. Det följer direkt av definitionen att. Denna formel är resultatet av uttrycken för yn och yn 1, jag e. where vi märker att Förändringen mellan yn 1 och yn är att en extra term xn 1 N framträder i slutet medan termen x nN 1 N avlägsnas från början I praktiska tillämpningar är det ofta möjligt att lämna upp dividen med N för varje term genom att kompensera för den resulterande förstärkningen av N på ett annat ställe. Detta rekursiva genomförande kommer att vara mycket snabbare än konvolvering. Varje nytt värde av y kan beräknas med endast två tillägg istället för de N-tillägg som skulle vara nödvändiga för ett enkelt genomförande Enting av definitionen En sak att se upp med en rekursiv implementering är att avrundningsfel kommer att ackumuleras. Detta kan eller kanske inte är ett problem för din ansökan, men det innebär också att denna rekursiva implementering faktiskt kommer att fungera bättre med ett heltal implementering än med flytande punkttal Detta är ganska ovanligt, eftersom en flytande punktimplementering vanligtvis är enklare. Slutsatsen av allt detta måste vara att du aldrig ska underskatta användbarheten av det enkla glidande medelfiltret i signalbehandling. Filtrera verktyg. Denna artikel är kompletterat med ett filterdesignverktyg Experiment med olika värden för N och visualisera de resulterande filteren. Prova nu. Jag vet att det här kan uppnås med boost som per. Men jag vill verkligen undvika att använda boost jag har googled och inte hittat någon lämplig eller läsbar Exempelvis vill jag spåra det rörliga genomsnittet av en pågående ström av en ström av flytande punktnummer med hjälp av den senaste 1 000 tal 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 best. asked 12 juni 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 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. Jag är inte säker på att det här passar för 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 talen utan underflöde i flytpunktsberäkningen. Men om Du ville ha en mindre medelvärde e, som 30 nummer eller så är det hä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å här låter det användas för att beräkna tidsbasen medeltal, t. ex. bytes per sekund Om tiden sedan den senaste ackumulatorns uppdatering ä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 flytande punktnummer med de senaste 1000 siffrorna som ett dataprov. Notera att nedanstående uppdaterar summan som element som tillsatt ersatt, vilket undviker kostsamt ON-traversal för att beräkna summan - behövs för genomsnittet - on demand. Total görs en annan parameter från T för att understödja t ex med en lång lång när totalt 1000 lång s, ett int för char s eller en dubbel till total float s är. Detta är lite fel i det Numsamples kan gå förbi INTMAX - om du bryr dig att du kan använda en unsigned long länge eller använd en extra bool data medlem för att spela in när behållaren fylls först medan cykel nummor runt arrayen bäst sedan bytt namn 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 gillade kommer att fixa, tack Tony D Jun 8 14 på 14 27.

No comments:

Post a Comment