Moving Average Rekursiewe Implementering
Die bewegende gemiddelde as 'n Filter die bewegende gemiddelde is dikwels gebruik vir glad data in die teenwoordigheid van ruis. Die eenvoudige bewegende gemiddelde is nie altyd erken as die Eindige Impulse Response (FIR) filter dat dit, terwyl dit eintlik een van die mees algemene filters in seinverwerking. Die behandeling van dit as 'n filter kan vergelyk dit met byvoorbeeld met venster-sed filters (sien die artikels oor lae-pass. Hoë-pass. En orkes-pass en orkes-verwerp filters vir voorbeelde van diegene). Die groot verskil met dié filters is dat die bewegende gemiddelde is geskik vir seine waarvoor die nuttige inligting is vervat in die tydgebied. waarvan glad metings deur die gemiddeld is 'n uitstekende voorbeeld. 'N klein venster-sed filters, aan die ander kant, is sterk presteerders in die frekwensiedomein. met gelykmaking in klank verwerking as 'n tipiese voorbeeld. Daar is 'n meer gedetailleerde vergelyking van beide tipes filters in Time Domain teen frekwensiedomein Performance filters. As jy inligting soek wat beide die tyd en die frekwensie domein is belangrik, dan kan jy 'n blik op variasies op die bewegende gemiddelde het. wat bied 'n aantal geweegde weergawes van die bewegende gemiddelde wat beter op daardie is. Die bewegende gemiddelde lengte (N) kan gedefinieer word as geskryf soos dit tipies is geïmplementeer, met die huidige uitset monster as die gemiddelde van die vorige (N) monsters. Gesien word as 'n filter, die bewegende gemiddelde voer 'n konvolusie van die insette volgorde (xn) met 'n vierkantige pols van lengte (N) en hoogte (1 / N) (om die oppervlakte van die pols te maak, en dus die wins van die filter, een). In die praktyk is dit die beste om (N) vreemd neem. Hoewel 'n bewegende gemiddelde ook kan bereken word met behulp van 'n gelyke getal monsters, met behulp van 'n vreemde waarde vir (N) het die voordeel dat die vertraging van die filter 'n heelgetal van monsters sal wees nie, aangesien die vertraging van 'n filter met (N) monsters is presies ((N-1) / 2). Die bewegende gemiddelde kan dan presies in lyn wees met die oorspronklike data deur die verskuiwing dit deur 'n heelgetal van monsters. Tyd Domain Sedert die bewegende gemiddelde is 'n konvolusie met 'n vierkantige pols, sy frekwensieweergawe is 'n sed funksie. Dit maak dit iets soos die dubbele van die klein venster-sed filter, want dit is 'n konvolusie met 'n sed pols wat lei tot 'n vierkantige frekwensieweergawe. Dit is hierdie sed frekwensieweergawe dat die bewegende gemiddelde n swak presteerder in die frekwensiedomein maak. Maar dit doen baie goed in die tydgebied. Daarom is dit ideaal om data glad geraas te verwyder, terwyl op dieselfde tyd nog 'n vinnige stap reaksie (figuur 1) hou. Vir die tipiese byvoeging Wit Gaussiese ruis (SWGR) wat dikwels aanvaar, gemiddeld (N) monsters het die effek van die verhoging van die SNR met 'n faktor van (sqrt N). Sedert die geraas vir die individuele monsters is ongekorreleerd, daar is geen rede om elke monster anders te behandel. Vandaar die bewegende gemiddelde, wat elke monster dieselfde gewig gee, sal ontslae te raak van die maksimum bedrag van geraas vir 'n gegewe stap reaksie skerp. Implementering Omdat dit 'n FIR filter, kan die bewegende gemiddelde geïmplementeer deur konvolusie. Dit sal dan dieselfde doeltreffendheid (of die gebrek daaraan) as enige ander FIR filter. Maar dit kan ook rekursief geïmplementeer, in 'n baie doeltreffende manier. Dit volg direk uit die definisie dat hierdie formule is die gevolg van die uitdrukkings vir (yn) en (yn1), dit wil sê, waar ons sien dat die verandering tussen (yn1) en (yn) is dat 'n ekstra termyn (xn1 / N) verskyn aan die einde, terwyl die term (xn-N1 / N) van die begin af verwyder. In praktiese toepassings, is dit dikwels moontlik om uit te laat die verdeling deur (N) vir elke kwartaal deur vergoed vir die gevolglike wins van (N) in 'n ander plek. Dit rekursiewe implementering sal baie vinniger as konvolusie wees. Elke nuwe waarde van (y) kan bereken word met net twee toevoegings, in plaas van die (N) toevoegings wat vir 'n eenvoudige implementering van die omskrywing nodig sou wees. Een ding om op die uitkyk vir 'n rekursiewe implementering is dat afrondingsfoute sal ophoop. Dit mag of mag nie 'n probleem vir jou aansoek nie, maar dit beteken ook dat dit rekursiewe implementering eintlik beter met 'n heelgetal implementering sal werk as met swaai-punt getalle. Dit is nogal 'n ongewone, aangesien 'n drywende punt implementering is gewoonlik makliker. Die sluiting van dit alles moet wees dat jy nooit die nut van die eenvoudige bewegende gemiddelde filter in seinverwerking aansoeke moet onderskat nie. Filterontwerp Tool Hierdie artikel word aangevul met 'n Filter Ontwerp instrument. Eksperimenteer met verskillende waardes vir (N) en visualiseer die gevolglike filters. Probeer dit nowThe belangrikste defek in jou program is wat die rekursiewe berekening is verkeerd. Om die gemiddelde te bereken, moet jy die volle getal van die huidige waarde en die oorblywende waardes te kry. dan verdeel dit som deur die aantal waardes. Die aantal waardes is num. Die huidige waarde is alles calculatenumber () opbrengs. Die som van die oorblywende waardes is num-1 vermenigvuldig met die gemiddelde van die oorblywende waardes. Die gemiddelde van die oorblywende waardes word bereken deur 'n rekursiewe oproep tot Gemiddeld (). So, ons skryf die volgende: 'n Volledige program met behulp van die funksie kan so lyk: Let daarop dat hierdie is nie 'n baie goeie manier om die gemiddelde bereken nie omdat jy presisie verloor elke keer as jy die huidige bedrag verdeel deur num. Wanneer hierdie gemiddelde weer kry vermenigvuldig soos die rekursiewe oproep opbrengste, nie die beduidende syfers wat jy verloor het in die afdeling nie ontslae herstel. Jy is die vernietiging van inligting word deur en dan die som te vermenigvuldig. Vir groter presisie, sal jy wil om tred te hou van die som te hou as jy gaan deur die elemente, dan verdeel aan die einde. Nog 'n punt om te oorweeg is wat bedoel word met 'n bewegende gemiddelde. Wat weve bo geïmplementeer is nie 'n bewegende gemiddelde, maar 'n vaste gemiddelde. Dit is die gemiddeld van 'n vaste venster van elemente. As jy die venster beweeg deur een posisie, moet jy oor begin en bereken die som weer. Die korrekte manier om 'n bewegende venster te implementeer is om tred te hou van al die elemente in die venster te hou. Wanneer jy by die venster uit een posisie na regs skuif, jy die linker element te verwyder uit die venster en trek die waarde van die som, en voeg dan die nuwe regterkantste element na die venster en voeg die waarde daarvan om die som. Dis wat maak dit 'n bewegende som. Die verdeling van die bewegende som deur die aantal elemente gee jou die bewegende gemiddelde. Die natuurlike manier om 'n bewegende venster te implementeer is met 'n tou, want jy nuwe elemente aan die hoof kan voeg en pop ou elemente van die stert. antwoord 22 November 14 aan 17: 44In statistieke n eenvoudige bewegende gemiddelde is 'n algoritme wat die ongeweegde gemiddelde van die laaste N monsters bereken. Die parameter N word dikwels die grootte venster, omdat die algoritme kan beskou word as 'n venster wat gly oor die datapunte. Deur die gebruik van 'n rekursiewe formulering van die algoritme, is die aantal operasies wat per monster verminder tot een Daarbenewens een aftrek en een afdeling. Aangesien die formulasie is onafhanklik van die venster grootte N. die runtime kompleksiteit is O (1). maw konstante. Die rekursiewe formule van die ongeweegde bewegende gemiddelde is, waar gemiddelde is die rollende gemiddelde en x verteenwoordig 'n data punt. So, wanneer die venster skyfies na regs, een datapunt, die stert, druppels uit en een datapunt, die hoof, beweeg in. Implementering 'n uitvoering van die eenvoudige bewegende gemiddelde het om die volgende in ag Algoritme inisialisering neem Solank die venster is nie ten volle gevul is met waardes, die rekursiewe formule versuim. Stoor Toegang tot die stert element vereis word, wat na gelang van die implementering vereis 'n stoor van n elemente. My implementering gebruik die aangebied formule wanneer die venster is heeltemal gevul is met waardes, en anders skakel om die formule, wat die gemiddelde updates deur herbereken die som van die vorige elemente. Let daarop dat dit kan lei tot numeriese onstabiliteit as gevolg van drywende punt rekenkundige. Sover geheue verbruik betref, is die implementering gebruik iterators om tred te hou van kop en stert elemente hou. Dit lei tot 'n uitvoering met 'n konstante herinnering vereistes onafhanklik van die venster grootte. Hier is die update proses wat die venster na regs skuif. In die meeste van die versamelings ongeldig hul sensusopnemers wanneer die onderliggende versameling is verander. Die implementering egter staatmaak op geldig opnemers. Veral in streaming gebaseerde programme die onderliggende versameling behoeftes verander wanneer 'n nuwe element kom. Een manier om dit te hanteer wat 'n eenvoudige omsendbrief vaste grootte versameling grootte N1 wat nooit invalidates sy iterators en afwisselend voeg 'n element en oproep Shift te skep. Ek wens ek kon uitvind hoe om dit eintlik te implementeer, soos die toets funksie is baie verwarrend om me8230 Moet ek data te omskep in Array, dan hardloop SMA SMA nuwe SMA (20, skikking) vir 'n tydperk van 20 SMA Hoe hanteer ek verskuiwing () funksie is dit nodig om vervaardigerskampioenskap te implementeer. (Jammer vir die verwarring). Nee, jy don8217t nodig het om jou data so lank te omskep in 'n skikking as jou data implemente IEnumerable1 en die versyferde tipe is dubbel. Wat jou persoonlike boodskappe betref wat jy nodig het om die DataRow te skakel na iets wat enumerable dubbele waardes. Jou benadering werk. Verskuiwing, gly die venster een posisie na links. Vir 'n datastel van sê 40 waardes en 'n 20 tydperk SMA het jy 21 poste by die venster pas (40 8211 20 1). Elke keer as jy bel Shift () die venster na links verskuif deur een posisie en Gemiddeld () gee terug Die SMA vir die huidige venster posisie. Dit wil sê, die ongeweegde gemiddelde van alle waardes in die venster. Daarbenewens my implementering toelaat om die SMA bereken selfs indien die venster is nie ten volle gevul aan die begin. So in wese hoop dit help. Enige verdere vrae kopieregkennisgewing Christoph Heindl en cheind. wordpress, 2009-2012. Ongemagtigde gebruik en / of duplisering van hierdie materiaal sonder uitdruklike en skriftelike toestemming van die blogs skrywer en / of eienaar is streng verbode. Uittreksels en skakels mag gebruik word, met dien verstande dat die volle en duidelike krediet gegee word aan Christoph Heindl en cheind. wordpress met toepaslike en spesifieke rigting van die oorspronklike inhoud. Recent Posts ArchivesThe Scientist en Ingenieurs Guide to Digital Signal Processing Deur Steven W. Smith, Ph. D. 'N geweldige voordeel van die bewegende gemiddelde filter is dat dit geïmplementeer kan word met 'n algoritme wat baie vinnig. Om hierdie algoritme te verstaan, dink verby 'n insetsein, x, deur 'n sewe punt bewegende gemiddelde filter om 'n uitset sein vorm, y. Nou kyk hoe twee aangrensende uitset punte, y 50 en y 51, bereken: Dit is byna dieselfde berekening punte x 48 deur x 53 moet bygevoeg word vir y 50, en weer vir y 51. As y 50 is reeds bereken die mees doeltreffende manier om y 51 te bereken is: Sodra y 51 is gevind met behulp van y 50, dan y 52 kan bereken word uit voorbeeld y 51, en so aan. Na afloop van die eerste punt word bereken in y, kan al die ander punte te vinde met slegs 'n enkele optel en aftrek per punt. Dit kan uitgedruk word in die vergelyking: Let daarop dat hierdie vergelyking gebruik twee bronne van data aan elke punt in die uitset te bereken: punte van die insette en voorheen berekende punte van die uitset. Dit staan bekend as 'n rekursiewe vergelyking, wat beteken dat die resultaat van 'n berekening gebruik word in die toekoms berekeninge. (Die term rekursiewe het ook ander betekenisse, veral in rekenaarwetenskap). Hoofstuk 19 bespreek 'n verskeidenheid van rekursiewe filters in meer besonderhede. Wees bewus daarvan dat die bewegende gemiddelde rekursiewe filter is baie anders as tipiese rekursiewe filters. In die besonder, die meeste rekursiewe filters het 'n oneindige lang impulsrespons (IIR), saamgestel sinusoïede en Exponentiële. Die impulsrespons van die bewegende gemiddelde is 'n vierkantige pols (eindige impulsrespons, of FIR). Hierdie algoritme is vinniger as ander digitale filters vir 'n paar redes. In die eerste plek is daar net twee berekeninge per punt, ongeag die lengte van die filter kern. Tweede, optel en aftrek is die enigste wiskunde bedrywighede nodig, terwyl die meeste digitale filters vereis tydrowende vermenigvuldiging. Derde, die kruip skema is baie eenvoudig. Elke indeks in vergelyking. 15-3 gevind deur die byvoeging of af te trek heelgetal konstantes wat bereken kan voor die filter begin (dit wil sê P en Q). Uitgaan, die hele algoritme kan met heelgetal verteenwoordiging gedra. Afhangende van die hardeware gebruik, kan heelgetalle meer as 'n orde van grootte wees vinniger as drywende punt. Verbasend, heelgetal verteenwoordiging werk beter as drywende punt met hierdie algoritme, in Benewens die feit dat vinniger. Die ronde-off fout van drywende punt rekenkundige kan onverwagte resultate te lewer as jy nie versigtig is nie. Byvoorbeeld, dink 'n 10,000 monster sein word gefiltreer met hierdie metode. Die laaste voorbeeld in die gefilterde sein bevat die opgehoopte fout van 10,000 toevoegings en 10.000 aftrek. Dit blyk in die uitsetsein as 'n dryf verreken. Heelgetalle hoef hierdie probleem, want daar is geen ronde-off fout in die rekenkundige. As jy swaai punt moet gebruik met hierdie algoritme, die program in Tabel 15-2 wys hoe om 'n dubbele presisie akkumulator gebruik om hierdie drift. I skakel in wese 'n verskeidenheid van waardes soos volg: Bogenoemde skikking word oorvereenvoudig, Im invordering 1 waarde per millisekonde in my werklike kode en ek nodig het om die uitset op 'n algoritme wat ek geskryf het na die naaste piek voor 'n tydstip vind verwerk. My logika nie, omdat my voorbeeld hierbo, 0,36 is die ware hoogtepunt, maar my algoritme sal agter te kyk en te sien die heel laaste aantal 0,25 as die hoogtepunt, as Theres 'n afname tot 0,24 voor dit. Die doel is om hierdie waardes te neem en 'n algoritme toe te pas om hulle verwek wat hulle sal glad 'n bietjie, sodat ek meer lineêre waardes. (Dit wil sê: id graag my resultate te bochtig wees, nie jaggedy) Ive vertel is om 'n eksponensiële bewegende gemiddelde filter van toepassing op my waardes. Hoe kan ek hierdie Sy doen baie moeilik vir my om wiskundige vergelykings gelees, ek gaan baie beter met kode. Hoe kan ek verwerk waardes in my skikking, die toepassing van 'n eksponensiële bewegende gemiddelde berekening om hulle selfs uit gevra 8 Februarie 12 aan 20:27 Om 'n eksponensiële bewegende gemiddelde bereken. wat jy nodig het om 'n staat om te hou en jou 'n stem parameter nodig het. Dit vereis 'n bietjie klas (met die aanvaarding jy met behulp van Java 5 of later): instansieer met die verval parameter wat jy wil (kan stem te neem moet wees tussen 0 en 1) en gebruik dan die gemiddelde () te filtreer. Lees 'n artikel op 'n mathmatical herhaling, al wat jy regtig nodig het om te weet wanneer om dit in kode is dat wiskundiges graag indekse in skikkings en rye met onderskrifte te skryf. (Theyve 'n paar ander notasies sowel, wat help nie die geval is.) Maar die EMO is eenvoudig as wat jy net nodig het om 'n ou waarde geen ingewikkelde toestand skikkings nodig om te onthou. beantwoord 8 Februarie 12 aan 20:42 TKKocheran: Pretty much. Isn39t dit lekker as dinge eenvoudig (As begin met 'n nuwe reeks, kry 'n nuwe Averager.) Kan wees Let daarop dat die eerste paar terme in die gemiddelde volgorde om 'n bietjie sal spring as gevolg van grens-effekte, maar jy kry diegene met ander bewegende gemiddeldes ook. Maar 'n goeie voordeel is dat jy die bewegende gemiddelde logika in die Averager en eksperimenteer kan draai sonder die res van jou program te veel te versteur. â € Donal Fellows 9 Februarie 12 by 00:06 Ek het 'n harde tyd te verstaan jou vrae, maar ek sal probeer om in elk geval te beantwoord. 1) As jou algoritme gevind 0,25 in plaas van 0,36, dan is dit verkeerd. Dit is verkeerd, want dit neem 'n monotoniese vermeerdering of vermindering (wat altyd opgaan of altyd gaan af). Tensy jy al jou data gemiddeld jou datapunte --- soos jy dit aan te bied --- is nie-lineêre. As jy regtig wil om die maksimum waarde tussen twee punte in die tyd te vind, dan sny jou verskeidenheid van tmin om Tmax en vind die maksimum van daardie subarray. 2) Nou, die konsep van bewegende gemiddeldes is baie eenvoudig: dink dat ek die volgende lys: 1.4, 1.5, 1.4, 1.5, 1.5. Ek kan dit glad deur die neem van die gemiddelde van twee getalle: 1.45, 1.45, 1.45, 1.5. Let daarop dat die eerste getal is die gemiddeld van 1.5 en 1.4 (tweede en eerste nommers) die tweede (nuwe lys) is die gemiddeld van 1.4 en 1.5 (derde en tweede ou lys) die derde (nuwe lys) die gemiddelde van 1,5 en 1,4 (vierde en derde), en so aan. Ek kon dit drie of vier, of N gemaak. Let op hoe die data is baie gladder. 'N Goeie manier om bewegende gemiddeldes te sien by die werk is om te gaan na Google Finansies, kies 'n voorraad (probeer Tesla Motors mooi vlugtige (TSLA)) en klik op technicals aan die onderkant van die grafiek. Kies bewegende gemiddelde met 'n gegewe tydperk, en Eksponensiële bewegende gemiddelde om hul verskille te vergelyk. Eksponensiële bewegende gemiddelde is net nog 'n uitbreiding van hierdie, maar gewigte die ouer data minder as die nuwe data dit is 'n manier om vooroordeel die smoothing na die agterkant. Lees asseblief die Wikipedia-inskrywing. So, dit is meer 'n opmerking as 'n antwoord, maar die bietjie kommentaar boks was net te klein. Sterkte. As jy probleme het met die wiskunde, kan jy gaan met 'n eenvoudige bewegende gemiddelde plaas van eksponensiële. So die uitset jy sou wees die laaste x terme gedeel deur x. Ongetoets pseudokode: Let daarop dat jy sal nodig hê om te hanteer die begin en einde dele van die data sedert duidelik jy kan nie gemiddeld die afgelope 5 terme wanneer jy op jou 2de data punt. Daar is ook meer doeltreffende maniere berekening hierdie bewegende gemiddelde (som som - oudste nuutste), maar dit is om die konsep van kry whats oor gebeur. beantwoord 8 Februarie 12 aan 20:41
Comments
Post a Comment