Wednesday, 16 August 2017

Glidande Medelvärde Filter Code Matlab


Skapat onsdagen den 08 oktober 2008 20:04 Senast uppdaterad den 14 mars 2013 01:29 Skriven av Batuhan Osmanoglu Hits: 41498 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. Ladda ner movAv. m (se även movAv2 - en uppdaterad version som tillåter viktning) Beskrivning Matlab innehåller funktioner som kallas movavg och tsmovavg (tidsserie glidande medelvärde) i Financial Toolbox, movAv är utformad för att replikera den grundläggande funktionaliteten hos dessa. Koden här ger ett bra exempel på hantering av index inom slingor, vilket kan vara förvirrande till att börja med. Ive hålls medvetet koden kort och enkel att hålla processen klar. movAv utför ett enkelt glidande medelvärde som kan användas för att återställa bullriga data i vissa situationer. Det fungerar genom att ta en medelvärde av ingången (y) över ett glidande tidfönster, vars storlek anges av n. Ju större n är, desto större blir utjämningen av effekten av n i förhållande till längden på ingångsvektorn y. Och effektivt (bra slags) skapar ett lågpassfrekvensfilter - se avsnittet exempel och överväganden. Eftersom mängden utjämning som tillhandahålls av varje värde av n är relativt längden på ingångsvektorn, är det alltid värt att testa olika värden för att se vad som är lämpligt. Kom också ihåg att n poäng går förlorade vid varje genomsnitt om n är 100, innehåller de första 99 punkterna i ingångsvektorn inte tillräckligt med data för ett 100pt-medelvärde. Detta kan undvikas något genom att stapla medelvärden, till exempel koden och grafen nedan jämför ett antal olika längdfönstermedelvärden. Lägg märke till hur jämn 1010pt jämförs med ett enda 20pt-medelvärde. I båda fallen förloras totalt 20 data. Skapa xaxis x1: 0.01: 5 Generera ljudstråleReps 4 brusrepmat (randn (1, ceil (numel (x) noiseReps)), noiseReps, 1) brusreform (brus, 1, längd (brus) noiseReps) Generera ydata noise yexp X) 10noise (1: längd (x)) Per genomsnittvärden: y2 movAv (y, 10) 10 pt y3 movAv (y2, 10) 1010 pt y4 movAv (y, 20) 20 pt y5 movAv (y, 40) 40 pt Y6 movAv (y, 100) 100 pt Plottbildsplot (x, y, y2, y3, y4, y5, y6) legend (Rådata, 10pt glidande medelvärde, 1010pt, 20pt, 40pt, 100pt) xlabel (x) ylabel y) titel (Jämförelse av glidande medelvärden) movAv. m-kod genomgångsfunktion output movAv (y, n) Den första raden definierar funktionsnamn, ingångar och utgångar. Inmatningen x borde vara en vektor av data för att utföra medelvärdet, n skulle vara antalet punkter för att utföra medelvärdet över utgången kommer att innehålla den genomsnittliga data som returneras av funktionen. Fördela utgångsutgångNaN (1, numel (y)) Hitta mittpunkten i n midPoint-runda (n2) Funktionens huvuduppgift görs i loopbandet, men innan man börjar startas två saker. För det första fördelas utdelningen som NaNs, detta tjänade två syften. För det första är förallokering i allmänhet god praxis eftersom det minskar minnes jonglering Matlab måste göra, för det andra gör det mycket enkelt att placera den genomsnittliga data i en utmatning som är lika stor som ingångsvektorn. Detta betyder att samma xaxis kan användas senare för båda, vilket är lämpligt för plottning, alternativt kan NaN: erna tas bort senare i en kodlinje (utgångsutgången (Den variabla midPoint kommer att användas för att rikta in data i utmatningsvektorn. n 10, 10 poäng kommer att gå vilse eftersom för de första 9 punkterna av ingångsvektorn finns det inte tillräckligt med data för att ta 10 poäng. Eftersom utmatningen kommer att vara kortare än ingången måste den justeras korrekt. Användas så att en lika stor mängd data går förlorad vid början och slutet, och ingången hålls inriktad med utgången av NaN-buffertarna som skapas vid preallokering av utgången. För en 1: längd (y) - n Hitta indexintervall för att ta medeltal Över (a: b) förbud Beräkna medelvärde (amidpunkt) medelvärde (y (a: b)) slutet I själva loopbandet tas ett medel över varje på varandra följande segment av ingången. Slingan körs för a. definierad som 1 upp till längden på ingången (y), minus data som kommer att gå vilse (n). Om ingången är 100 poäng lo ng och n är 10, kommer slingan att springa från (a) 1 till 90. Detta betyder att det första segmentets index blir genomsnittligt. Det andra indexet (b) är helt enkelt an-1. Så vid första iterationen, a1. N10. så b 11-1 10. Det första genomsnittet tas över y (a: b). Eller x (1:10). Medelvärdet av det här segmentet, som är ett enda värde, lagras i utgången på index amidPoint. Eller 156. Vid den andra iterationen, a2. B 210-1 11. så medelvärdet tas över x (2:11) och lagras i utgången (7). Vid den sista iterationen av slingan för en ingång av längd 100, a91. B 9010-1 100 så medelvärdet tas över x (91: 100) och lagras i utgången (95). Detta lämnar utdata med totalt n (10) NaN-värden vid index (1: 5) och (96: 100). Exempel och överväganden Flytta medelvärden är användbara i vissa situationer, men de är inte alltid det bästa valet. Här är två exempel där de inte nödvändigtvis är optimala. Mikrofonkalibrering Denna uppsättning data representerar nivåerna för varje frekvens som produceras av en högtalare och spelas in av en mikrofon med känt linjärt svar. Högtalarens utgång varierar med frekvens, men vi kan korrigera för denna variation med kalibreringsdata - utgången kan justeras på nivå för att beräkna fluktuationerna i kalibreringen. Observera att rådata är bullriga - det betyder att en liten förändring i frekvens tycks kräva en stor, oregelbunden nivåförändring för att redovisa. Är detta realistiskt eller är det här en produkt av inspelningsmiljön. Det är rimligt att i detta fall tillämpa ett glidande medelvärde som släpper ut nivåfrekvenskurvan för att ge en kalibreringskurva som är något mindre ojämn. Men varför är det inte optimalt i det här exemplet? Mer data skulle vara bättre - flera kalibreringar körs i genomsnitt tillsammans skulle förstöra bruset i systemet (så länge det är slumpmässigt) och ge en kurva med mindre subtila detaljer som är förlorade. Det rörliga genomsnittet kan bara approximera detta och kan ta bort några högre frekvensdips och toppar från den kurva som verkligen existerar. Sinvågor Med ett rörligt medelvärde på sinusvågor framhävs två punkter: Den allmänna frågan om att välja ett rimligt antal poäng för att utföra medelvärdet över. Det är enkelt, men det finns mer effektiva metoder för signalanalys än genomsnittliga oscillerande signaler i tidsdomänen. I denna graf kartläggs den ursprungliga sinusvågen i blått. Buller läggs till och ritas som apelsinskurvan. Ett glidande medel utförs vid olika antal punkter för att se om den ursprungliga vågen kan återvinnas. 5 och 10 poäng ger rimliga resultat, men tar inte bort ljudet helt, där så större antal punkter börjar förlora amplituddetalj som medeltalet sträcker sig över olika faser (kom ihåg att vågoscillerar runt noll och medelvärdet (-1 1) 0) . Ett alternativt tillvägagångssätt skulle vara att konstruera ett lågpassfilter än vad som kan appliceras på signalen i frekvensdomänen. Jag tänker inte gå in i detalj eftersom det går utöver omfattningen av den här artikeln, men eftersom bruset är betydligt högre frekvens än vågens grundläggande frekvens, skulle det vara ganska lätt att i detta fall konstruera ett lågpassfilter än att avlägsna högfrekvensen Buller. Jag behöver 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

No comments:

Post a Comment