Friday, 10 November 2017

Glidande medelvärde filter matlab funktionen


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 för 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 tidsfö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 brusbrusReps 4 ljud repmat (randn (1, ceil (numel (x) noiseReps)), noiseReps, 1) brusreformer (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 rörliga 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 med data för att utföra medelvärdet, n skulle vara antalet punkter som ska utföra det genomsnittliga överutmatningen 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 utgång som är lika stor som ingångsvektorn. Det 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 rad kod (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 start och slut, 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 de 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 för 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ängden 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 inspelad 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 de råa data är bullriga - det betyder att en liten förändring i frekvens tycks kräva en stor, ojämn, förändring i nivå för att redogöra för. Är detta realistiskt eller är detta 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 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 hjälp av 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 ta inte bort bullret 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 denna artikel, 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 noise. Created onsdag 08 oktober 2008 20:04 Senast uppdaterad den 14 mars 2013 01:29 Skriven av Batuhan Osmanoglu Hits: 41486 Flyttande medelvärde I Matlab Ofta befinner jag mig själv att behöva medelvärda data som jag måste minska bullret lite grann. 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 definieras enkelt genom: 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 dem. 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 är 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 vid Azimuth. Jag försöker slutföra ett matlab-uppdragsprojekt med följande fråga: Skriv en funktion som heter movingaverage som tar en skalär som heter x som ett inmatningsargument och returnerar en skalär. Funktionen använder en buffert för att hålla tidigare ingångar, och bufferten kan hålla högst 25 ingångar. Specifikt måste funktionen spara de senaste 25 ingångarna i en vektor (bufferten). Varje gång funktionen kallas kopierar den inmatningsargumentet till ett element i bufferten. Om det redan finns 25 ingångar lagrade i bufferten, kasserar den det äldsta elementet och sparar den nuvarande i bufferten. När den har lagrat inmatningen i bufferten returnerar den medelvärdet av alla element i bufferten. Lösningen jag tillhandahåller är följande: Enligt auto grader fungerar min funktion korrekt när värdena 1-50 passerar i följd men misslyckas när värdena på en högljudd sinusvåg passerar i följd (vilket jag har blivit informerad om som kan bero på vissa slags avrundningsfel). Jag skulle vara tacksam om någon av er kunde ge mig några tips om eventuella felsteg i min kod (bifogad ovan). Tack på förhand. Flytta genomsnittsfunktionen resultmovingmean (data, fönster, dim, alternativ) beräknar ett centrerat glidande medelvärde av datamatrisdata med en fönsterstorlek som anges i fönstret i dim dimension med hjälp av den algoritm som anges i alternativet. Dim och alternativ är valfria ingångar och kommer som standard till 1. Dim och alternativ valfria ingångar kan hoppas över helt eller kan ersättas med a. Till exempel kommer flyttade (data, fönster) att ge samma resultat som movingmean (data, fönster, 1,1) eller movingmean (data, fönster ,, 1). Inmatningsmatrisens storlek och dimension begränsas endast av den maximala matrisstorleken för din plattform. Fönstret måste vara ett heltal och ska vara udda. Om fönstret är jämnt, rundas det ner till nästa nedre udda nummer. Funktionen beräknar det glidande medlet som innehåller en mittpunkt och (fönster-1) 2 element före och efter i den angivna dimensionen. Vid kanterna av matrisen reduceras antalet element före eller efter så att den faktiska fönstret är mindre än det angivna fönstret. Funktionen är uppdelad i två delar, en 1d-2d-algoritm och en 3d-algoritm. Detta gjordes för att optimera lösningshastigheten, speciellt i mindre matriser (dvs 1000 x 1). Vidare tillhandahålls flera olika algoritmer till 1d-2d - och 3d-problemet som i vissa fall är standardalgoritmen inte den snabbaste. Detta sker vanligtvis när matrisen är väldigt bred (dvs 100 x 100000 eller 10 x 1000 x 1000) och det glidande medlet beräknas i kortare dimension. Den storlek där standardalgoritmen är långsammare beror på datorn. MATLAB 7.8 (R2009a) Taggar för den här filen Vänligen logga in för att tagga filer. Vänligen logga in för att lägga till en kommentar eller ett betyg. Kommentarer och betyg (8) Funktionen handlar om slutar genom att klippa fönstrets bakre eller ledande del och övergå till ett ledande eller efterföljande glidande medel istället för en centrerad. För att gå med exemplet som du gav i din kommentar om fönstergränsen är 3, då i mitten av 1, är medeldata data från punkterna 1 och 2 i mitten av 2 poäng 1, 2 och 3 i genomsnitt i mitten av 9 punkterna 8, 9 och 10 är i medelvärdet och i ett center av 10 (låt oss antar att vektorn har 10 poster) poäng 9 och 10 är medeltal. Hur handlar det om att hantera ändarna Börjar det med en fönsterstorlek som endast omfattar punkt 1 vid 1, sedan 3 poäng vid punkt 2, och ökar sedan i fönsterstorlek tills fönsterstorleken är den som anges i funktionstangenten Tack. Trevligt och enkelt. Tack. Bra jobb Mycket användbart som Stephan Wolf sa. Precis vad jag letade efter. Centrerat glidande medelvärde som kan arbeta i en plot över hela bredden utan att behöva leta efter filterets storlek och flytta början. Stora Accelererande taktiken för teknik och vetenskap MathWorks är den ledande utvecklaren av matematisk datorsystem för ingenjörer och forskare.

No comments:

Post a Comment