Thursday, October 27, 2016

Bewegende gemiddelde implementering filter c

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 nowI wese het '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 te verwerk wat ek geskryf het na die naaste hoogtepunt vind voordat 'n tydstip . 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: 41As ander genoem het, moet jy 'n IIR (oneindige impulsrespons) filter eerder as die FIR (eindige impulsrespons) filter jy is nou met behulp oorweeg. Daar is meer as dit, maar met die eerste oogopslag FIR filters word toegepas as eksplisiete konvolusie en IIR filters met vergelykings. Die besondere IIR filter Ek gebruik 'n baie in mikrobeheerders is 'n enkele paal laaglaatfilter. Dit is die digitale ekwivalent van 'n eenvoudige R-C analoog filter. Vir die meeste aansoeke, sal hierdie beter eienskappe as die boks filter wat jy gebruik het. Die meeste gebruike van 'n boks filter wat ek teëgekom het is 'n gevolg van iemand nie aandag in digitale seinverwerking klas, nie as gevolg van die behoefte van hul besondere eienskappe. As jy net wil 'n hoë frekwensies dat jy weet is geraas te verminder, 'n enkele paal laaglaatfilter is beter. Die beste manier om 'n digitaal te implementeer in 'n mikrobeheerder is gewoonlik: filt lt-- filt VF (NEW - filt) filt is 'n stukkie van die aanhoudende staat. Dit is die enigste aanhoudende veranderlike wat jy nodig het om hierdie filter te bereken. NUWE is die nuwe waarde wat die filter word opgedateer met hierdie iterasie. VF is die filter fraksie. wat pas 'n bekommernis vir die filter. Kyk na hierdie algoritme en sien dat vir 0 VF die filter is oneindig swaar sedert die uitset verander nooit. Vir 1 VF, sy werklik geen filter glad sedert die uitset volg net die insette. Nuttige waardes van die twee. Op klein stelsels haal jy VF om 1/2 N wees sodat die vermenigvuldig met VF bereik kan word as 'n reg verskuiwing deur N stukkies. Byvoorbeeld, kan VF wees 16/1 en die vermenigvuldig met VF dus 'n reg verskuiwing van 4 stukkies. Andersins hierdie filter moet net een aftrek en een byvoeging, hoewel die getalle gewoonlik nodig om wyer as die invoerwaarde (meer op numeriese presisie in 'n aparte afdeling hieronder) wees. Ek neem gewoonlik A / D lesings aansienlik vinniger as dit nodig is en pas twee van hierdie filters kaskade. Dit is die digitale ekwivalent van twee R-C filters in reeks, en verswak met 12 dB / oktaaf ​​bokant die rolloff frekwensie. Maar vir A / D lesings sy gewoonlik meer relevant om te kyk na die filter in die tydgebied deur die oorweging van sy stap reaksie. Dit vertel jou hoe vinnig jou stelsel 'n verandering sal sien wanneer die ding is wat jy meet veranderinge. Om die ontwerp van hierdie filters (wat net beteken pluk VF en besluit hoeveel van hulle waterval) te fasiliteer, ek gebruik my program FILTBITS. Jy gee die aantal verskuiwing stukkies vir elke VF in die kaskade reeks filters, en dit bere die stap reaksie en ander waardes. Eintlik het ek gewoonlik loop dit via my wrapper script PLOTFILT. Dit loop FILTBITS, wat 'n CSV-lêer maak, dan plotte die CSV. Byvoorbeeld, hier is die resultaat van PLOTFILT 4 4: Die twee parameters om PLOTFILT beteken daar twee filters kaskade van die hierbo beskryf tipe. Die waardes van 4 dui die aantal verskuiwing stukkies om die vermenigvuldig met VF besef. Die twee VF waardes is dus 1/16 in hierdie geval. Die rooi spoor is die eenheid stap reaksie, en is die belangrikste ding om te kyk na. Byvoorbeeld, hierdie vir jou vertel dat as die insette onmiddellik verander, die opbrengs van die gekombineerde filter sal vestig tot 90 van die nuwe waarde in 60 iterasies. As jy omgee vir 95 wegsterftyd dan moet jy wag sowat 73 iterasies, en vir 50 wegsterftyd slegs 26 iterasies. Die groen spoor wys jou die uitset van 'n enkele volle amplitude piek. Dit gee jou 'n idee van die ewekansige geraas onderdrukking. Dit lyk soos geen enkele voorbeeld meer as 'n 2.5 verandering in die uitset sal veroorsaak. Die blou spoor is 'n subjektiewe gevoel van wat hierdie filter doen met 'n wit geraas te gee. Dit is nie 'n streng toets, want daar is geen waarborg wat presies die inhoud was van die ewekansige getalle opgetel as die wit geraas insette vir hierdie lopie van PLOTFILT. Sy net om jou 'n rowwe gevoel van hoeveel dit sal platgedruk en hoe glad dit is. PLOTFILT, miskien FILTBITS, en baie van die ander nuttige dinge, veral vir PIC firmware ontwikkeling is beskikbaar in die PIC Ontwikkeling tools sagteware vrylating op my bladsy sagteware afgelaai. Bygevoeg oor numeriese presisie Ek sien uit die kommentaar en nou 'n nuwe antwoord dat daar belangstelling in die bespreking van die aantal bisse wat nodig is om hierdie filter te implementeer. Let daarop dat die vermenigvuldig met VF log 2 (VF) sal skep nuwe stukkies onder die binêre punt. Op klein stelsels, is VF gewoonlik gekies om 1/2 N wees sodat dit vermeerder eintlik besef deur 'n regte verskuiwing van N stukkies. Filt is dus gewoonlik 'n vaste punt heelgetal. Let daarop dat hierdie een van die wiskunde nie die geval te verander van die verwerkers oogpunt. Byvoorbeeld, as jy die filter 10 bis A / D lesings en N 4 (1/16 VF), dan moet jy 4 fraksie stukkies onder die 10 bis integriteit A / D lesings. Een meeste verwerkers, youd doen 16 bis integriteit bedrywighede weens die 10 bis A / D lesings. In hierdie geval is, kan jy nog doen presies dieselfde 16 bis integriteit opertions, maar begin met die A / D lesings links verskuif deur 4 stukkies. Die verwerker nie die geval is die verskil en nie die geval is weet moet. Doen die wiskunde op hele 16 bit heelgetalle werk of jy dit as '12.4 vaste punt of ware 16 bit heelgetalle (16.0 vaste punt) wees. In die algemeen, moet jy N stukkies elke filter paal voeg as jy dit nie wil geraas voeg as gevolg van die numeriese verteenwoordiging. In die voorbeeld hierbo, sal die tweede filter van twee moet 1044 18 stukkies inligting nie verloor het. In die praktyk op 'n 8 bit masjien wat youd gebruik 24 bit waardes beteken. Tegnies slegs die tweede paal van twee sou die wyer waarde nodig nie, maar vir firmware eenvoud Ek gebruik gewoonlik dieselfde verteenwoordiging, en sodoende dieselfde kode, vir alle pole van 'n filter. Gewoonlik skryf ek 'n subroutine of makro een filter paal aksie uit te voer, dan aansoek doen dat elke paal. Of 'n subroutine of makro hang af of siklusse of program geheue is belangriker in daardie spesifieke projek. In ieder geval, ek gebruik 'n paar kras staat om nuwe pas in die subroutine / makro wat filt updates, maar ook belastings wat in dieselfde kras staat NUWE in. Dit maak dit maklik om verskeie pale toe te pas, aangesien die opgedateer filt van een pool is die NUWE van die volgende een. Wanneer 'n subroutine, sy nuttig om 'n wyser punt om filt op die manier, wat net ná filt op die pad uit is opgedateer. Op dié manier die subroutine bedryf outomaties op agtereenvolgende filters in die geheue as meer as een keer genoem. Met 'n makro hoef jy nodig het 'n wyser omdat jy slaag in die adres te werk op elke iterasie. Kode Voorbeelde Hier is 'n voorbeeld van 'n makro soos hierbo beskryf vir 'n PIC 18: En hier is 'n soortgelyke makro vir 'n PIC 24 of dsPIC 30 of 33: Beide hierdie voorbeelde is geïmplementeer as makros met behulp van my PIC assembler voorverwerker. wat is meer in staat is as een van die ingeboude makro fasiliteite. clabacchio: Nog 'n probleem wat ek moes genoem is implementering firmware. Jy kan 'n enkele paal laaglaatfilter subroutine keer skryf, dan pas dit meer as een keer. Om die waarheid te gewoonlik skryf ek so 'n subroutine om 'n wyser te neem in die geheue om die filter staat, dan is dit bevorder die wyser sodat dit kan genoem word in die reeks maklik om 'n multi-paal filters te realiseer. â € Olin Lathrop 20 April 12 by 15:03 1. Baie dankie vir jou antwoorde - almal van hulle. Ek het besluit om hierdie IIR Filter gebruik, maar dit Filter is nie gebruik word as 'n Standard laagdeurlaatfilter, want ek moet Counter Waardes gemiddeld en vergelyk kan word om veranderinge in 'n sekere omvang te spoor. aangesien hierdie waardes van baie verskillende dimensies afhangende van Hardware wees Ek wou 'n gemiddelde te neem ten einde in staat te wees om outomaties te reageer op hierdie Hardware spesifieke veranderinge. â € sensslen 21 12 Mei om 12:06 As jy kan lewe met die beperking van 'n bevoegdheid van twee aantal items te Gemiddeld (dws 2,4,8,16,32 ens) dan is die kloof kan maklik en doeltreffend gedoen word op 'n lae prestasie mikro sonder toegewyde verdeel, want dit kan gedoen word as 'n bietjie skuif. Elke skof reg is 'n krag van twee bv: Die OP het gedink hy het twee probleme, verdeel in 'n PIC16 en geheue vir sy ring buffer. Hierdie antwoord dui daarop dat die skeidslyn is nie moeilik. Toegegee dit spreek nie die geheue probleem, maar die SE stelsel kan gedeeltelike antwoorde, en gebruikers kan iets uit elke antwoord neem vir hulself, of selfs wysig en kombineer other39s antwoorde. Aangesien sommige van die ander antwoorde vereis dat 'n kloof werking, hulle is soortgelyk onvolledig omdat hulle nie wys hoe om doeltreffend hierdie op 'n PIC16 bereik. â € Martin 20 April 12 by 13:01 Daar is 'n antwoord vir 'n ware bewegende gemiddelde filter (aka wagon filter) met minder geheue vereistes, as jy verstand downsampling hoef. Die sogenaamde kaskade integreerder-kam filter (CIC). Die idee is dat jy 'n integreerder wat jy verskille oor 'n tydperk, en die sleutel-geheue te bespaar, is dat deur downsampling, dont jy elke waarde van die integreerder stoor. Dit kan toegepas word met behulp van die volgende pseudokode: Jou effektiewe bewegende gemiddelde lengte is decimationFactorstatesize maar jy moet net om statesize monsters te hou. Dit is duidelik dat jy kan 'n beter prestasie kry as jou statesize en decimationFactor magte van 2 is, sodat die afdeling en restant operateurs kry vervang deur skofte en masker-ands. Naskrif: Ek stem saam met Olin dat jy altyd in ag moet neem eenvoudig IIR filters voor 'n bewegende gemiddelde filter. As jy dit nie nodig het die frekwensie-nulls van 'n wagon filter, sal 'n 1-paal of 2-paal laaglaatfilter waarskynlik werk boete. Aan die ander kant, as jy die filter vir die doeleindes van uitkap (neem 'n hoë-monster-koers insette en gemiddeld dit vir gebruik deur 'n lae-koers proses) dan 'n CIC filter kan wees net wat jy soek. (Veral as jy statesize1 kan gebruik en heeltemal te vermy die ringbuffer met net 'n enkele vorige integreerder waarde) Daar is 'n paar in-diepte analise van die wiskunde agter die gebruik van die eerste orde IIR filter wat Olin Lathrop reeds oor beskryf op die Digitale Seinverwerking stapel ruil (sluit baie mooi foto's.) die vergelyking vir hierdie IIR filter is: dit kan toegepas word met behulp van slegs heelgetalle en geen verdeeldheid onder die volgende kode (dalk 'n debugging nodig as ek tik uit die geheue.) hierdie filter by benadering 'n bewegende gemiddelde van die laaste K monsters deur die oprigting van die waarde van alfa tot 1 / K. Doen dit in die voorafgaande kode deur te definieer ing BITS om log2 (K), dit wil sê vir K 16 stel BITS tot 4, vir K 4 stel BITS tot 2, ens (Ill verifieer die kode hier gelys word sodra ek 'n verandering te kry en hierdie antwoord wysig indien nodig.) antwoord 23 Junie 12 aan 04:04 Hier is 'n enkel-paal laaglaatfilter (bewegende gemiddelde, met afsnyfrekwensie CutoffFrequency). Baie eenvoudig, baie vinnig, werk baie goed, en byna geen geheue oorhoofse. Let wel: Alle veranderlikes omvang buite die filter funksie, behalwe die geslaag in newInput Nota: Hierdie is 'n enkele stadium filter. Veelvuldige fases kan saam kaskade die skerpte van die filter te verhoog. As jy meer as een stadium gebruik, sal jy moet DecayFactor pas (soos verwys na die afsny-Frequency) te vergoed. En natuurlik al wat jy nodig het, is die twee lyne oral geplaas, hulle dont hul eie funksie het. Hierdie filter het wel 'n oprit-up tyd voor die bewegende gemiddelde verteenwoordig dié van die insetsein. As jy nodig het om dit oprit-up tyd omseil, kan jy net inisialiseer MovingAverage om die eerste waarde van newInput in plaas van 0, en hoop dat die eerste newInput isnt 'n uitskieter. (CutoffFrequency / SampleRate) het 'n reeks van tussen 0 en 0,5. DecayFactor is nie 'n waarde tussen 0 en 1, gewoonlik naby aan 1. Enkellopend-presisie dryf is goed genoeg vir die meeste dinge, ek verkies net dubbelspel. As jy nodig het om te hou met heelgetalle, kan jy sit DecayFactor en Amplitude Factor in fraksionele heelgetalle, waarin die teller gestoor as die heelgetal, en die deler is 'n heelgetal krag van 2 (sodat jy kan bietjie-verskuiwing na regs as die deler eerder as om te verdeel in die filter lus). Byvoorbeeld, as DecayFactor 0.99, en jy wil om heelgetalle gebruik, jy kan stel DecayFactor 0.99 65536 64881. En dan wanneer jy vermenigvuldig met DecayFactor in jou filter lus, net skuif die gevolg 16. Vir meer inligting oor hierdie, 'n uitstekende boek dis aanlyn, hoofstuk 19 op rekursiewe filters: www. dspguide / ch19.htm PS Vir die bewegende gemiddelde paradigma, 'n ander benadering tot die opstel van DecayFactor en AmplitudeFactor wat meer relevant is vir jou behoeftes kan wees, kan sê wat jy wil die vorige, sowat 6 items saam gemiddeld, doen dit strategies, youd 6 items en deel te voeg met 6, sodat jy kan die AmplitudeFactor stel om 1/6, en DecayFactor om (1.0 - AmplitudeFactor). antwoord 14 Mei 12 aan 22:55 Almal het deeglik kommentaar op die nut van IIR teen FIR, en op krag-van-twee-afdeling. ID net graag 'n paar implementering besonderhede gee. Die onderstaande werk goed op klein mikrobeheerders met geen FPU. Theres geen vermenigvuldiging, en as jy N hou 'n krag van twee, al die afdeling is enkel-siklus bietjie-verskuiwing. Basiese FIR ring buffer: hou 'n lopende buffer van die laaste N waardes, en 'n lopende som van al die waardes in die buffer. Elke keer as 'n nuwe monster kom in, trek die oudste waarde in die buffer van som, vervang dit met die nuwe monster, voeg die nuwe monster te som, en uitset som / N. Gewysig IIR ring buffer: hou 'n lopende totaal van die laaste N waardes. Elke keer as 'n nuwe monster kom in, som - som / N, voeg in die nuwe monster, en uitset som / N. antwoord 28 Augustus 13 aan 13:45 As I39m jy lees reg, you39re beskrywing van 'n eerste-orde IIR filtreer die waarde you39re trek isn39t die oudste waarde wat uitval, maar is in plaas van die gemiddelde van die vorige waardes. Eerste-orde IIR filters kan beslis nuttig wees, maar I39m nie seker wat jy bedoel wanneer jy suggereer dat die uitset is dieselfde vir alle periodiese seine. Op 'n 10kHz sample rate, voer 'n 100Hz vierkante golf in 'n 20-stadium boks filter sal 'n teken dat eenvormig styg vir 20 monsters oplewer, sit hoog vir 30, daal eenvormig vir 20 monsters, en sit laag vir 30. 'n eerste-orde IIR filter. â € supercat 28 Augustus 13 aan 15:31 sal 'n golf wat skerp begin oplewer stygende en geleidelik afplat naby (maar nie by) die maksimum insette, dan skerp begin val en geleidelik afplat naby (maar nie by) die insette minimum. Baie verskillende gedrag. â € supercat 28 Augustus 13 by 15:32 Een probleem is dat 'n eenvoudige bewegende gemiddelde mag of nie mag nuttig wees. Met 'n IIR filter, kan jy 'n lekker filter met relatief min calcs kry. Die FIR jy beskryf kan net gee jou 'n reghoek in die tyd - 'n sed in freq - en jy can39t die kant lobbe te bestuur. Dit kan die moeite werd om te gooi in 'n paar heelgetal vermeerder sodat dit 'n mooi simmetriese verstelbare FIR as jy kan spaar die klok bosluise wees. uitvoering maak Scott Seidman 29 Augustus 13 by 13:50 ScottSeidman: Nie nodig vir vermeerder as 'n mens het net elke stadium van die FIR óf uitset die gemiddelde van die insette op daardie stadium en sy vorige gestoor waarde, en dan slaan die insette (indien 'n mens die numeriese reeks, kan 'n mens die som eerder as die gemiddelde gebruik). Of that39s beter as 'n boks filter hang af van die aansoek (die stap reaksie van 'n boks filter met 'n totale vertraging van 1ms, byvoorbeeld, sal 'n nare d2 het / dt piek wanneer die insette verander, en weer 1ms later, maar sal moet die minimum moontlike d / dt vir 'n filter met 'n totale 1ms vertraging). â € supercat 29 Augustus 13 aan 15:25 Soos mikeselectricstuff gesê, as jy regtig nodig het om jou geheue behoeftes te verminder, en jy dit nie omgee jou impulsrespons om 'n eksponensiële (in plaas van 'n vierkantige pols), sou ek gaan vir 'n eksponensiële bewegende gemiddelde filter . Ek gebruik dit op groot skaal. Met hierdie tipe filter, hoef jy geen buffer nodig het. Jy hoef nie te N afgelope monsters te stoor. Slegs een. So, kry jou geheue vereistes kap met 'n faktor van N. Ook, moenie jy nodig het 'n afdeling vir daardie. Slegs vermenigvuldiging. As jy toegang tot swaai-punt rekenkundige het, gebruik swaai-punt vermenigvuldiging. Anders, doen heelgetal vermenigvuldiging en skuif na regs. Ons is egter in 2012, en ek sal u aanbeveel om opstellers (en MCUs) wat u toelaat om te werk met swaai-punt getalle gebruik. Behalwe dat meer geheue doeltreffend en vinniger (jy hoef nie te items in enige omsendbrief buffer werk), sou ek sê dit is ook meer natuurlike. omdat 'n eksponensiële impulsrespons wedstryde beter soos die natuur optree, in die meeste gevalle. antwoord 20 April 12 aan 09:59 Een probleem met die IIR filter as byna aangeraak deur Olin en supercat maar blykbaar geïgnoreer deur ander is dat die afronding af stel sommige onakkuraatheid (en potensieel vooroordeel / afkorting). veronderstelling dat N is 'n krag van twee, en net heelgetal rekenkunde gebruik word, die verskuiwing reg nie stelselmatig uit te skakel die LSBs van die nuwe monster. Dit beteken dat hoe lank die reeks ooit kon wees, die gemiddelde sal nooit neem diegene in ag neem. Byvoorbeeld, veronderstel 'n stadig afneem reeks (8,8,8. 8,7,7,7. 7,6,6,) en neem die gemiddelde is inderdaad 8 aan die begin. Die vuis 7 monster sal die gemiddelde bring tot 7, ongeag die filter sterkte. Net vir 'n monster. Dieselfde storie vir 6, ens Nou dink aan die teenoorgestelde. die reeks styg. Die gemiddelde sal bly op 7 ewig, totdat die monster is groot genoeg om dit te verander. Natuurlik, kan jy reg vir die vooroordeel deur die byvoeging van 1 / 2N / 2, maar dit sal nie regtig los die akkuraatheid probleem. In daardie geval die dalende reeks sal vir ewig bly, 8 tot en met die monster is 8-1 / 2 (N / 2). Vir N4 byvoorbeeld 'n monster bo nul sal die gemiddelde onveranderd te hou. Ek glo dat 'n oplossing vir dit sou impliseer 'n akkumulator van die verlore LSBs hou. Maar ek didnt maak dit ver genoeg om kode gereed te hê, en ek is nie seker of dit sal nie skade aan die IIR krag in sommige ander gevalle van 'n reeks (byvoorbeeld of 7,9,7,9 sal gemiddeld tot 8 dan). Olin, jou twee-stadium waterval ook sou 'n verduideliking nodig. Bedoel jy hou twee gemiddelde waardes met die uitslag van die eerste gevoer in die tweede plek in elke iterasie. Wat is die voordeel van hierdie gemiddeldes / Eenvoudige bewegende gemiddelde Gemiddeldes / Eenvoudige bewegende gemiddelde U word aangemoedig om hierdie taak op te los volgens die taakbeskrywing, die gebruik van enige taal wat jy kan weet. Berekening van die eenvoudige bewegende gemiddelde van 'n reeks van getalle. Skep 'n Stateful funksie / klas / instansie wat 'n tydperk neem en gee 'n roetine dat 'n aantal neem as argument en gee 'n eenvoudige bewegende gemiddelde van sy argumente tot dusver. 'N Eenvoudige bewegende gemiddelde is 'n metode vir die berekening van 'n gemiddelde van 'n stroom van getalle met slegs gemiddeld die afgelope 160 P 160 nommers van die stroom, 160 waar 160 P 160 is bekend as die tydperk. Dit kan toegepas word deur die roeping van 'n parafering roetine met 160 P 160 as argument, 160 I (P), 160 wat dan 'n roetine dat wanneer geroep met individuele, opeenvolgende lede van 'n stroom van getalle, bere die gemiddelde van sou terugkeer (up om), die laaste 160 P 160 van hulle, kan noem dit 160 SMA (). Die woord 160 Stateful 160 in die taak beskrywing verwys na die behoefte aan 160 SMA () 160 om sekere inligting tussen oproepe onthou om dit: 160 Die tydperk, 160 P 160 N bestel houer van ten minste die laaste 160 P 160 nommers uit elk van sy individuele oproepe. Stateful 160 beteken ook dat opeenvolgende oproepe na 160 I (), 160 die initializer, 160 moet afsonderlike roetines wat doen 160 nie 160 aandele gered staat sodat hulle kan gebruik word op twee onafhanklike strome van data terugkeer. Pseudo-kode vir die implementering van 160 SMA 160 is: Hierdie weergawe maak gebruik van 'n aanhoudende tou om die mees onlangse p waardes hou. Elke funksie teruggekeer van init-bewegende-gemiddelde het sy toestand in 'n atoom met 'n tou waarde. Dit implementering gebruik 'n omsendbrief lys om die getalle binne die venster op te slaan aan die begin van elke iterasie wyser verwys na die lys sel wat hou die waarde net beweeg by die venster uit en vervang moet word met die net toegevoegde waarde. Met behulp van 'n afsluiting wysig Tans hierdie SMA cant nogc wees omdat dit 'n sluiting op die wal ken. Sommige ontsnapping analise kan die hoop toekenning te verwyder. Met behulp van 'n struct wysig Hierdie weergawe vermy die hoop toekenning van die sluiting behoud van die data in die stapel raamwerk van die hooffunksie. Dieselfde uitset: Om te verhoed dat die drywende punt benaderings hou opstapel en die groei, kan die kode 'n periodieke som uit te voer op die hele ronde tou skikking. Dit implementering produseer twee (funksie) voorwerpe deel staat. Dit is idiomatiese in E te skei insette van uitset (lees van skryf), eerder as om dit te kombineer in een voorwerp. Die struktuur is dieselfde as die implementering van Standard DeviationE. Die onderstaande elikser program genereer 'n anonieme funksie met 'n ingeboude tydperk p, wat gebruik word as die tydperk van die eenvoudige bewegende gemiddelde. Die aanloop funksie lees numeriese insette en gee dit aan die nuutgeskepte anonieme funksie, en dan inspekteer die resultaat te STDOUT. Die uitset word hieronder getoon, met die gemiddelde, gevolg deur die gegroepeer insette, wat die basis vorm van elke bewegende gemiddelde. Erlang het sluitings, maar onveranderlike veranderlikes. 'N Oplossing is dan om prosesse en 'n eenvoudige boodskap verby gebaseer API te gebruik. Matrix tale roetines om die sweef avarages vir 'n gegewe volgorde van items bereken. Dit is minder doeltreffend te loop as in die volgende opdragte. Voortdurend gevra vir 'n inset ek. wat by die einde van 'n lys T1. T1 kan gevind word deur te druk 2ND / 1, en gemiddelde kan gevind word in Lys / OPS druk op die program te beëindig. Funksie wat 'n lys met die gemiddeld data van die verskaf argument program wat 'n eenvoudige waarde terug by elke aanroeping terug: lys is die lys word gemiddeld: p is die tydperk: 5 opbrengste die gemiddeld lys: Voorbeeld 2: Die gebruik van die program movinav2 (i , 5) - Inisialiseer bewegende gemiddelde berekening, en definieer tydperk van 5 movinav2 (3, x): x - nuwe data in die lys (waarde 3), en gevolg sal word gestoor op veranderlike x, en vertoon movinav2 (4 x) : x - nuwe data (waarde 4), en die nuwe gevolg sal gestoor word op veranderlike x, en vertoon (43) / 2. Beskrywing van die funksie movinavg: veranderlike r - is die gevolg (die gemiddeld lys) wat veranderlike sal teruggestuur word ek - is die indeks veranderlike, en dit dui op die einde van die sub-lys die lys word gemiddeld. veranderlike Z - 'n helper veranderlike Die funksie gebruik wisselende ek om vas te stel watter waardes van die lys sal in die volgende gemiddelde berekening in ag geneem word. By elke iterasie, veranderlike i dui op die laaste waarde in die lys wat gebruik sal word in die gemiddelde berekening. So ons moet net om uit te vind wat die eerste waarde in die lys sal wees. Gewoonlik goed moet p elemente oorweeg, sodat die eerste element sal die een geïndekseer deur (i-P1) te wees. Maar op die eerste iterasies wat berekening gewoonlik negatief sal wees, sodat die volgende vergelyking negatiewe indekse sal vermy: max (i-p1,1) of, reël die vergelyking, Max (i-P, 0) 1. of, reël die vergelyking, (i - (Max (IP, 0) 1) 1), en dan - maar die nommer van elemente op die eerste iterasies sal ook kleiner wees, sal die korrekte waarde (begin indeks 1 einde indeks) wees , (i-Max (IP, 0)). Veranderlike Z hou die algemene waarde (maksimum (IP), 0) sodat die beginindex sal wees (Z1) en die numberofelements sal wees (iz) die middel (lys, Z1, iz) sal die lys van waarde wat sal gemiddeld som terugkeer ( .) sal hulle som som (.) / (iz) ri hulle sal gemiddeld en stoor die resultaat in die toepaslike plek in die lys gevolg behulp van 'n sluiting en die skep van 'n functionThe Scientist en Ingenieurs Guide to Digital Signal Processing Deur Steven W. Smith, Ph. D. Soos die naam aandui, die bewegende gemiddelde filter bedryf deur gemiddeld 'n aantal punte van die insetsein aan elke punt in die uitsetsein produseer. In vergelyking vorm, dit is geskrywe: Waar is tog die insetsein, is die uitset sein, en M is die aantal punte in die gemiddelde. Byvoorbeeld, in 'n 5 punt bewegende gemiddelde filter, punt 80 in die uitsetsein word gegee deur: As 'n alternatief, kan die groep punte van die insetsein simmetries gekies om die uitset punt: Dit stem ooreen met die verandering van die opsomming in vergelyking . 15-1 van: J 0 tot M -1 aan: J - (M -1) / 2 tot (m -1) / 2. Byvoorbeeld, in 'n 10 punt bewegende gemiddelde filter, die indeks, j. kan loop 0-11 (een kant gemiddelde) of -5 tot 5 (simmetriese gemiddelde). Simmetriese gemiddelde vereis dat M wees 'n onewe getal. Programmering is 'n bietjie makliker met die punte op slegs een kant egter hierdie produseer 'n relatiewe verskuiwing tussen die inset en uitset seine. Jy moet besef dat die bewegende gemiddelde filter is 'n konvolusie gebruik van 'n baie eenvoudige filter kern. Byvoorbeeld, 'n 5 punt filter het die filter kern; 82300, 0, 1/5, 1/5, 1/5, 1/5, 1/5, 0, 08230. Dit is die bewegende gemiddelde filter is 'n konvolusie van die insetsein met 'n vierkantige pols met 'n oppervlakte van een. Tabel 15-1 toon 'n program om die bewegende gemiddelde filter implementeer.


No comments:

Post a Comment