Friday 24 November 2017

Matlab Bevegelig Gjennomsnitt Dobbel


Jeg prøver å gjøre et bevegelige gjennomsnittsfilter i C-språk, jeg har tilpasset et matlab-program som fungerer riktig, inngangen til filteret mitt er et. pcm-arkiv (et sveip lydsignal), problemet for meg er utgangarkivet for flyttingen gjennomsnitt i C-språk, utgangen går galt, signalet reduseres bare langs tid (ikke filteren). Under min C-kode: Bildet under er utgangen av matlab-programmet til å flytte gjennomsnittet med lengde 16: Dette bildet er utgangen i C-språk med glidende gjennomsnitt med lengde 16: Noen vet hva som kan være Under koden i matlab, som Ive Tilpasset: Oppdater 1 (Bruk svaret ovenfor): Begynnelsen av signalet fortsatt med forstyrrelse, men fra midten til slutten av signalet er riktig. 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 designet for å kopiere 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 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. Standardverdien for det bevegelige gjennomsnittet er 5.Dobbeltflyttende gjennomsnittlig filterbeskrivelse DoubleMovingAverageFilter implementerer et lavpass dobbeltflytende gjennomsnittlig filter. DoubleMovingAverageFilter er en del av Preprocessing Modules. Et eksempel på et signal (sinusbølgeavhengig støy) filtrert ved hjelp av et glidende gjennomsnittsfilter. Det røde signalet er den opprinnelige signalstøyen, det grønne signalet er det filtrerte signalet ved hjelp av et glidende gjennomsnittsfilter med en vindustørrelse på 5, og det blå signalet er det filtrerte signalet ved hjelp av et glidende gjennomsnittsfilter med en vindustørrelse på 20. DoubleMovingAverageFilterExampleImage1. jpg-fordeler DoubleMovingAverageFilter er bra for å fjerne en liten mengde høyfrekvent støy fra et N-dimensjonalt signal. Ulemper Den største ulempen ved DoubleMovingAverageFilter er at for å filtrere ut signifikant høyfrekvent støy, må filterstørrelsen på filteret være stor. Problemet med å ha et stort filtervindu er at dette vil forårsake stor latens i ethvert signal som passerer gjennom filteret, noe som kanskje ikke er fordelaktig for sanntidsapplikasjoner. Hvis du finner ut at du trenger et stort filtervindu for å filtrere ut høyfrekvent støy, og latensen fremvist av denne vinduets størrelse ikke passer for din sanntidsapplikasjon, vil du kanskje prøve et lavpassfilter i stedet. Eksempelkode GRT DoubleMovingAverageFilter Eksempel Dette eksempelet viser hvordan du lager og bruker GRT DoubleMovingAverageFilter PreProcessing Module. DoubleMovingAverageFilter implementerer et lavpass dobbeltflytende gjennomsnittlig filter. I dette eksemplet oppretter vi en forekomst av en DoubleMovingAverageFilter og bruker dette til å filtrere noen dummy data, generert fra en sinusbølge tilfeldig støy. Testsignalet og filtrerte signaler blir deretter lagret i en fil (slik at du kan plotte resultatene i Matlab, Excel, etc. hvis nødvendig). Dette eksemplet viser hvordan du: - Opprett en ny DoubleMovingAverageFilter-forekomst med en bestemt vindusstørrelse for et 1-dimensjonalt signal - Filtrer noen data ved hjelp av DoubleMovingAverageFilter - Lagre DoubleMovingAverageFilter-innstillingene i en fil - Legg inn DoubleMovingAverageFilter-innstillingene fra en fil, inkluderer quotGRT. hquot bruker navneområde GRT int main 40 int argc. const char argv 91 93 41 123 Opprett en ny forekomst av et dobbeltglasset gjennomsnittlig filter med en vindustørrelse på 5 for et 1-dimensjonalt signal DoubleMovingAverageFilter filter 40 5. 1 41 Opprett og åpne en fil for å lagre datafilens filfil. åpne 40 quotDoubleMovingAverageFilterData. txtquot. fstream. ut 41 Generer noen data (sinusbølge støy) og filtrer den dobbel x 0 const UINT M 1000 Tilfeldig tilfeldig for 40 UINT i 0 I lt I 41 123 dobbelt signal sin 40 x 41 tilfeldig. getRandomNumberUniform 40 - 0.2. 0,2 41 dobbeltfilterValuefilter. filter 40 signal 41 fil l ltt signal l lt kvittet filtrertValue LLT endl x TWOPI dobbelt 40 M 41 10 125 Lukk filfilen. lukk 40 41 Lagre filterinnstillingene til et filfilter. saveSettingsToFile 40 quotDoubleMovingAverageFilterSettings. txtquot 41 Vi kan da laste inn innstillingene senere hvis det er nødvendig, filter. loadSettingsFromFile 40 quotDoubleMovingAverageFilterSettings. txtquot 41 retur EXITSUCCESS 125 DoubleMovingAverageFilter fungerer også med ethvert N-dimensjonalt signal: Opprett en ny forekomst av DoubleMovingAverageFilter med en vindustørrelse på 10 for et tredimensjonalt signal DoubleMovingAverageFilter filter 40 10. 3 41 Verdien du vil filtrere vektor lt dobbelt gt data 40 3 41 data 91 0 93 0. Få verdi fra sensordata 91 1 93 0. Få verdi fra sensordata 91 2 93 0. Få verdi fra sensor Filtrer signalvektoren lt double gt filteredValue filter. filter 40 data 41

No comments:

Post a Comment