Wednesday 1 November 2017

Glidande medelvärde vs low pass filter


Det rörliga genomsnittet som ett filter Det rörliga genomsnittet används ofta för utjämning av data i närvaro av brus. Det enkla glidande medlet är inte alltid känt som FIT-filtret (Finite Impulse Response) som det är, medan det faktiskt är ett av de vanligaste filteren i signalbehandling. Att behandla det som ett filter gör det möjligt att jämföra det med, till exempel, fönsterfönster med synkronisering (se artiklarna om lågpass, högpass och bandpass och bandavvisningsfilter för exempel på dem). Den stora 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. varav utjämning av mätningar med medelvärde är ett utmärkt exempel. Windowed-sinc-filter är å andra sidan starka utövande inom frekvensområdet. med utjämning i ljudbehandling som ett typiskt exempel. Det finns en mer detaljerad jämförelse av båda typerna av filter i Time Domain vs Frekvensdomänprestanda för filter. Om du har data där både tid och frekvensdomän är viktiga, kanske du vill titta på variationer på rörlig genomsnittsnivå. Vilket presenterar ett antal viktade versioner av det glidande medlet som är bättre på det. Det rörliga genomsnittet av längd (N) kan definieras som skrivet som det typiskt implementeras, med det aktuella utgångsprovet som medelvärdet av de tidigare (N) - proverna. Sett som ett filter utför det rörliga medlet en konvolvering av ingångssekvensen (xn) med en rektangulär puls längd (N) och höjd (1N) (för att göra pulsens område och därmed förstärkningen av filtret , ett ). I praktiken är det bäst att ta (N) udda. Även om ett glidande medelvärde också kan beräknas med ett jämnt antal prover, har fördelen med att fördröjningen av filtret är ett heltal antal prover, eftersom fördröjningen av ett filter med (N) proverna är exakt ((N-1) 2). Det rörliga genomsnittet 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. Detta 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 genomsnittet en dålig performer i frekvensdomänen. Det fungerar dock mycket bra i tidsdomänen. Därför är det perfekt att släta data för att ta bort brus samtidigt som du fortfarande håller ett snabbt stegsvar (Figur 1). För det typiska Additiv White Gaussian Noise (AWGN) som ofta antas, har medelvärden (N) prover effekten av att öka SNR med en faktor (sqrt N). Eftersom bruset för de enskilda proverna är okorrelerat finns det ingen anledning att behandla varje prov på olika sätt. Därför kommer det rörliga medelvärdet, vilket ger varje prov samma vikt, att bli av med den maximala mängden brus för en given stegresponsskärpa. Genomförande Eftersom det är ett FIR-filter kan det glidande medlet implementeras genom konvolvering. Det kommer då att ha samma effektivitet (eller brist på det) som alla andra FIR-filter. Det kan emellertid också genomföras rekursivt, på ett mycket effektivt sätt. Det följer direkt av definitionen att denna formel är resultatet av uttrycken för (yn) och (yn1), dvs där vi märker att förändringen mellan (yn1) och (yn) är att en extra term (xn1N) visas vid Slutet, medan termen (xn-N1N) tas bort från början. I praktiska tillämpningar är det ofta möjligt att lämna uppdelningen av (N) för varje term genom att kompensera för den resulterande vinsten av (N) på en annan plats. Detta rekursiva genomförande kommer att bli mycket snabbare än konvolvering. Varje nytt värde av (y) kan beräknas med endast två tillägg, i stället för (N) tillägg som skulle vara nödvändiga för en enkel implementering av definitionen. En sak att se efter med en rekursiv implementering är att avrundningsfel kommer att ackumuleras. Det kan vara 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 punktnummer. Detta är ganska ovanligt, eftersom en flytande punktimplementering vanligtvis är enklare. Slutsatsen av allt detta måste vara att du aldrig ska underskatta nyttan av det enkla glidande medelfiltret i signalbehandlingsapplikationer. Filtrera designverktyg Denna artikel kompletteras med ett filterdesignverktyg. Experimentera med olika värden för (N) och visualisera de resulterande filteren. Prova det nuFrekvensrespons för det löpande medelfiltret Frekvensresponsen hos ett LTI-system är DTFS för impulsresponset. Impulsresponsen av ett L-provrörande medelvärde är Eftersom det glidande medelfiltret är FIR, minskar frekvensresponsen till den ändliga summa Vi kan använda den mycket användbara identiteten för att skriva frekvensresponsen som där vi har låt oss minus jomega. N 0 och M L minus 1. Vi kan vara intresserade av storleken på denna funktion för att bestämma vilka frekvenser som går igenom filtret obetydligt och vilka dämpas. Nedan är en plot av storleken på denna funktion för L 4 (röd), 8 (grön) och 16 (blå). Den horisontella axeln sträcker sig från noll till pi radianer per prov. Observera att frekvensresponsen i alla tre fall har en lowpass-egenskap. En konstant komponent (nollfrekvens) i ingången passerar genom filtret obetydligt. Vissa högre frekvenser, såsom pi 2, elimineras helt av filtret. Men om avsikt var att designa ett lågpassfilter, så har vi inte gjort det bra. Några av de högre frekvenserna dämpas endast med en faktor om 110 (för 16-punkts glidande medelvärdet) eller 13 (för det fyrapunkts glidande medlet). Vi kan göra mycket bättre än det. Ovanstående plot skapades av följande Matlab-kod: omega 0: pi400: pi H4 (14) (1-exp (-iomega4)) (1-exp (-iomega)) H8 (18) Iomega8)) (1-exp (-iomega)) H16 (116) (1-exp (-iomega16)) (1-exp (-iomega)) plot (omega, abs (H4) H16)) axel (0, pi, 0, 1) Copyright kopia 2000- - University of California, Berkeley Jag kodar någonting för tillfället där jag tar en massa värden över tid från en hårdvarukompass. Kompassen är mycket exakt och uppdateras mycket ofta, med det resultat att om det jiggles något slutar jag med det udda värdet som är väldigt inkonsekvent med sina grannar. Jag vill släta ut dessa värden. Efter att ha läst lite läsning verkar det som att jag vill ha ett högpassfilter, ett lågpassfilter eller ett glidande medelvärde. Flyttande medelvärde jag kan gå ner med, behåll bara en historia av de senaste 5 värdena eller vad som helst, och använd medelvärdet av dessa värden nedströms i min kod där jag en gång bara använde det senaste värdet. Det borde jag, släpa ut jigglarna snyggt, men det verkar som om det är ganska ineffektivt, och det är förmodligen ett av de kända problemen med riktiga programmerare där det är en riktigt snygg kladdmatlösning. Jag är emellertid en av de hemska självlärda programmörerna utan en form av formell utbildning i vad som helst vagt relaterat till CompSci eller Math. Att läsa om lite tyder på att det här kan vara ett högt eller lågt passfilter, men jag kan inte hitta någonting som förklarar vad som är begripligt för ett hack som jag, hur effekten av dessa algoritmer skulle vara på en uppsättning värden, än mindre hur matematiken Arbetar. Svaret som ges här. till exempel, svarar tekniskt på min fråga, men bara i förståelse för dem som förmodligen redan vet hur man löser problemet. Det skulle vara en väldigt härlig och smart person som vem skulle kunna förklara det här problemet, och hur lösningarna fungerar, vilket är begripligt för en kandidatexamen. Frågade 21 sep 10 kl 13:01 Om ditt rörliga medelvärde måste vara långt för att uppnå den nödvändiga utjämningen och du inte behöver någon särskild form av kärna, då är du bättre om du använder ett exponentiellt förfallande glidande medelvärde: var du välj liten för att vara en lämplig konstant (t. ex. om du väljer liten 1- 1N, kommer den att ha samma mängd medelvärde som ett fönster av storlek N, men distribueras annorlunda över äldre punkter). Hur som helst, eftersom nästa värde av det rörliga genomsnittet bara beror på den föregående och dina data behöver du inte behålla en kö eller något. Och du kan tänka på det här som att göra något, ja, jag har en ny punkt, men jag litar verkligen inte på det, så jag ska hålla 80 av min gamla uppskattning av mätningen och lita bara på den nya datapunkten 20. Thats Tämligen detsamma som att säga, Tja, jag litar bara på den här nya punkten 20, och jag använder 4 andra punkter som jag litar på samma belopp, förutom att istället för att uttryckligen ta de 4 andra punkterna antar du att den genomsnittliga tiden du gjorde förra gången var förnuftigt så att du kan använda ditt tidigare arbete. svarat 21 sep 10 kl 14:27 Hej, jag vet att det här är 5 år sent, men tack för ett fantastiskt svar. I39m arbetar på ett spel där ljudet ändras baserat på din hastighet, men på grund av att du kör spelet på en slow-ass-dator, skulle hastigheten fluktuera vildt, vilket var bra för styrning, men mycket irriterande när det gäller ljud. Det var en väldigt enkel och billig lösning på någonting som jag trodde skulle vara ett väldigt komplext problem. ndash Adam Mar 16 15 kl 20:20 Om du försöker ta bort det enstaka udda värdet är ett lågpassfilter det bästa av de tre alternativen du har identifierat. Lågpassfilter tillåter låghastighetsändringar som de som orsakas av att man roterar en kompass för hand, medan man förkastar höghastighetsförändringar, t. ex. de som orsakas av stötar på vägen, till exempel. Ett glidande medelvärde kommer förmodligen inte vara tillräckligt, eftersom effekterna av ett enda blip i dina data kommer att påverka flera efterföljande värden beroende på storleken på ditt glidande medelfönster. Om de ojämna värdena lätt kan detekteras kan du till och med vara bättre med en glitch-avlägsnande algoritm som helt ignorerar dem: Här är en gickdiagram som illustrerar: Den första grafen är ingångssignalen, med en obehaglig glitch. Det andra diagrammet visar effekten av ett rörligt medelvärde på 10 prov. Slutgrafen är en kombination av 10-provvärdet och den enkla glitchdetekteringsalgoritmen som visas ovan. När glitchen detekteras används 10-provsgenomsnittet istället för det faktiska värdet. svarat 21 sep 10 kl 13:38 Nätt förklarad och bonuspoäng för grafen) ndash Henry Cooke 22 sep 10 kl 0:50 Wow. Sällan såg ett bra svar ndash Muis 4 juni 13 kl 9:14 Det rörliga genomsnittet är ett lågpassfilter. ndash nomen 21 okt 13 kl 19:36 Prova en löpande median istället. ndash kert 25 apr 14 kl 22:09 Flyttande medelvärde Jag kan komma ner med. Men det verkar som om det är ganska ineffektivt. Theres verkligen ingen anledning att ett rörligt medelvärde borde vara ineffektivt. Du behåller antalet datapunkter du vill ha i en viss buffert (som en cirkelkö). På varje ny datapunkt popar du det äldsta värdet och subtraherar det från en summa och trycker på det nyaste och lägger det till summan. Så varje ny datapunkt innebär egentligen bara en poppush, ett tillägg och en subtraktion. Ditt rörliga medelvärde är alltid denna förskjutande sum dividerad med antalet värden i din buffert. Det blir lite svårare om du tar emot data samtidigt från flera trådar, men eftersom dina data kommer från en hårdvarubutik som verkar mycket tveksamt för mig. Åh och också: hemska självlärda programmerare förenar) Det rörliga genomsnittet verkade ineffektivt för mig eftersom du måste lagra en buffert med värden - bättre att bara göra lite Clever Maths med ditt inmatningsvärde och nuvarande arbetsvärde Jag tror att det är hur exponentiell glidande medelvärde Arbetar. En optimering som jag har sett för den här typen av glidande medelvärde innebär att du använder en fast-längd köförstärkare en pekare till var du befinner dig i den köen och bara sveper pekaren runt (med eller om). Voila Ingen dyr manchet. Kraft till amatörerna, bror ndash Henry Cooke Sep 22 10 på 0:54 Henry: För ett rakare rörligt medel behöver du bufferten helt enkelt så att du vet vilket värde som dyker upp när nästa värde blir skjutit. Med detta sagt, den kvoterade längdköppen förstärkaren en pointerquot du beskriver är exakt vad jag menade med kvotcirkelkö. Det var därför jag sa att det inte är ineffektivt. Vad trodde du att jag menade Och om ditt svar är kvot array som ändrar sina värden tillbaka på varje indexerad removalquot (som std :: vektor i C). Ja, då är jag så skadad att jag inte ens vill prata med dig längre) ndash Dan Tao Sep 22 10 på 1:58 Henry: Jag vet inte om AS3, men en Java-programmerare har samlingar som CircularQueue vid hisher bortskaffande (I39m inte en Java-utvecklare så jag är säker på att det finns bättre exempel där ute, det är bara det jag hittade från en snabb Google-sökning), som precis implementerar funktionaliteten vi talar om. Jag är ganska säker på att majoriteten på mellannivå och lågnivå språk med standardbibliotek har något liknande (t ex i QueueltTgt). Hur som helst, jag var filosofi själv, så. allt är förlåtet. ndash Dan Tao 22 sep 10 kl 12:44 Ett exponentiellt förfallande glidande medelvärde kan beräknas för hand med endast trenden om du använder rätt värden. Se fourmilab. chhackdiete4 för en idé om hur man gör det snabbt med en penna och papper om du letar efter exponentiellt slätat glidande medelvärde med 10 utjämning. Men eftersom du har en dator, vill du förmodligen göra binärväxling i motsats till decimalväxling) På så sätt är allt du behöver en variabel för ditt nuvarande värde och en för genomsnittsvärdet. Nästa medelvärde kan då beräknas utifrån det. svarade 21 sep 10 kl 14:39 theres en teknik kallad en intervall grind som fungerar bra med låg förekomst falska prover. förutsatt att användningen av en av de ovannämnda filterteknikerna (glidande medelvärde, exponentiella), när du har tillräcklig historia (en tidskonstant), kan du testa det nya inkommande dataprovet för rimlighet innan det läggs till i beräkningen. viss kunskap om den maximala rimliga hastighetsgraden av signalen krävs. Råprovet jämförs med det senaste släta värdet, och om det absoluta värdet av den skillnaden är större än det tillåtna intervallet, kastas det provet (eller ersätts med lite heuristisk, t. ex. en förutsägelse baserad på lutningsskillnad eller trenden Förutsägelsevärde från dubbel exponentiell utjämning) svarat 30 april 16 kl 6: 56 En enkel, enkelpolig lågpass, recursiv IIR-filter är snabb och enkel att genomföra, t. ex. Där x, y är de raka (ofiltrerade) XY-accelerometersignalerna, xf, yf är de filtrerade utsignalerna och k bestämmer filternas tidskonstant (vanligtvis ett värde mellan 0,9 och 0,9999. Där en större k betyder en längre tidskonstant ). Du kan bestämma k empiriskt, eller om du känner din önskade avstängningsfrekvens, Fc. Då kan du använda formeln: där Fs är provfrekvensen. Observera att xf, yf är de tidigare värdena för utsignalen på RHS och de nya utgångsvärdena på LHS i uttrycket ovan. Observera också att vi antar här att du kommer att samplera accelerometerns signaler med vanliga tidsintervaller, t. ex. var 10: e ms. Tidskonstanten kommer att vara en funktion både k och detta provtagningsintervall.

No comments:

Post a Comment