Veid Bevegelig Gjennomsnitt Filter Matlab


Last ned movAv. m (se også movAv2 - en oppdatert versjon som tillater vekting) Beskrivelse Matlab inkluderer funksjoner som kalles movavg og tsmovavg (tidsserier som beveger seg i gjennomsnitt) i Financial Toolbox, movAv er utformet for å gjenskape grunnleggende funksjonaliteten til disse. Koden her gir et godt eksempel på å administrere indekser i looper, som kan være forvirrende til å begynne med. Jeg har bevisst holdt koden kort og enkel å holde denne prosessen klar. movAv utfører et enkelt glidende gjennomsnitt som kan brukes til å gjenopprette støyende data i noen situasjoner. Det fungerer ved å ta et middel av inngangen (y) over et glidende tidvindu, hvis størrelse er spesifisert av n. Jo større n er, desto større er utjevningen av effekten av n i forhold til lengden på inngangsvektoren y. og effektivt (vel slags) skaper et lavpassfrekvensfilter - se avsnittet om eksempler og overveier. Fordi mengden av utjevning som tilbys av hver verdi av n er i forhold til lengden på inngangsvektoren, er den alltid verdt å teste forskjellige verdier for å se hva som passer. Husk også at n poeng går tapt på hvert gjennomsnitt hvis n er 100, inneholder de første 99 punktene i inngangsvektoren ikke nok data for et gjennomsnitt på 100pt. Dette kan unngås noe ved å stable gjennomsnitt, for eksempel, koden og grafen nedenfor, sammenligner en rekke vinduer med gjennomsnittlig lengde. Legg merke til hvor glatt 1010pt er sammenlignet med et enkelt 20pt gjennomsnitt. I begge tilfeller går 20 poeng i tap totalt. Opprett xaxis x1: 0.01: 5 Generer støystøyReps 4 støy repmat (randn (1, ceil (numel (x) noiseReps)), noiseReps, 1) støy reshape (støy, 1, lengde (støy) noiseReps) Generer ydata støy yexp x) 10noise (1: lengde (x)) Gjennomsnittlig gjennomsnitt: 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 Plot-figurplot (x, y, y2, y3, y4, y5, y6) legenden (Rå data, 10pt glidende gjennomsnitt, 1010pt, 20pt, 40pt, 100pt) xlabel (x) ylabel y) tittel (Sammenligning av bevegelige gjennomsnittsverdier) movAv. m-kode gjennomgående funksjonsutgang movAv (y, n) Den første linjen definerer funksjonsnavn, innganger og utganger. Inngangen x skal være en vektor med data for å utføre gjennomsnittet, n skal være antall poeng som skal utføre gjennomsnittet over utgang vil inneholde gjennomsnittlig data returnert av funksjonen. Preallocate output outputNaN (1, numel (y)) Finn midtpunkt for n midPoint runde (n2) Hovedarbeidet av funksjonen er gjort i forløp, men før du starter, blir to ting forberedt. For det første er produksjonen forhåndsallokert som NaNs, dette tjente to formål. For det første er forallokering generelt god praksis, da det reduserer minnesjonglingen Matlab må gjøre, for det andre gjør det veldig enkelt å sette de gjennomsnittlige dataene i en utgang i samme størrelse som inngangsvektoren. Dette betyr at den samme xaxis kan brukes senere for begge, noe som er praktisk for plotting, alternativt kan NaNs fjernes senere i en linje med kode (utdatautgang (Den variable midpoint vil bli brukt til å justere dataene i utgangsvektoren. n 10, vil 10 poeng gå tapt fordi for de første 9 poengene til inngangsvektoren er det ikke nok data til å ta et 10-punkts gjennomsnitt. Da utgangen vil bli kortere enn inngangen, må den justeres riktig. bli brukt, slik at en lik mengde data går tapt ved start og slutt, og inngangen holdes justert med utgangen av NaN buffere opprettet ved preallokering av utgang. For en 1: lengde (y) - n Finn indeksområdet for å ta gjennomsnitt over (a: b) forbud Beregn gjennomsnittlig utgang (amidPoint) gjennomsnittlig (y (a: b)) ende I selve forløpet er et gjennomsnitt tatt over hvert påfølgende segment av inngangen. Sløyfen løper for a. definert som 1 opp til lengden på inngangen (y), minus dataene som vil gå tapt (n). Hvis inngangen er 100 poeng lo ng og n er 10, vil løkken løpe fra (a) 1 til 90. Dette betyr at den første indeksen til segmentet blir gjennomsnittlig. Den andre indeksen (b) er ganske enkelt an-1. Så på den første iterasjonen, a1. n10. så b 11-1 10. Det første gjennomsnittet er tatt over y (a: b). eller x (1:10). Gjennomsnittet for dette segmentet, som er en enkelt verdi, lagres i produksjonen på indeksen amidPoint. eller 156. På den andre iterasjonen, a2. b 210-1 11. så er gjennomsnittet tatt over x (2:11) og lagret i utgang (7). På den siste iterasjonen av løkken for en inngang på lengde 100, a91. b 9010-1 100, slik at gjennomsnittet blir tatt over x (91: 100) og lagret i utgang (95). Dette etterlater produksjonen med totalt n (10) NaN-verdier ved indeks (1: 5) og (96: 100). Eksempler og overveier Flytte gjennomsnitt er nyttige i noen situasjoner, men de er ikke alltid det beste valget. Her er to eksempler hvor de ikke nødvendigvis er optimale. Mikrofonkalibrering Dette datasettet representerer nivåene av hver frekvens produsert av en høyttaler og registrert av en mikrofon med en kjent lineær respons. Høyttalerenes utgang varierer med frekvens, men vi kan korrigere for denne variasjonen med kalibreringsdataene. Utgangen kan justeres på nivå for å ta hensyn til svingningene i kalibreringen. Legg merke til at rådataene er støyende - det betyr at en liten endring i frekvens ser ut til å kreve en stor, uregelmessig, endring i nivå for å ta hensyn til. Er dette realistisk eller er dette et produkt av opptaksmiljøet. Det er i dette tilfellet rimelig å bruke et glidende gjennomsnitt som jevner ut nivåfrekvenskurven for å gi en kalibreringskurve som er litt mindre uregelmessig. Men hvorfor er dette ikke det beste i dette eksemplet Flere data ville være bedre - flere kalibreringer kjører i gjennomsnitt sammen vil ødelegge støyen i systemet (så lenge det er tilfeldig) og gi en kurve med mindre subtile detaljer tapt. Det bevegelige gjennomsnittet kan kun omtrentliggjøre dette, og kan fjerne noen høyere frekvensdips og topper fra kurven som virkelig eksisterer. Sinbølger Ved å bruke et glidende gjennomsnitt på sinusbølger fremheves to poeng: Det generelle spørsmålet om å velge et rimelig antall poeng for å utføre gjennomsnittet over. Det er enkelt, men det er mer effektive metoder for signalanalyse enn gjennomsnittlig oscillerende signaler i tidsdomene. I denne grafen er den opprinnelige sinusbølgen plottet i blått. Støy er lagt til og tegnet som oransje kurven. Et glidende gjennomsnitt utføres på forskjellige antall punkter for å se om den opprinnelige bølgen kan gjenvinnes. 5 og 10 poeng gir rimelige resultater, men fjerner ikke støyen helt, hvor like større antall poeng begynner å miste amplitudedetalj som gjennomsnittet strekker seg over forskjellige faser (husk at bølgen oscillerer rundt null og mener (-1 1) 0) . En alternativ tilnærming ville være å konstruere et lavpassfilter enn det som kan påføres signalet i frekvensdomenet. Jeg kommer ikke til å gå i detalj som det går ut over omfanget av denne artikkelen, men da støyen er betydelig høyere frekvens enn bølgenees grunnfrekvens, ville det være ganske enkelt i dette tilfellet å konstruere et lavpassfilter enn å fjerne høyfrekvensen noise. I trenger å beregne et bevegelige gjennomsnitt over en dataserie, innenfor en for loop. Jeg må få glidende gjennomsnitt over N9 dager. Array Im computing in er 4 serier av 365 verdier (M), som i seg selv er gjennomsnittsverdier for et annet sett med data. Jeg vil plotte gjennomsnittverdiene av dataene mine med det bevegelige gjennomsnittet i en tomt. Jeg googled litt om å flytte gjennomsnitt og conv kommandoen og fant noe som jeg prøvde å implementere i min kode .: Så i utgangspunktet beregner jeg mitt gjennomsnitt og plotter det med et (feil) glidende gjennomsnitt. Jeg plukket wts verdien rett utenfor mathworks nettstedet, så det er feil. (kilde: mathworks. nlhelpeconmoving-average-trend-estimation. html) Mitt problem er imidlertid at jeg ikke forstår hva dette wts er. Kan noen forklare om det har noe å gjøre med verdiene i vektene: det er ugyldig i dette tilfellet. Alle verdier er vektet det samme. Og hvis jeg gjør dette helt feil, kan jeg få litt hjelp med det Min oppriktige takk. spurte 23 september klokken 19:05 Bruk av conv er en utmerket måte å implementere et bevegelig gjennomsnitt på. I koden du bruker, er wts hvor mye du veier hver verdi (som du gjettet). summen av den vektoren skal alltid være lik en. Hvis du vil vektere hver verdi jevnt og gjøre et N-bevegelig filter, så vil du gjøre det. Ved å bruke det gyldige argumentet i conv, vil det føre til at du har færre verdier i Ms enn du har i M. Bruk det samme hvis du ikke har noe imot effekten av null polstring. Hvis du har signalbehandlingsverktøyskassen, kan du bruke cconv hvis du vil prøve et sirkulært glidende gjennomsnitt. Noe som Du burde lese conv and cconv dokumentasjonen for mer informasjon hvis du ikke allerede har. Du kan bruke filter til å finne et løpende gjennomsnitt uten å bruke en forløkke. Dette eksemplet finner det løpende gjennomsnittet av en 16-elementvektor, ved hjelp av en vindustørrelse på 5. 2) Glatt som en del av kurvefiksjonsverktøyskassen (som er tilgjengelig i de fleste tilfeller) glatter du (y) dataene i kolonnevektoren y bruker et glidende gjennomsnittsfilter. Resultatene returneres i kolonnevektoren. Standardspenningen for det bevegelige gjennomsnittet er 5.FIR-filtre, IIR-filtre og den lineære konstant-koeffisientforskjellkvate. Causal Moving Average (FIR) - filtre. Vi har diskutert systemer der hver prøve av utgangen er en vektet sum av (visse av ) prøvene av inngangen. La oss ta et årsaksvektet sumssystem, hvor årsakssammenheng betyr at en gitt utgangsprøve bare avhenger av gjeldende inngangseksempel og andre innganger tidligere i sekvensen. Verken lineære systemer generelt, og heller ikke finite impulsresponsystemer, må være årsakssammenhengende. Kausalitet er imidlertid praktisk for en slags analyse som skulle undersøke snart. Hvis vi symboliserer inngangene som verdier av en vektor x. og utgangene som tilsvarende verdier av en vektor y. så kan et slikt system skrives som hvor b-verdiene er quotweightsquot brukt på de nåværende og tidligere inngangssamplene for å få den nåværende utgangsprøven. Vi kan tenke på uttrykket som en ligning, med likestillingsbetegnelsen betyr lik, eller som en prosedyreinstruksjon, med likestillingsbetegnelsen. Lar oss skrive uttrykket for hver utgangseksempel som en MATLAB-sløyfe med oppgaveoppgavene, hvor x er en N-lengdevektor av inngangsprøver, og b er en M-lengdevektor av vekt. For å håndtere det spesielle tilfellet ved starten, vil vi legge inn x i en lengre vektor xhat hvis første M-1-prøver er null. Vi vil skrive den veide summasjonen for hver y (n) som et indre produkt, og vil gjøre noen manipulasjoner av inngangene (som reversering b) til dette formål. Denne typen system kalles ofte et bevegelig gjennomsnittsfilter av åpenbare årsaker. Fra våre tidligere diskusjoner bør det være åpenbart at et slikt system er lineært og skift-invariant. Selvfølgelig vil det være mye raskere å bruke MATLAB convolution-funksjonen conv () i stedet for vår mafilt (). I stedet for å vurdere de første M-1-prøvene av inngangen til å være null, kan vi betrakte dem til å være de samme som de siste M-1-prøvene. Dette er det samme som å behandle inngangen som periodisk. Vel bruk cmafilt () som navnet på funksjonen, en liten modifikasjon av den tidligere mafilt () - funksjonen. Ved å bestemme impulsresponsen til et system er det vanligvis ingen forskjell mellom disse to, siden alle ikke-første prøver av inngangen er null: Siden et slikt system er lineært og skift-invariant, vet vi at dets effekt på alle sinusoid vil bare være å skalere og skifte den. Her er det viktig at vi bruker den sirkulære versjonen Den sirkulært-konvolverte versjonen skiftes og skaleres litt, mens versjonen med vanlig konvolusjon er forvrengt i starten. Lar se hva den eksakte skaleringen og skiftingen er ved å bruke en fft: Både inngang og utgang har amplitude bare ved frekvenser 1 og -1, som er som det burde være, gitt at inngangen var en sinusformet og systemet var lineært. Utgangsverdiene er større med et forhold på 10,62518 1,3281. Dette er gevinsten til systemet. Hva med fasen Vi trenger bare å se hvor amplitude er ikke-null: Inngangen har en fase av pi2, som vi ba om. Utgangsfasen skiftes med ytterligere 1,0594 (med motsatt tegn for negativ frekvens), eller ca. 16 av en syklus til høyre, som vi kan se på grafen. Nå kan vi prøve en sinusoid med samme frekvens (1), men i stedet for amplitude 1 og fase pi2, kan vi prøve amplitude 1.5 og fase 0. Vi vet at bare frekvens 1 og -1 vil ha null null amplitude, så vi kan bare se på dem: Igjen er amplitudeforholdet (15.937712.0000) 1.3281 - og for fasen blir det igjen skiftet med 1.0594 Hvis disse eksemplene er typiske, kan vi forutsi effekten av vårt system (impulsrespons .1 .2 .3 .4 .5) på hvilken som helst sinusoid med frekvens 1 - amplituden vil bli økt med en faktor på 1,3281 og den (positive frekvens) fase vil bli forskyvet med 1,0594. Vi kunne fortsette å beregne effekten av dette systemet på sinusoider av andre frekvenser med samme metoder. Men det er en mye enklere måte, og en som etablerer det generelle punktet. Siden (sirkulær) konvolusjon i tidsdomenet betyr multiplikasjon i frekvensdomenet, følger det med at DFT av impulsresponsen med andre ord er forholdet mellom DFT for utgangen og DFT på inngangen. I dette forholdet er DFT-koeffisientene komplekse tall. Siden abs (c1c2) abs (c1) abs (c2) for alle komplekse tall c1, c2, forteller denne ligningen oss at amplitudespektret for impulsresponsen alltid vil være forholdet mellom amplitudespektret for utgangen og inngangen til inngangen . I tilfelle av fasespektret er vinkel (c1c2) vinkel (c1) - vinkel (c2) for alle c1, c2 (med den forutsetning at faser som er forskjellige med n2pi regnes like). Fasespektret for impulsresponsen vil derfor alltid være forskjellen mellom fasespekteret for utgangen og inngangen (med hvilke korrigeringer med 2pi som er nødvendig for å holde resultatet mellom - pi og pi). Vi kan se fasevirkningene tydeligere hvis vi pakker ut representasjonen av fase, dvs. hvis vi legger til flere multipler på 2pi etter behov for å minimere hoppene som er produsert av periodisk karakter av vinkelen () - funksjonen. Selv om amplitude og fase vanligvis brukes til grafisk og jevn tabellpresentasjon, da de er en intuitiv måte å tenke på effekten av et system på de forskjellige frekvenskomponentene i inngangen, er de komplekse Fourier-koeffisientene mer nyttige algebraisk, siden de tillater det enkle uttrykket for forholdet Den generelle tilnærmingen vi nettopp har sett vil fungere med vilkårlig filtre av typen skissert, hvor hver utgangseksempel er en vektet sum av et sett av inngangssampler. Som nevnt tidligere kalles disse ofte Finite Impulse Response-filtre, fordi impulsresponsen er av fin størrelse, eller noen ganger Flyttende gjennomsnittlig filtre. Vi kan bestemme frekvensresponsegenskapene til et slikt filter fra FFT av impulsresponsen, og vi kan også designe nye filtre med ønskede egenskaper ved IFFT fra en spesifikasjon av frekvensresponsen. Autoregressive (IIR) - filtre Det ville være lite poeng å ha navn på FIR-filtre, med mindre det var noe annet å skille dem fra, og så de som har studert pragmatikk, vil ikke bli overrasket over at det er en annen stor art av lineært tidsinvariant filter. Disse filtrene kalles noen ganger rekursive fordi verdien av tidligere utganger (samt tidligere innganger) betyr noe, selv om algoritmene generelt skrives ved hjelp av iterative konstruksjoner. De kalles også Infinite Impulse Response (IIR) filtre, fordi deres respons på impulser generelt går for alltid. De kalles også noen ganger autoregressive filtre, fordi koeffisientene kan tenkes som følge av å foreta lineær regresjon for å uttrykke signalverdier som en funksjon av tidligere signalverdier. Forholdet mellom FIR og IIR-filtre kan ses tydelig i en lineær konstant-koeffisientforskjellekvasjon, dvs. å sette en vektet sum av utganger som er lik en vektet sum av innganger. Dette er som ligningen som vi ga tidligere for årsakssystemet FIR-filter, bortsett fra at i tillegg til den vektede summen av innganger, har vi også en vektet sum av utganger. Hvis vi ønsker å tenke på dette som en prosedyre for å generere utgangseksempler, må vi omorganisere ligningen for å få et uttrykk for gjeldende utgangssprøve y (n), Vedta konvensjonen at a (1) 1 (f. eks. Ved å skalere andre som og bs), kan vi kvitte seg 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) Hvis alle a (n) annet enn a (1) er null, reduseres dette til vår gamle venn, det kausale FIR-filteret. Dette er det generelle tilfellet av et (kausal) LTI filter, og implementeres av MATLAB-funksjonsfilteret. La oss se på tilfellet der b-koeffisientene bortsett fra b (1) er null (i stedet for FIR-tilfellet, hvor a (n) er null): I dette tilfellet beregnes nåværende utgangsprøve y (n) som en vektet kombinasjon av gjeldende inngangseksempel x (n) og tidligere utgangsprøver y (n-1), y (n-2) osv. For å få en ide om hva som skjer med slike filtre, kan vi starte med tilfellet hvor: Det vil si at den nåværende utgangsprøven er summen av gjeldende inngangseksempel og halvparten av den forrige utgangsprøven. Vel ta en inngangspuls gjennom noen få skritt, en om gangen. Det skal være klart på dette punktet at vi enkelt kan skrive et uttrykk for nth utgangsprøveverdien: det er bare (Hvis MATLAB telles fra 0, ville dette bare være .5n). Siden det vi beregner er impulsresponsen til systemet, har vi vist ved eksempel at impulsresponsen faktisk kan ha uendelig mange ikke-nullprøver. For å implementere dette trivielle førstegangsfilteret i MATLAB kunne vi bruke filter. Samtalen vil se slik ut: og resultatet er: Er denne virksomheten virkelig fortsatt lineær? Vi kan se på dette empirisk: For en mer generell tilnærming, vurder verdien av en utgangseksempel y (n). Ved suksessiv substitusjon kan vi skrive dette som: Dette er akkurat som vår gamle venn, sammenkallings-summen av et FIR-filter, med impulsresponsen gitt av uttrykket .5k. og lengden på impulsresponsen er uendelig. Dermed de samme argumentene som vi pleide å vise at FIR-filtre var lineære, vil nå gjelde her. Så langt kan dette virke som mye oppstyr om ikke mye. Hva er denne hele undersøkelsesgruppen god for Vel, svar på dette spørsmålet i faser, med utgangspunkt i et eksempel. Det er ikke en stor overraskelse at vi kan beregne en samplet eksponensiell ved rekursiv multiplikasjon. La oss se på et rekursivt filter som gjør noe mindre tydelig. Denne gangen gjør du det til et andreordfilter, slik at anropet til filteret vil være av skjemaet. Lets angi den andre utgangskoeffisienten a2 til -2cos (2pi40), og den tredje utgangskoeffisienten a3 til 1, og se på impulsen respons. Ikke veldig nyttig som filter, faktisk, men det genererer en samplet sinusbølge (fra en impuls) med tre multipliser-adds per prøve. For å forstå hvordan og hvorfor det gjør dette, og hvordan rekursive filtre kan utformes og analyseres i Jo mer generelt, vi må gå tilbake og ta en titt på noen andre egenskaper av komplekse tall, på vei til å forstå z transformen. Følgende er et hardkodet 3-punktsvektet symmetrisk glidende gjennomsnittlig filter: Så mine forutsetninger for hvordan et n-punktsvektet symmetrisk glidende gjennomsnittlig filter ville fungere er som følger: Mitt endelige mål er å skape et vektet symmetrisk glidende gjennomsnittlig filter som har et modulært antall poeng over hvilke det kan gjennomsnittlig. Den delen som virkelig får meg, er vektingen selv, og mens jeg er sikker på at en nestet sløyfe av noe slag ville gjøre kunsten, kan jeg ikke se hvordan jeg selv ville starte noe slikt. Takk for at du tok deg tid til å inspisere spørsmålet mitt, noen tilbakemeldinger vil bli verdsatt. Velg ditt land

Comments

Popular posts from this blog

Time Warner Aksjeopsjoner

Tipe Senyawa Binære Alternativer

Szlafroki Forex Opinie