Wednesday, October 5, 2016

Doeltreffende Moving Gemiddelde Filter

Ek het onlangs geleer het oor vordering in die antwoord op hierdie post. en het gewonder hoe ek dit kan gebruik om 'n bewegende gemiddelde filter meer doeltreffend te bereken as wat ek in hierdie pos voorgestelde (met behulp van konvolusie filters). Dit is wat ek tot dusver. Dit neem 'n blik op die oorspronklike skikking rol dit dan deur die nodige bedrag en som die kern waardes van die gemiddelde te bereken. Ek is bewus daarvan dat die kante nie korrek hanteer word nie, maar ek kan sorg van daardie daarna neem. Is daar 'n beter en vinniger manier Die doel is om 'n groot swaai punt skikkings filter tot 5000x5000 x 16 lae in grootte, 'n taak wat scipy. ndimage. filters. convolve is redelik stadig by. Let daarop dat ek is op soek na 8-buurman konneksie, dit is 'n 3x3 filter neem die gemiddelde van 9 pixels (8 regoor die brandpunt pixel) en ken wat waarde tot die pixel in die nuwe beeld. EDIT Verduideliking oor hoe ek sien dit werk: gebruik stridetricks om 'n skikking soos 0,1,2,1,2,3,2,3,4 genereer. wat ooreenstem met die boonste ry van die filter kern. Roll langs die vertikale as die middelste ry van die kern 10,11,12,11,12,13,13,14,15 kry. en voeg dit by die skikking Ek het in 1) Herhaal die onderste ry van die kern 20,21,22,21,22,23,22,23,24 kry. . Op hierdie punt, ek neem die som van elke ry en deel dit deur die aantal elemente in die filter, gee my die gemiddelde vir elke pixel, (skuif 1 ry en 1 Kol, en met 'n paar eienaardighede rondom kante, maar ek kan sorg dat later). Wat ek het gehoop vir 'n beter gebruik van stridetricks om die 9 waardes of die som van die kern elemente direk te kry, want die hele skikking, of dat iemand kan my oortuig van 'n ander meer doeltreffende metode. gevra 8 Februarie 11 van die 18:05 Want wat die moeite werd, Heres hoe youd doen dit met behulp van fancy Lopende truuks. Ek is van plan om dit gister plaas, maar het afgelei deur werklike werk. ) Paul amp eet albei mooi implementering met behulp van verskeie ander maniere om dit te doen. Net om dinge voort uit die vorige vraag, ek het gedink id post die N-dimensionele ekwivalent. Julle gaan nie in staat wees om aansienlik te klop scipy. ndimage funksies vir 1D skikkings egter. (Scipy. ndimage. uniformfilter moet scipy. ndimage. convolve al klop.) Verder, as jy probeer om 'n multi-dimensionele bewegende venster te kry, jy die risiko om geheue gebruik blaas wanneer jy per ongeluk 'n afskrif van jou reeks te maak. Terwyl die aanvanklike rollende skikking is net 'n blik op die geheue van jou oorspronklike skikking, sal enige intermediêre stappe wat die skikking kopieer 'n afskrif wat ordes groter as die oorspronklike skikking te maak (dit wil sê Kom ons sê dat jy werk met 'n 100x100 oorspronklike skikking . die siening daarin (vir 'n filter grootte van (3,3)) sal wees 98x98x3x3 maar gebruik dieselfde geheue as die oorspronklike. dit sal egter geen kopieë van die hoeveelheid geheue Eintlik gebruik dat 'n volledige 98x98x3x3 verskeidenheid sou), die gebruik van Crazy kruizen truuks is ideaal vir wanneer jy wil Vectorize beweeg venster beheer oor 'n enkele as van 'n ndarray. Dit maak dit baie maklik om dinge te bereken soos 'n bewegende standaardafwyking, ens met baie min oorhoofse. As jy wil om te begin om dit te doen saam verskeie byle, die moontlike, maar jy gewoonlik beter daaraan toe met meer gespesialiseerde funksies. (. Soos scipy. ndimage ens) In elk geval, hier is hoe jy dit doen: So, wat ons kry wanneer ons dit doen b rollingwindow (a, filtsize) is 'n 8x8x3x3 skikking, dis eintlik 'n blik op dieselfde geheue as die oorspronklike 10x10 skikking. Ons kon net so maklik gebruik verskillende filter grootte langs verskillende asse of bedryf net langs gekies asse van 'n N-dimensionele skikking (dws filtsize (0,3,0,3) op 'n 4-dimensionele skikking vir ons 'n 6-dimensionele siening sou gee ). Ons kan dan 'n arbitrêre funksie is van toepassing op die laaste as herhaaldelik om effektief te bereken dinge in 'n bewegende venster. Maar omdat tydelike skikkings wat baie groter as ons oorspronklike skikking op elke stap van die gemiddelde (of std of wat ook al) is is die stoor, dit is glad nie geheue doeltreffend Dit is ook nie van plan verskriklik vinnig te wees, óf. Die ekwivalent vir ndimage is net: Dit sal 'n verskeidenheid van randvoorwaardes te hanteer, doen die vervaag in-plek sonder dat 'n tydelike kopie van die skikking, en baie vinnig. Kruizen truuks is 'n goeie manier om 'n funksie is van toepassing op 'n bewegende venster langs een as, maar hulle is nie 'n goeie manier om dit te doen saam verskeie byle gewoonlik. Net my 0,02, in elk geval. Baie goed gestel: Kruizen truuks is 'n goeie manier om 'n funksie is van toepassing op 'n bewegende venster langs een as, maar they39re nie 'n goeie manier om dit te doen saam verskeie byle gewoonlik. En natuurlik jou verduideliking van die geheue 39blow up39 is belangrike een. Soort opsomming van jou antwoord (ten minste vir my) is: 39don39t te ver gaan visvang, die quarenteed vangs is nou al in scipy39. Dankie uitvoering eet 9 Februarie 11 van die 16:37 Dankie, Joe, vir hierdie antwoord. In rollingwindow moet die as nie hasattr (.): Terugkeer rollingwindowlastaxis eerder as rollingwindow (.). â € unutbu 12 Februarie 11 van die 16:47 Ek is nie genoeg vertroud is met Python uitskryf kode vir dit nie, maar die twee beste maniere om te bespoedig konvolusie is om óf afsonderlike die filter of gebruik die Fourier-transform. Geskei filter. Konvolusie is O (MK), waar M en N is aantal pixels in die beeld en die filter, onderskeidelik. Sedert gemiddelde filter met 'n 3-deur-3 kern is gelykstaande aan die eerste met 'n 3-deur-1 kern en dan 'n 1-vir-3 kern filter, kan jy (33) / (33) 30 spoed verbetering deur opeenvolgende konvolusie met twee 1-D pitte (dit natuurlik raak beter as die kern groter word). Jy kan nog steeds in staat wees om tred truuks hier gebruik, natuurlik. Fourier-transform. conv (A, B) is gelykstaande aan ifft (FFT (A) FFT (B)). maw 'n konvolusie in direkte ruimte word 'n vermenigvuldiging in Fourier ruimte, waar A jou beeld en B is jou filter. Sedert die (element-wyse) vermeerdering van die Fourier-transforms vereis dat A en B is dieselfde grootte, B is 'n verskeidenheid van grootte (A) met jou kern by die middelpunt van die beeld en nulle oral anders. Om 'n 3-deur-3 kern in die middel van 'n verskeidenheid plaas, moet jy dalk pad A tot vreemde grootte. Afhangende van jou implementering van die Fourier-transform, kan dit 'n baie vinniger as die konvolusie wees (en as jy dieselfde filter verskeie kere aansoek doen, kan jy vooraf bereken FFT (B). Spaar nog 30 van berekening tyd). beantwoord 9 11 Februarie om 15:27 Jonas: Cool Die Seperated filter benadering werk mooi, as jy sê dit spaar meer tyd as die kern grootte toeneem. Vir 'n 5000x5000 skikking, op 'n 11x11 pitgrootte, kry ek 7.7s vir 2d konvolusie gebruik van ndimage. convolve, en 2.0s vir twee 1d konvolusie gebruik van ndimage. convolve1d. Vir jou tweede oplossing wat B uitvoering Benjamin 9 Februarie 11 by 16:02 Een ding wat ek is vol vertroue behoeftes bepaal moet word is jou siening verskeidenheid b. Dit het 'n paar items uit ongeallokeerde geheue, sodat jy kry ineenstort. Gegewe jou nuwe beskrywing van jou algoritme, die eerste ding wat vasstelling nodig het, is die feit dat jy lang treë buite die toekenning van 'n: Omdat Im nog nie heeltemal gryp die metode en dit lyk asof daar makliker maniere om die probleem op te los nie, Im net gaan hierdie hier sit wat net lyk asof die eenvoudige benadering. Die enigste vreemde werking is dat dit toe te ken en te vul B slegs een keer. Al die toevoeging, verdeeldheid en kruip het om ongeag gedoen. As jy doen 16 bands, nog net wat jy nodig het om B keer toeken as jou bedoeling is om 'n beeld te red. Selfs al is dit nie help, kan dit verduidelik waarom ek nie die probleem te verstaan, of ten minste dien as 'n maatstaf om die speedups van ander metodes tot tyd. Dit loop in 2.6 sekondes op my laptop op 'n 5k x 5k verskeidenheid van float64s, 0,5 waarvan die skepping van B beantwoord 8 Februarie 11 van die 19:31 Dit is nie so duidelik vorm jou vraag, maar ek neem aan noudat youll wil verbeter aansienlik hierdie soort gemiddelde. Nou, watter soort prestasie verbeterings wat jy sou eintlik verwag Update: In die eerste plek, 'n waarskuwing: die kode in sy huidige toestand nie behoorlik aan te pas by die kern vorm. Maar dis nie my grootste bekommernis nou (in elk geval die idee is daar nou al hoe om behoorlik te pas). Ek het nou net gekies die nuwe vorm van 'n 4D n intuïtief, vir my is dit regtig sin maak om te dink oor 'n 2D kern sentrum word gesentreer om elke rooster posisie van oorspronklike 2D A. Maar dit 4D vorming kan nie eintlik die beste een. Ek dink die werklike probleem hier is die prestasie van optel. Een moet in staat wees om die beste orde (van die 4D a) Vind inorde jou masjiene kas argitektuur ten volle te benut. Maar daardie volgorde mag nie dieselfde vir klein skikkings watter soort wees werk saam met jou masjiene kas en diegene groter kinders, wat Dont (ten minste nie so eenvoudige manier). Werk 2: Hier is 'n effens aangepaste weergawe van MF. Dit is duidelik dat dit beter is om te hervorm tot 'n 3D verskeidenheid eerste en dan in plaas van optel, net doen puntproduk (dit het die voordeel al so, dat kern kan willekeurig wees). Maar dit is nog steeds 'n paar 3x stadiger (op my rekenaar) as Pauls opgedateer funksie. beantwoord 8 Februarie 11 van die 19: 33Community Op: 14 Augustus 2013 12:56 deur SamHorst - Last Modified: 14 Augustus 2013 12:58 deur SamHorst Implementering van 'n doeltreffende, bewegende gemiddelde filter in LabVIEW FPGA Track / Summit: Embedded stelsels Abstract: Baie ingeboude beheer en monitering stelsels ly lawaaierige sensor data, om die funksie en die akkuraatheid van die stelsel in gevaar stel. Noisy sensor data kan stryk met behulp van bewegende gemiddelde filters, maar die implementering van sulke filters op 'n CompactRIO stelsel met FPGA en beperkte hulpbronne kan wees uitdagend. Vind die uitdagings en stappe vir die bereiking van 'n doeltreffende-FPGA-gebaseerde bewegende gemiddelde filter algoritme. Kyk na die LabVIEW FPGA-kode in detail en bespreek tegnieke om te help met die bewaring van hulpbronne. Spreker (s): Neville Dholoo, Advanced Metings Inc. As ander genoem het, jy moet '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 Im nie certainn van die korrekte oplossing al sedert die WHALM gemiddeld van elke monster sou 'n billike bedrag van afronding fout te stel. Hmm. Ek wonder of verskil tussen Dobby die breukdeel van die hele gedeelte sal help. Verdeel die hele deel van elke getal met die telling. Hou drie hardloop somme: 1) Die gemiddelde van die hele dele, 2) Die res van elke afdeling, en 3) Die breukdeel van elke nommer. Elke keer as die hele deel van 'n aantal verdeeld is, word die hele deel gevolg by die gemiddelde hardloop som en die res word bygevoeg om die res loop som. Wanneer die res loop som verkry 'n waarde groter as of gelyk aan die telling, sy gedeel deur die telling met die hele deel gevolg by die gemiddelde hardloop som en die res by die res loop som. Ook by elke berekening, die breukdeel word by die fraksionele hardloop som. Wanneer die gemiddelde klaar is, is die res loop som gedeel deur die telling en die gevolg is bygevoeg om die gemiddelde hardloop bedrag as 'n drywende nommer. Byvoorbeeld: Nou wat om te doen met die fraksionele hardloop som. Die gevaar van oorloop is baie minder geneig hier, al is steeds moontlik, so 'n manier om dit te hanteer sou wees om die fraksionele hardloop som deur die telling te verdeel aan die einde en voeg dit by ons gevolg: 'n alternatief sou wees om die fraksionele loop kyk som op elke berekening om te sien of dit is groter as of gelyk aan tel. Wanneer dit gebeur, net doen dieselfde ding wat ons doen met die res loop som. Uitstekende Jomit Vaghela 6-Maart-07 20:00 ek hou van wat jy gesê het klein werk vinnig draai in 'n groot werk. Dink van optimalisering terwyl kodering is 'n goeie praktyk. Groot moeite en verduideliking, Dankie Mike DiRenzo 5-Maart-07 15:26 Dit is die eerste keer dat ek het gereageer op een van jou artikels. Ek is egter 'n baie ywerige leser. Terwyl hy in die kollege, het ek tot geweegde bewegende gemiddeldes en eenvoudiges sowel bereken. Heck, ek het selfs 'n paar van my eie bewegende gemiddelde algoritmes skep in 'n persoonlike ERP implementering 'n ruk gelede op grond van 'n paar van dieselfde formules ek geleer in Operasionele 101. Maar dit implementering, met behulp van Generiese ver oorskadu alles in terme van die optimalisering, eenvoud, en darn reg koelte. Thanks a lot vir hierdie. Een van jou baie aanhangers, In stil en stilte, is die waarheid duidelik gemaak. ewma gobgob 5-Maart-07 04:30 As jou probeer om 'n eenvoudige bewegende gemiddelde te bereken, moet jy 'n versameling, wat is baie kompleks vir so 'n eenvoudige taak te hou. Hoe gaan dit met behulp van 'n ewma Die 2 lyne kode, baie meer eenvoudig. Alpha exp (-elapsedTimeSinceLastValue) ewma Alpha ewma (1-alfa) newValue Re: ewma Marc Clifton 5-Maart-07 04:47 Hoe gaan dit met behulp van 'n ewma interessante idee. Vir lesers wat nie weet wat 'n ewma is, sy 'n eksponensiële Geweegde bewegende gemiddelde. Mense is net berug onmoontlik. --DavidCrow Theres geen verskoning om nie kommentaar te lewer jou kode. - John Simmons / skelm programmeerder mense wat sê dat hulle hul kode later sal refactor om vergoeding te gee nie verstaan ​​refactoring, of die kuns en kunsvlyt van programmering. - Josh Smith Re: ewma pwasser 5-Maart-07 00:21 'n skatting van die bewegende gemiddelde as die grootte van die ruimte vir bewegende gemiddelde is N kan verkry word deur: NewAverage (((N-1) OldAverage) newValue) / n dit werk sodra die bin is vol (monster nommer N). Die bin gedeeltelik vol is dikwels hanteer word deur die gebruik van 'n saad waarde vir die eerste bewegende gemiddelde (OldAverage) en dan met behulp van hierdie berekening. Dit veronderstel normale verspreiding van waardes ens Youve is besig Colin Angus Mackay 4-Mar-07 11:37 Plaas twee artikels vanaand. Groot werk Ek weet nie hoe jy dit doen. Ive het ongeveer 4 of 5 artikels helfte klaar en ek het net nooit skyn om die tyd om dit te voltooi te kry. Wel. Miskien as ek gebly het, uit die sitkamer id bestuur. Re: youve besig Marc Clifton 4-Mar-07 13:25 Colin Angus Mackay het geskryf: Pos twee artikels vanaand. Groot werk dankie ek was eintlik die skryf van die artikel oor die loop gemiddelde en besef dat die omsendbrief lys eintlik 'n baie goeie stand-alone artikel sou wees. Plus, hulle is liggewig artikels. Ek kan hulle slinger uit redelik vinnig. Dit is net moeilik om te dink aan nuttig, maar eenvoudige dinge. Turns out ek hierdie twee klasse nodig anyways. Mense is net berug onmoontlik. --DavidCrow Theres geen verskoning om nie kommentaar te lewer jou kode. - John Simmons / skelm programmeerder mense wat sê dat hulle hul kode later sal refactor om vergoeding te gee nie verstaan ​​refactoring, of die kuns en kunsvlyt van programmering. - Josh Smith Re: youve besig JeffPClark 8-Maart-07 00:07 Van wat Ive lees van Marc, het hy waarskynlik 'n program wat 'n stuk kode kan ondersoek en verduidelik die ingewikkelde besonderhede, dan laat dit reguit na Kode Projek . Jeff Clark stelselargitek JP Clark, INC Columbus, Ohio Laaste besoek:. 31-Desember-99 18:00 Laaste wysiging: 7-Oktober-16 04:25 Algemene Nuus Voorstelle Vraag Probleem Antwoord Joke Prys Rant Admin Gebruik Ctrl Linker / regs te skakel boodskappe, CtrlUp / Down om drade te skakel, CtrlShiftLeft / regs te skakel pages. The bewegende gemiddelde as 'n Filter die bewegende gemiddelde is dikwels gebruik vir glad data in die teenwoordigheid van ruis.


No comments:

Post a Comment