Thursday, 19 October 2017

Viktat glidande medelvärde filter matlab


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 minnesjugglingen Matlab måste göra, för det andra gör det mycket enkelt att placera den genomsnittliga data i en utmatning av samma storlek 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 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 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 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 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å vill du 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. Standardfrekvensen för det rörliga genomsnittet är 5.FIR-filter, IIR-filter och den linjära konstant-koefficientskillnadsekvationen. Causal Moving Average (FIR) - filter. Vi har diskuterat system där varje prov av utmatningen är en viktad summa av (vissa av ) proverna av ingången. Låt oss ta ett kausalt vägt sumssystem, där orsakssamband innebär att ett givet utprov endast beror på det aktuella ingångsprovet och andra ingångar tidigare i sekvensen. Varken linjära system i allmänhet, eller särskilt begränsade impulsresponssystem, måste vara kausal. Kausalitet är dock lämplig för en typ av analys som snart skulle undersökas. Om vi ​​symboliserar ingångarna som värden för en vektor x. och utgångarna som motsvarande värden för en vektor y. då kan ett sådant system skrivas som där b-värdena är quotweightsquot applicerade på nuvarande och tidigare inmatningssampler för att få det aktuella utgångsprovet. Vi kan tänka på uttrycket som en ekvation, med lika teckenbetydande lika, eller som en procedurinstruktion, med jämställdhetsbeteckningen. Låt skriva uttrycket för varje utmatningsprov som en MATLAB-slinga av uppdragsinställningar, där x är en N-längdsvektor av ingångsprover och b är en M-längdvektor av vikter. För att hantera specialfallet i början lägger vi in ​​x i en längre vektor xhat vars första M-1-prov är noll. Vi kommer att skriva den vägda summeringen för varje y (n) som en inre produkt, och kommer att göra några manipuleringar av ingångarna (som omvänd b) för detta ändamål. Denna typ av system kallas ofta ett glidande medelfilter av uppenbara skäl. Från våra tidigare diskussioner bör det vara uppenbart att ett sådant system är linjärt och skift-invariant. Naturligtvis skulle det vara mycket snabbare att använda MATLAB convolution funktionen conv () istället för vår mafilt (). I stället för att överväga de första M-1-proverna från ingången att vara noll, kan vi betrakta dem som de sista M-1-proverna. Detta är detsamma som att behandla inmatningen som periodisk. Använd väl cmafilt () som funktionens namn, en liten ändring av den tidigare mafilt () - funktionen. Vid bestämning av ett systems impulsrespons är det vanligen ingen skillnad mellan dessa två eftersom alla icke-inledande prover av ingången är noll: Eftersom ett system av detta slag är linjärt och inskjutet, vet vi att dess effekt på alla sinusoid kommer bara att skala och flytta den. Här är det viktigt att vi använder den cirkulära versionen Den cirkulärkonvolverade versionen skiftas och skalas lite, medan versionen med vanlig konvolvering snedvrids i början. Låt oss se vad exakt skalering och skiftning är med hjälp av en fft: Både ingång och utgång har endast amplitud vid frekvenserna 1 och -1, vilket är som det borde vara, eftersom ingången var en sinusoid och systemet var linjärt. Utgångsvärdena är större med ett förhållande av 10,62518 1,3281. Detta är förstärkningen av systemet. Vad sägs om fasen Vi behöver bara se var amplitude är noll: Inmatningen har en fas av pi2, som vi begärde. Utgångsfasen skiftas med ytterligare 1,0594 (med motsatt tecken på negativ frekvens), eller cirka 16 av en cykel till höger, som vi kan se på grafen. Nu kan vi prova en sinusoid med samma frekvens (1), men istället för amplitud 1 och fas pi2, kan vi prova amplitud 1,5 och fas 0. Vi vet att endast frekvens 1 och -1 kommer att ha en nollamplitude, så vi kan bara titta på dem: Återigen är amplitudförhållandet (15.937712.0000) 1.3281 - och för fas är det igen skiftat med 1.0594 Om dessa exempel är typiska kan vi förutsäga effekten av vårt system (impulsrespons .1 .2 .3 .4 .5) på någon sinusoid med frekvens 1 - amplituden ökas med en faktor 1,3281 och den (positiva frekvensen) fas kommer att flyttas med 1,0594. Vi kunde fortsätta att beräkna effekten av detta system på sinusoider av andra frekvenser med samma metoder. Men det finns ett mycket enklare sätt, och en som fastställer den allmänna punkten. Eftersom (cirkulär) konvolvering i tidsdomänen betyder multiplikation i frekvensdomänen följer det att med andra ord är DFT för impulssvaret förhållandet mellan utmatningens DFT och DFT på ingången. I detta förhållande är DFT-koefficienterna komplexa tal. Eftersom abs (c1c2) abs (c1) abs (c2) för alla komplexa tal c1, c2, berättar denna ekvation oss att impulsresponsens amplitudspektrum alltid är förhållandet mellan utgångens amplitudspektrum och ingångens . När det gäller fasspektret, vinkel (c1c2) vinkel (c1) - vinkel (c2) för alla c1, c2 (med förbehåll att faserna skiljer sig med n2pi anses lika). Därför är fasspektrumet för impulssvaret alltid skillnaden mellan fasspektra av utgången och ingången (med vilka korrigeringar 2pi behövs för att hålla resultatet mellan - pi och pi). Vi kan se faseffekterna tydligare om vi avvecklar representationen av fas, dvs om vi lägger till flera multiplar av 2pi efter behov för att minimera de hopp som produceras av den periodiska karaktären av vinkeln () - funktionen. Även om amplituden och fasen vanligtvis används för grafisk och jämn tabulär presentation, eftersom de är ett intuitivt sätt att tänka på effekterna av ett system på de olika frekvenskomponenterna för dess ingång, är de komplexa Fourier-koefficienterna mer användbara algebraiskt, eftersom de tillåter det enkla uttrycket för förhållandet Det allmänna tillvägagångssättet vi just har sett kommer att fungera med godtyckliga filter av den skissade typen, där varje utmatningsprov är en viktad summa av en uppsättning ingångsprover. Som nämnts tidigare kallas dessa ofta Finite Impulse Response-filter, eftersom impulsresponsen är av ändlig storlek, eller ibland Flytta genomsnittliga filter. Vi kan bestämma frekvensresponsegenskaperna hos ett sådant filter från FFT av dess impulsrespons, och vi kan även designa nya filter med önskade egenskaper av IFFT från en specifikation av frekvensresponsen. Autoregressiva (IIR) - filter Det skulle vara litet att ha namn på FIR-filter om det inte fanns några andra slags att skilja dem från, och så de som har studerat pragmatik kommer inte att förvåna sig för att lära sig att det verkligen finns ett annat stort slag av linjärt tidsinvariant filter. Dessa filter kallas ibland rekursiva eftersom värdet av tidigare utdata (såväl som tidigare ingångar) betyder att även om algoritmerna generellt skrivs med iterativa konstruktioner. De kallas också Infinite Impulse Response (IIR) - filter, eftersom deras svar på impulser i allmänhet fortsätter för alltid. De kallas ibland även autogegressiva filter, eftersom koefficienterna kan anses som resultat av att linjär regression gör att signalvärdena uttrycks som en funktion av tidigare signalvärden. Förhållandet mellan FIR - och IIR-filter kan tydligt ses i en linjär konstant-koefficientskillnadsekvation, dvs att ange en viktad summa av utgångar som är lika med en viktad summa av ingångar. Detta är som ekvationen som vi gav tidigare för orsakssystemet FIR-filter, förutom att förutom den viktade summan av ingångar, har vi också en viktad summa av utgångar. Om vi ​​vill tänka på detta som ett förfarande för att generera produktionsprover måste vi omordna ekvationen för att få ett uttryck för det aktuella utgångsprovet y (n), Adoptera konventionen att a (1) 1 (t. ex. genom att skala andra som och bs) kan vi bli av med 1a (1) termen: y (n) b (1) x (n) b (2) x (n-1). b (Nb1) x (n-nb) - a (2) y (n-1) -. - a (Na1) y (n-na) Om allt a (n) annat än a (1) är noll, minskar detta till vår gamla vän det kausal FIR-filtret. Detta är det allmänna fallet med ett (kausal) LTI-filter, och implementeras av MATLAB-funktionsfiltret. Låt oss se på fallet där b-koefficienterna utom b (1) är noll (i stället för FIR-fallet, där a (n) är noll): I det här fallet beräknas det aktuella utgångsprovet y (n) som en viktad kombination av det aktuella ingångsprovet x (n) och de tidigare utgångsproverna y (n-1), y (n-2) osv. För att få en uppfattning om vad som händer med sådana filter kan vi börja med fallet där Det vill säga det aktuella utgångsprovet är summan av det aktuella ingångsprovet och hälften av det föregående utgångsprovet. Tja, ta en insatsimpuls genom några steg, en åt gången. Det borde vara tydligt vid denna punkt att vi enkelt kan skriva ett uttryck för det nth utmatningsprovvärdet: det är bara (Om MATLAB räknas från 0, skulle detta helt enkelt vara .5n). Eftersom det vi beräknar är systemets impulsrespons, har vi visat genom exempel att impulsresponset faktiskt kan få oändligt många icke-nollprover. För att implementera detta triviella första ordningens filter i MATLAB kunde vi använda filter. Samtalet kommer att se ut så här: och resultatet är: Är denna verksamhet verkligen fortfarande linjär? Vi kan titta empiriskt på det här: För en mer allmän inställning, överväga värdet av ett utmatningsprov y (n). Genom successiv substitution kan vi skriva detta eftersom det här är precis som vår gamla vän, FU-filtrets sammanfogningssumma, med impulssvaret från uttrycket .5k. och längden på impulssvaret är oändligt. De samma argumenten som vi brukade visa att FIR-filter var linjära kommer nu att tillämpas här. Hittills kan det verka som mycket väsen om inte mycket. Vad är den här hela undersökningsgruppen bra för Tja, svara på den här frågan i steg, med ett exempel. Det är inte en stor överraskning att vi kan beräkna en samplad exponentiell genom rekursiv multiplikation. Låt oss titta på ett rekursivt filter som gör något mindre uppenbart. Den här gången gör det väl ett andraordningsfilter, så att samtalet till filtret kommer att vara av formen. Låt oss ange den andra utmatningskoefficienten a2 till -2cos (2pi40) och den tredje utgångskoefficienten a3 till 1 och titta på impulsen svar. Inte särskilt användbar som ett filter, men det genererar en samplad sinusvåg (från en impuls) med tre multiplikat-adder per prov För att förstå hur och varför det gör det och hur rekursiva filter kan utformas och analyseras i Det mer generella fallet måste vi gå tillbaka och ta en titt på några andra egenskaper av komplexa tal, på vägen till förståelsen av z-transformen. Följande är ett hårdkodat 3-punktsviktssymmetriskt glidande medelfilter: Så mina antaganden för hur ett n-punktsviktssymmetriskt glidande medelfilter skulle fungera är följande: Mitt slutmål är att skapa ett viktat symmetriskt glidande medelfilter som har ett modulärt antal punkter över vilka det kan vara genomsnittligt. Den del som verkligen får mig är vikten själv, och medan jag är säker på att en nestad slinga av något slag skulle göra tricket, kan jag inte se hur jag ens skulle börja något sådant. Tack för att du har tagit dig tid att besöka min fråga, vilken feedback som helst skulle uppskattas. Välj ditt land

No comments:

Post a Comment