Thursday 12 October 2017

Moving Genomsnittet Faltning


29 september 2013 Flyttande medelvärde genom convolution Vad rör sig i genomsnitt och vad är det bra för Hur flyttas medelvärdet genom att använda konvoltering Flyttande medelvärde är en enkel operation som vanligtvis används för att undertrycka brus av en signal: vi ställer värdet på varje punkt till genomsnittet av värdena i dess grannskap. Med en formel: Här är x ingången och y är utsignalen, medan storleken på fönstret är w, skulle vara udda. Formeln ovan beskriver en symmetrisk operation: proven tas från båda sidor av den aktuella punkten. Nedan är ett verkligt exempel. Den punkt som fönstret ligger faktiskt är rött. Värden utanför x är tänkt att vara nollor: För att spela runt och se effekterna av glidande medelvärde, ta en titt på denna interaktiva demonstration. Hur man gör det genom konvoltering Som du kanske har insett, räknar man med det enkla glidande medlet liknar konvolutionen: i båda fallen glider ett fönster längs signalen och elementen i fönstret sammanfattas. Så försök att göra samma sak genom att använda convolution. Använd följande parametrar: Den önskade utgången är: Som första tillvägagångssätt, låt oss försöka vad vi får genom att samla x-signalen med följande k-kärna: Utsignalen är exakt tre gånger större än den förväntade. Det kan också ses att utgångsvärdena är sammanfattningen av de tre elementen i fönstret. Det är för att under fönstret glider fönstret, alla element i det multipliceras med en och sedan sammanfattas: yk 1 cdot x 1 cdot x 1 cdot x För att få önskade värden på y. utgången ska delas med 3: Med en formel som inkluderar divisionen: Men skulle det inte vara optimalt att göra uppdelningen under convolution Här kommer tanken genom att omordna ekvationen: Så vi ska använda följande k-kärna: På så sätt kommer vi att få önskad utgång: Generellt: om vi vill göra glidande medelvärde genom convolution som har en fönsterstorlek på w. vi ska använda följande k-kärna: En enkel funktion som gör det rörliga genomsnittet är: Ett exempel är: Flyttande medelvärdet 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-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 nu Använda MATLAB, hur kan jag hitta 3-dagars glidande medelvärde för en specifik kolumn i en matris och lägga till glidande medelvärde i den matrisen Jag försöker att beräkna det 3-dagars glidande medlet från botten till toppen av matrisen. Jag har angivit min kod: Med tanke på följande matris a och mask: Jag har försökt implementera kommandot conv men jag får ett fel. Här är conv kommandot jag har försökt använda på 2: a kolumnen i matris a: Utgången jag önskar ges i följande matris: Om du har några förslag, skulle jag verkligen uppskatta det. Tack För kolumn 2 i matris a, beräknar jag 3-dagars glidande medelvärde enligt följande och placerar resultatet i kolumn 4 i matris a (jag byttes matris a som 39desiredOutput39 bara för illustration). 3-dagarsgenomsnittet 17, 14, 11 är 14 3-dagarsgenomsnittet 14, 11, 8 är 11 3-dagarsgenomsnittet 11, 8, 5 är 8 och 3-dagarsgenomsnittet 8, 5, 2 är 5. Det finns inget värde i botten 2 rader för den 4: e kolumnen eftersom beräkningen för 3-dagars glidande medel börjar längst ner. Den 39valid39-utmatningen visas inte förrän minst 17, 14 och 11. Förhoppningsvis är det här meningsfullt Aaron Jun 12 13 at 1:28 Generellt skulle det hjälpa om du skulle visa felet. I det här fallet gör du två saker fel: Först måste din konvolver delas av tre (eller längden på det glidande medlet) För det andra märker du storleken på c. Du kan inte bara passa c till en. Det typiska sättet att få ett glidande medelvärde skulle vara att använda samma: men det ser inte ut som vad du vill ha. Istället är du tvungen att använda ett par rader: Jag letar efter lite vägledning om att använda CONVN för att beräkna glidande medelvärden i en dimension på en 3d-matris. Jag blir lite gripen på kärnans vändning under huven och hoppas att någon kan klargöra beteendet för mig. En liknande post som fortfarande har mig lite förvirrad är här: Jag har dagliga flod - och väderflödesdata för en vattendrag på olika källor. Så matrisen är som så, dim 1 (raderna) representerar varje plats dim 2 (kolumnerna) representerar datum dim 3 (sidorna) representerar olika typer av mätning (flodhöjd, flöde, nederbörd etc.) Målet är att försöka använda CONVN för att ta ett 21 dagars glidande medelvärde vid varje ställe, för varje observationspunkt för varje variabel. Som jag förstår det, borde jag bara kunna använda en kärna som: Jag försökte leka och skapa en annan kärna som också skulle fungera (tror jag) och ställa in ker2 som: Resultaten matchar inte riktigt och jag undrar om jag har dimensionerna är felaktiga här för kärnan. Någon vägledning är mycket uppskattad. BTW, du har en symmetrisk kärna, och så bläddring ska inte ha någon effekt på konvolutionsutgången. Det du har angett är en standard rörlig medelkärnan, och så skulle konvertering fungera för att hitta det rörliga genomsnittet som du förväntar dig. men jag är lite förvirrad för att du sa det ovanstående fungerar inte ndash rayryeng 31 maj kl 15:17 Det är helt upp till dig :). Frågan du har är en giltig (ingen ordsprog avsedd) som springer upp många människor. Om du vill att den ska stanna kan jag skriva ett svar som sammanfattar vad vi pratat om. Om du vill dra tillbaka ta bort ditt svar är det inget problem alls. Låt mig veta vad du vill göra ndash rayryeng 31 maj 15 kl 20:39 Med utgångspunkt från din fråga har du en 3D-matris och du vill hitta det rörliga genomsnittet för varje rad oberoende över alla 3D-skivor. Koden ovan ska fungera (det första fallet). Den giltiga flaggan returnerar emellertid en matris vars storlek är giltig med avseende på konvolutionens gränser. Ta en titt på den första punkten i det inlägg som du länkade till för mer information. Specifikt saknas de första 21 inmatningarna för varje rad på grund av den giltiga flaggan. Dess enda när du kommer till den 22: e posten i varje rad blir konvolutionskärnan helt inne i en rad av matrisen och dess från den punkten där du får giltiga resultat (ingen ordsprog är avsedd). Om du vill se dessa poster vid gränserna måste du använda samma flagga om du vill behålla samma storlek matris som inmatning eller full flagga (som är standard) som ger dig storleken på utgången från och med de mest extrema ytterkanterna, men tänk på att det glidande medlet kommer att göras med en massa nollor och så de första 21 posterna inte skulle vara vad du förväntar dig ändå. Men om jag tolkar vad du frågar är den giltiga flaggan vad du vill, men kom ihåg att du kommer att ha 21 poster som saknas för att rymma för kantfall. Sammantaget bör din kod fungera, men var försiktig med hur du tolkar resultaten. BTW, du har en symmetrisk kärna, och så bläddring ska inte ha någon effekt på konvolutionsutgången. Det du har angett är en standard rörlig medelkärnan, och så skulle konvertering fungera för att hitta det rörliga genomsnittet som du förväntar dig.

No comments:

Post a Comment