Jeg prøver å fullføre et matlab-oppdragsprosjekt med følgende spørsmål: Skriv en funksjon som kalles movingaverage som tar en skalar kalt x som et inngangsargument og returnerer en skalar. Funksjonen bruker en buffer for å holde tidligere innganger, og bufferen kan holde maksimalt 25 innganger. Spesifikt må funksjonen lagre de siste 25 inngangene i en vektor (bufferen). Hver gang funksjonen kalles, kopierer den inngangsargumentet til et element i bufferen. Hvis det allerede er 25 innganger lagret i bufferen, kasserer det det eldste elementet og sparer den nåværende i bufferen. Etter at den har lagret inngangen i bufferen, returnerer den gjennomsnittet av alle elementene i bufferen. Løsningen jeg gir er følgende: I henhold til automatisk grader fungerer funksjonen min korrekt når verdiene 1-50 går forbi, men mislykkes når verdier av en støyende sinusbølge passerer fortløpende (som jeg har blitt informert om som kan skyldes noen slags avrundingsfeil). Jeg ville være takknemlig hvis noen av dere kunne gi meg noen hint om mulige feilstrinn i koden min (vedlagt ovenfor). Takk på forhånd29 september 2013 Flytte gjennomsnitt ved konvolusjon Hva er glidende gjennomsnitt og hva er det bra for Hvordan flytter gjennomsnittet gjort ved å bruke konvolusjon Flytte gjennomsnitt er en enkel operasjon som vanligvis brukes til å undertrykke støy av et signal: vi setter verdien av hver pek på gjennomsnittet av verdiene i nabolaget. Med en formel: Her er x inngangen, og y er utgangssignalet, mens størrelsen på vinduet er w, skulle være merkelig. Formelen ovenfor beskriver en symmetrisk operasjon: prøvene tas fra begge sider av det aktuelle punktet. Nedenfor er et virkelighetseksempel. Det punktet som vinduet ligger faktisk er rødt. Verdier utenfor x skal være nuller: For å spille rundt og se effekten av glidende gjennomsnitt, ta en titt på denne interaktive demonstrasjonen. Slik gjøres det ved konvolusjon Som du kanskje har gjenkjent, beregner det enkle glidende gjennomsnittet likningen: i begge tilfeller skyves et vindu langs signalet og elementene i vinduet oppsummeres. Så, prøv å gjøre det samme ved å bruke konvolusjon. Bruk følgende parametre: Ønsket utgang er: Som første tilnærming, la oss prøve det vi får ved å samle x-signalet med følgende k-kjerne: Utgangen er nøyaktig tre ganger større enn den forventede. Det kan også ses at utgangsvurderingene er oppsummeringen av de tre elementene i vinduet. Det er fordi under konvolusjonen glir vinduet langs, alle elementene i det blir multiplisert med en og deretter oppsummert: yk 1 cdot x 1 cdot x 1 cdot x For å få de ønskede verdiene for y. Utgangen skal deles med 3: Ved en formel som inkluderer divisjonen: Men ville det ikke være optimal å gjøre avdelingen under konvolusjonen. Her kommer ideen ved å omplassere ligningen: Så vi skal bruke følgende k-kjerne: På denne måten vil vi få ønsket utdata: Generelt: hvis vi ønsker å gjøre bevegelige gjennomsnitt ved konvolusjon som har en vindusstørrelse på w. Vi skal bruke følgende k-kjerne: En enkel funksjon som gjør det bevegelige gjennomsnittet er: Et eksempelbruk er: Laget onsdag 08 oktober 2008 20:04 Sist oppdatert torsdag 14. mars 2013 01:29 Skrevet av Batuhan Osmanoglu Hits: 41464 Flytte gjennomsnitt i Matlab Ofte finner jeg meg selv i behov av å gjennomsnittsgjøre dataene jeg må redusere støyen litt. Jeg skrev noen funksjoner for å gjøre akkurat det jeg vil, men matlabs innebygd filterfunksjon fungerer også bra bra. Her skriver jeg om 1D og 2D-gjennomsnittsdata. 1D filter kan realiseres ved hjelp av filterfunksjonen. Filterfunksjonen krever minst tre inngangsparametre: tellerkoeffisienten for filteret (b), nevnte koeffisient for filteret (a) og dataene (X) selvfølgelig. Et løpende gjennomsnittfilter kan defineres enkelt ved: For 2D-data kan vi bruke Matlabs filter2-funksjonen. For mer informasjon om hvordan filteret fungerer, kan du skrive: Her er en rask og skitten implementering av et 16 til 16 glidende gjennomsnittsfilter. Først må vi definere filteret. Siden alt vi vil ha er like bidrag fra alle naboer, kan vi bare bruke de funksjonene. Vi deler alt med 256 (1616) siden vi ikke vil endre det generelle nivået (amplitude) av signalet. For å bruke filteret kan vi bare si følgende Nedenfor er resultatene for fase av et SAR interferogram. I dette tilfellet er Range i Y-aksen, og Azimuth er kartlagt på X-aksen. Filtret var 4 piksler bredt i rekkevidde og 16 piksler bredt i Azimuth. Last ned movAv. m (se også movAv2 - en oppdatert versjon som tillater vekting) Beskrivelse Matlab inkluderer funksjoner som kalles movavg og tsmovavg (tidsserie glidende gjennomsnitt) i Financial Toolbox, movAv er utformet for å gjenskape de grunnleggende funksjonalitetene 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 for-linjen blir 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 går 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 bråk.
No comments:
Post a Comment