Skapad onsdagen den 08 oktober 2008 20:04 Senast uppdaterad den 14 mars 2013 01:29 Skriven av Batuhan Osmanoglu Hits: 41506 Flyttande medelvärde I Matlab Ofta befinner jag mig själv i att behöva medelvärda data som jag måste minska bullret lite bit. Jag skrev några funktioner för att göra exakt vad jag vill, men matlabs inbyggda filterfunktion fungerar ganska bra också. Här skriver jag om 1D och 2D-medelvärde för data. 1D-filter kan realiseras med hjälp av filterfunktionen. Filterfunktionen kräver minst tre ingångsparametrar: täljarkoefficienten för filtret (b), nämnarkoefficienten för filtret (a) och data (X) förstås. Ett löpande medelfilter kan enkelt definieras av: För 2D-data kan vi använda Matlabs filter2-funktionen. För mer information om hur filtret fungerar kan du skriva: Här är en snabb och smutsig implementering av ett 16 med 16 glidande medelfilter. Först måste vi definiera filtret. Eftersom allt vi vill ha är lika stort bidrag från alla grannar kan vi bara använda de funktionerna. Vi dela allt med 256 (1616) eftersom vi inte vill ändra signalens generella nivå (amplitud). För att applicera filtret kan vi helt enkelt säga följande Nedan visas resultaten för fas av ett SAR-interferogram. I detta fall är området i Y-axeln och Azimuth är mappad på X-axeln. Filtret var 4 pixlar brett i Räckvidd och 16 pixlar bred i Azimuth. Jag har en vektor och jag vill beräkna det rörliga genomsnittet av det (med ett fönster med bredd 5). Om exempelvis vektorn är 1,2,3,4,5,6,7,8. Då bör den första inmatningen av den resulterande vektorn vara summan av alla poster i 1,2,3,4,5 (dvs 15) den andra ingången av den resulterande vektorn bör vara summan av alla poster i 2,3,4, 5,6 (dvs 20) etc. I slutändan skulle den resulterande vektorn vara 15,20,25,30. Hur kan jag göra det? Kollfunktionen är rätt upp i din gränd: Tre svar, tre olika metoder. Här är ett snabbt referensvärde (olika inmatningsstorlekar, fast fönsterbredd på 5) med hjälp av timeit känn hål i det (i kommentarerna) om du tycker att det behöver raffineras. Conv fram som den snabbaste tillvägagångssättet är det ungefär dubbelt så snabbt som myntet närmar sig (med hjälp av filter). och ungefär fyra gånger så fort som Luis Mendos tillvägagångssätt (med hjälp av cumsum). Här är en annan riktmärke (fast inmatningsstorlek 1e4. Olika fönsterbredder). Här framträder Luis Mendos cumsum-tillvägagångssätt som den tydliga vinnaren, för dess komplexitet styrs i första hand av längden på ingången och är okänslig för fönstrets bredd. Slutsats Sammanfattningsvis borde du använda conv-inställningen om ditt fönster är relativt litet, använd cumsum-tillvägagångssättet om ditt fönster är relativt stort. Kod (för riktmärken) Jag måste beräkna ett glidande medelvärde över en dataserie, inom en för loop. Jag måste få det glidande genomsnittet över N9 dagar. Array Im computing in är 4 serier av 365 värden (M), som i sig är medelvärden för en annan uppsättning data. Jag vill räkna ut medelvärdena för mina data med glidande medelvärde i en plot. Jag googled lite om glidande medelvärden och conv kommandot och hittade något som jag försökte implementera i min kod .: Så i princip beräknar jag mitt medelvärde och plottar det med ett (fel) glidande medelvärde. Jag valde wts-värdet direkt utanför mathworks webbplats, så det är felaktigt. (källa: mathworks. nlhelpeconmoving-average-trend-estimation. html) Mitt problem är dock att jag inte förstår vad det här är. Kan någon förklara om det har något att göra med värdena på värdena: det är ogiltigt i det här fallet. Alla värden är viktade samma. Och om jag gör det här helt fel, kan jag få lite hjälp med det mitt uppriktiga tack. frågade 23 sep 14 kl 19:05 Använda conv är ett utmärkt sätt att genomföra ett glidande medelvärde. I koden du använder är wts hur mycket du väger varje värde (som du gissade). Summan av den vektorn ska alltid vara lika med en. Om du vill vikta varje värde jämnt och göra ett N-rörligt filter så skulle du vilja göra Att använda det giltiga argumentet i conv resulterar i att få färre värden i Ms än du har i M. Använd samma om du inte har något emot effekterna av noll padding. Om du har signalbehandlingsverktygslådan kan du använda cconv om du vill prova ett cirkulärt glidande medelvärde. Något som du borde läsa conv and cconv dokumentationen för mer information om du inte redan har. Du kan använda filter för att hitta ett löpande medelvärde utan att använda en för loop. I det här exemplet hittar du löpande medelvärdet för en vektor med 16 element, med en fönsterstorlek på 5. 2) Slät som en del av kurvanpassningsverktygslådan (som är tillgänglig i de flesta fall) yy släpper (y) data i kolumnvektorn y med ett glidande medelfilter. Resultat returneras i kolumnvektorn yy. Standard spänningen för glidande medelvärde är 5.Moving Average Filter (MA filter) Laddar. Det rörliga genomsnittliga filtret är ett enkelt filter med lågt pass FIR (Finite Impulse Response) som vanligtvis används för att utjämna en rad samplade datasignaler. Det tar M prover av ingång i taget och tar medeltalet av de M-proverna och producerar en enda utgångspunkt. Det är en väldigt enkel LPF-struktur (Low Pass Filter) som är användbar för forskare och ingenjörer för att filtrera oönskade bullriga komponenter från de avsedda data. När filterlängden ökar (parametern M) ökar utjämnets jämnhet, medan de skarpa övergångarna i data görs alltmer stumma. Detta innebär att detta filter har utmärkt tidsdomänsvar men ett dåligt frekvenssvar. MA-filtret utför tre viktiga funktioner: 1) Det tar M-ingångspunkter, beräknar medelvärdet av de M-punkterna och producerar en enda utgångspunkt 2) På grund av beräknade beräkningskalkyler. Filtret introducerar en bestämd mängd fördröjning 3) Filtret fungerar som ett lågpassfilter (med dåligt frekvensdomänsvar och ett bra domänsvar). Matlab-kod: Efter matlab-kod simuleras tidsdomänsvaret för ett M-punkts rörande medelfilter och avbildar även frekvensresponsen för olika filterlängder. Tid Domain Response: På den första tomten har vi inmatningen som går in i det glidande medelfiltret. Inmatningen är bullriga och vårt mål är att minska bruset. Nästa figur är utgångsvaret för ett 3-punkts rörande medelfilter. Det kan härledas från figuren att 3-punkts rörande medelfilter inte har gjort mycket för att filtrera ut bruset. Vi ökar filterkranarna till 51 punkter och vi kan se att bruset i utmatningen har minskat mycket, vilket avbildas i nästa bild. Vi ökar kranarna vidare till 101 och 501 och vi kan observera att även om bullret är nästan noll övergår övergångarna drastiskt (observera lutningen på vardera sidan av signalen och jämföra dem med den ideala tegelväggsövergången i vår ingång). Frekvensrespons: Från frekvenssvaret kan man hävda att avrullningen är väldigt långsam och stoppbandets dämpning inte är bra. Med tanke på detta stoppbanddämpning kan det glidande medelfiltret helt klart inte separera ett frekvensband från en annan. Som vi vet att en bra prestanda i tidsdomänen leder till dålig prestanda i frekvensdomänen och vice versa. Kort sagt är det rörliga genomsnittet ett exceptionellt bra utjämningsfilter (åtgärden i tidsdomänen), men ett exceptionellt dåligt lågpassfilter (åtgärden i frekvensdomänen) Externa länkar: Rekommenderade böcker: Primär sidofält
Comments
Post a Comment