Tuesday, October 18, 2016

Bewegende gemiddelde vs laaglaatfilter

Frekwensie van die lopende gemiddeld Filter Die frekwensieweergawe van 'n LTI stelsel is die DTFT van die impulsrespons, Die impulsrespons van 'n L - sample bewegende gemiddelde is sedert die bewegende gemiddelde filter is FIR, die frekwensieweergawe verminder om die eindige som Ons kan die baie nuttig identiteit gebruik om die frekwensie reaksie as waar ons toelaat dat AE minus jomega skryf. N 0, en M L minus 1. Ons kan belangstel in die omvang van hierdie funksie word ten einde te bepaal watter frekwensies te kry deur middel van die filter unattenuated en wat verswakte. Hier is 'n plot van die omvang van hierdie funksie lyk, vir L 4 (rooi), 8 (groen) en 16 (blou). Die horisontale as wissel van nul tot pi radiale per monster. Let daarop dat in al drie gevalle, die frekwensieweergawe het 'n laagdeurlaat kenmerk. 'N konstante komponent (nul frekwensie) in die insette gaan deur die filter unattenuated. Sekere hoër frekwensies, soos pi / 2, is heeltemal uitgeskakel word deur die filter. Maar, as die bedoeling was om 'n laagdeurlaatfilter ontwerp, dan het ons nie baie goed gedoen. Sommige van die hoër frekwensies is verswakte net met 'n faktor van ongeveer 1/10 (vir die 16 punt bewegende gemiddelde) of 1/3 (vir die vier punt bewegende gemiddelde). Ons kan baie beter as dit doen. Bogenoemde plot is geskep deur die volgende Matlab kode: omega 0: pi / 400: pi H4 (1/4) (1-exp (-iomega4)) ./ (1-exp (-iomega)) H8 (1/8 ) (1-exp (-iomega8)) ./ (1-exp (-iomega)) H16 (1/16) (1-exp (-iomega16)) ./ (1-exp (-iomega)) plot (omega , ABS (H4) ABS (H8) ABS (H16)) as (0, PI, 0, 1) Kopiereg kopie 2000- - Universiteit van Kalifornië, BerkeleyIm kodering iets op die oomblik waar Im neem van 'n klomp van die waardes met verloop van tyd van 'n hardeware kompas. Dit kompas is baie akkuraat en updates dikwels, met die gevolg dat as dit effens jiggles, ek eindig met die vreemde waarde dis wild teenstrydig is met sy bure. Ek wil daardie waardes uit te stryk. Nadat 'n lesing oor gedoen, wil dit voorkom of wat ek wil hê, is 'n hoë-pass filter, 'n laaglaatfilter of 'n bewegende gemiddelde. Bewegende gemiddelde wat ek kan kry af met, hou net 'n geskiedenis van die afgelope 5 waardes of wat ook al, en gebruik die gemiddelde van die waardes stroomaf in my kode waar ek was eens net die gebruik van die mees onlangse waarde. Dit moet, dink ek, glad diegene jiggles mooi, maar dit lyk my dat sy waarskynlik redelik ondoeltreffend, en dit is waarskynlik een van daardie bekende probleme te Behoorlike programmeerders wat 'n baie netjiese Clever Wiskunde oplossing Theres. Ek is egter een van daardie aaklige selfopgeleide programmeerders sonder 'n greintjie van formele onderwys in enigiets wat selfs vaagweg verwant aan CompSci of Wiskunde. Lees 'n bietjie rond dui daarop dat dit 'n hoë of laaglaatfilter kan wees, maar ek kan nie enigiets wat verduidelik in terme verstaanbaar 'n hack soos ek wat die uitwerking van hierdie algoritmes sal wees op 'n verskeidenheid van waardes te vind, wat nog te sê hoe die wiskunde werk. Die antwoord hier gegee. byvoorbeeld tegnies nie beantwoord my vraag, maar slegs in terme verstaanbaar aan diegene wat waarskynlik reeds sal weet hoe om die probleem op te los. Dit sou 'n baie mooi en slim persoon inderdaad wat die soort van probleem is dit kan verduidelik word, en hoe die oplossings werk, in terme verstaanbaar vir 'n Kuns gegradueerde. gevra September 21 10 In 13:01 As jou bewegende gemiddelde het 'n lang ten einde die vereiste glad te bereik te wees, en jy dit nie regtig nodig het 'n besondere vorm van kern, dan is jy beter af as jy gebruik 'n eksponensieel verrottende bewegende gemiddelde: waar jy kies klein om 'n geskikte konstante wees (bv as jy kies klein 1- 1 / n, sal dit dieselfde hoeveelheid gemiddeld as 'n venster van grootte n hê, maar anders versprei oor ouer punte). In elk geval, sedert die volgende waarde van die bewegende gemiddelde hang net af van die vorige een en jou data, jy hoef nie 'n tou of iets hou. En jy kan dink dit as iets te doen soos, wel, Ive het 'n nuwe punt, maar ek dont regtig vertrou nie, so ek is van plan om te hou 80 van my ou skatting van die meting en net vertrou dat hierdie nuwe data punt 20. Dis pretty much dieselfde as om te sê: goed, ek het net hierdie nuwe punt 20, en ek sal gebruik 4 ander punte wat ek vertrou dieselfde hoeveelheid vertrou nie, behalwe dat in plaas van uitdruklik neem die 4 ander punte, jy neem aan dat die gemiddeld jy het die vorige keer was verstandig, sodat jy jou vorige werk kan gebruik. antwoord 21 September 10 In 14:27 Hey, ek weet dit is 5 jaar laat, maar dankie vir 'n awesome antwoord. I39m besig met 'n spel waar die klankveranderings wat gebaseer is op jou snelheid, maar as gevolg van die bestuur van die spel op 'n stadige-ass rekenaar, sal die spoed wild wissel, wat goed vir stuur, maar super irriterende in terme van klank was. Dit was 'n baie eenvoudige en goedkoop oplossing vir iets wat ek gedink het sou 'n baie komplekse probleem wees. â € Adam 16 Maart 15 by 20:20 As jy probeer om so af en toe vreemd waarde te verwyder, 'n laaglaatfilter is die beste van die drie opsies wat jy geïdentifiseer het. Lae-pass filters toelaat lae-spoed verander soos dié veroorsaak deur roterende n kompas met die hand, terwyl die verwerping van 'n hoë-spoed verander soos dié veroorsaak deur knoppe op die pad, byvoorbeeld. 'N bewegende gemiddelde sal waarskynlik nie voldoende wees nie, aangesien die gevolge van 'n enkele skans in jou data sal beïnvloed verskeie daaropvolgende waardes, afhangende van die grootte van jou bewegende gemiddelde venster. As die vreemde waardes maklik opgespoor kan jy selfs beter daaraan toe met 'n probleem-verwydering algoritme wat hulle heeltemal ignoreer nie: Hier is 'n guick grafiek om te illustreer: Die eerste grafiek is die insetsein, met een onaangename probleem. Die tweede grafiek toon die effek van 'n 10-monster bewegende gemiddelde. Die finale grafiek is 'n kombinasie van die 10-monster gemiddelde en die eenvoudige probleem opsporing algoritme hierbo getoon. Wanneer die glitch bespeur word, is die 10-monster gemiddelde gebruik in plaas van die werklike waarde. antwoord 21 September 10 by 13:38 Mooi verduidelik, en bonus punte vir die grafiek) uitvoering maak Henry Cooke 22 September 10 by 00:50 Sjoe. Selde gesien so 'n mooi antwoord uitvoering maak Muis 4 Junie 13 by 09:14 Die bewegende gemiddelde is 'n laaglaatfilter. â € naam 21 Oktober 13 aan 19:36 Probeer 'n lopende / streaming mediaan plaas. â € Kert 25 April 14 by 22:09 Moving gemiddelde ek kan kry af met. maar dit lyk my dat sy waarskynlik redelik ondoeltreffend. Theres werklik geen rede om 'n bewegende gemiddelde moet ondoeltreffende wees. Jy hou die aantal datapunte wat jy wil in 'n buffer (soos 'n omsendbrief tou). Op elke nuwe data punt, pop jy die oudste waarde en trek dit uit 'n som, en stoot die nuutste en voeg dit by die som. Daarop trek al die nuwe data punt werklik behels net 'n pop / druk, 'n toevoeging en 'n aftrek. Jou bewegende gemiddelde is altyd hierdie verskuiwing som gedeel deur die aantal waardes in jou buffer. Dit raak 'n bietjie moeiliker as jy data gelyktydig ontvang van verskeie drade, maar aangesien jou data is afkomstig van 'n hardeware toestel wat hoogs onwaarskynlik lyk vir my. Ag, en ook: aaklige selfopgeleide programmeerders verenig) Die bewegende gemiddelde leek ondoeltreffende vir my, want jy het 'n buffer van waardes te stoor - beter om net te doen 'n paar slim Wiskunde met jou insette waarde en huidige werking waarde Ek dink that39s hoe eksponensiële bewegende gemiddelde werk. 'N optimalisering I39ve gesien vir hierdie soort van bewegende gemiddelde behels die gebruik van 'n vaste-lengte tou amp 'n wyser na die plek waar jy is in die sin dat tou, en net wikkel die wyser rondom (met of as). Voila Geen duur stoot / pop. Vermoë doen om die amateurs, broer uitvoering Henry Cooke 22 September 10 by 00:54 Henry: Vir 'n reguit-up bewegende gemiddelde wat jy doen moet die buffer net sodat jy weet watter waarde kry inloer wanneer die volgende waarde kry gestoot. Dit gesê, die quotfixed-lengte tou amp n pointerquot jy beskryf is presies wat ek bedoel met quotcircular queue. quot That39s waarom ek gesê het dit ondoeltreffend isn39t. Wat dink jy ek bedoel En as jou antwoord is quotan skikking wat sy waardes terug op elke geïndekseer removalquot (soos std :: vektor in C) verskuif. Wel, dan, I39m so seer ek don39t selfs wil met jou praat nie) uitvoering maak Dan Tao 22 September 10 In 01:58 Henry: Ek don39t weet AS3, maar 'n Java programmer39s het versamelings soos CircularQueue op sy / haar beskikking (I39m nie 'n Java ontwikkelaar so I39m seker daar is beter voorbeelde daar buite that39s net wat ek gevind van 'n vinnige Google-soektog), wat presies die funksie we39re praat implemente. I39m redelik vol vertroue dat die meerderheid van medium - en lae-vlak tale met standaard biblioteke het iets soortgelyks (bv in there39s QueueltTgt). In elk geval, ek was filosofie myself, so. al is vergewe. â € Dan Tao 22 September 10 by 12:44 'n eksponensieel verrottende bewegende gemiddelde kan bereken word met die hand met net die tendens as jy die regte waardes te gebruik. Sien www. fourmilab. ch/hackdiet/e4/ vir 'n idee oor hoe om dit vinnig te doen met 'n pen en papier as jy op soek is na eksponensieel stryk bewegende gemiddelde met 10 smoothing. Maar aangesien jy 'n rekenaar, het jy waarskynlik wil doen binêre verskuiwing in teenstelling met desimaal verskuiwing) Op hierdie manier, al wat jy nodig het is 'n veranderlike vir jou huidige waarde en een vir die gemiddelde. Die volgende gemiddelde kan dan bereken word uit daardie. antwoord 21 September 10 In 14:39 Theres 'n tegniek bekend as 'n reeks hek wat goed werk met 'n lae-voorkoms onwaar monsters. aanvaarding van die gebruik van een van die bogenoemde filter tegnieke (bewegende gemiddelde, eksponensiële), sodra jy voldoende geskiedenis (een tydkonstante) jy kan toets die nuwe, inkomende data monster vir redelikheid, voordat dit by die berekening het. 'n bietjie kennis van die maksimum redelike tempo-van-verandering van die sein word vereis. die rou monster in vergelyking met die mees onlangse stryk waarde, en as die absolute waarde van daardie verskil is groter as die toegelate gebied, is daardie monster uitgegooi (of vervang met 'n paar heuristiese, bv. 'n voorspelling gebaseer op helling ewenaar of die tendens voorspellingswaarde van dubbele eksponensiële gladstryking) antwoord 30 April by 6: 56A bewegende gemiddelde filter gemiddeldes n aantal insette monsters en produseer 'n enkele uitset monster. Dit gemiddelde aksie verwyder die hoë frekwensie komponente teenwoordig is in die sein. Bewegende gemiddelde filters word gewoonlik gebruik as 'n lae slaagsyfer filters. In rekursiewe filter algoritme, vorige uitset monsters ook geneem word vir 'n gemiddelde. 'N bewegende gemiddelde filter gemiddeldes n aantal insette monsters en produseer 'n enkele uitset monster. Dit gemiddelde aksie verwyder die hoë frekwensie komponente teenwoordig is in die sein. Bewegende gemiddelde filters word gewoonlik gebruik as 'n lae slaagsyfer filters. In rekursiewe filter algoritme, vorige uitset monsters ook geneem word vir 'n gemiddelde. Dit is die rede waarom sy impulsrespons strek tot in die oneindige. Hoe om die monster program Die Zip lêer bevat beide bronkode en uitvoerbare gebruik. Om saam te stel en uit te voer die bron-kode wat jy nodig het om te hê Visual Basic 6.0 geïnstalleer op jou rekenaar. Om die uitvoerbare loop, moet jy dit aflaai en installeer Visual Basic 6.0 runtime lêers. Begin movavgfilt. exe en jy sal die hoof venster sien. In die hoof venster. die top grootste deel is die funksie kragopwekker. wat verskillende golfvorms produseer om die filter te toets. Ons kan interaktief verander die amplitude, frekwensie en vorm van die gegenereerde sein. Om die program moet ons eers 'n toepaslike golfvorm te genereer toets. Hier sal ons 'n komplekse golfvorm wat bestaan ​​uit twee verskillende frekwensies te genereer. Laat alles in standaard instellings en klik quotgeneratequot knoppie. Nou kan jy 'n 10 Hz sein in die grafiek sien langs die seingenerator. figuur hieronder toon die golfvorm. Nou verander die frekwensie 100 Hz en klik knoppie quotgeneratequot weer. Die nuut-gegenereerde golfvorm word by die bestaande golfvorm en gevolglike golfvorm lyk soos 'n 10Hz sonde golf met 100 Hz geraas. Sien die golfvorm hieronder. Dit golfvorm is die beste geskik is vir die toets van die filter, aangesien dit bestaan ​​uit twee verskillende frekwensies. Jy kan die filter loop deur op die quotFilterquot knoppie. Van die opsies wat beskikbaar is van links na die knoppie quotFilterquot. jy kan kies Rekursiewe, nie-rekursiewe filter of geen filter glad. Die onderstaande figuur toon die opbrengs van die filter. Aflaai Moving Gemiddelde Filter bron codeMoving Gemiddelde Filter (MA filter) laai. Die bewegende gemiddelde filter is 'n eenvoudige Low Pass FIR (Eindige Impulse Response) filter wat algemeen gebruik word vir glad 'n verskeidenheid van monsters data / sein. Dit neem M monsters van insette op 'n tyd en neem die gemiddelde van die M-monsters en produseer 'n enkele uitset punt. Dit is 'n baie eenvoudige LPF (laaglaatfilter) struktuur wat handig te pas kom vir wetenskaplikes en ingenieurs om ongewenste lawaaierige komponent filter van die beoogde data. As die filter lengte toeneem (die parameter M) die gladheid van die uitset verhoog, terwyl die skerp oorgange in die data gemaak word toenemend stomp. Dit impliseer dat die filter het 'n uitstekende tyd domein reaksie, maar 'n swak frekwensieweergawe. Die MA filter voer drie belangrike funksies: 1) Dit neem M insette punte, bere die gemiddelde van die M-punte en produseer 'n enkele uitset punt 2) As gevolg van die berekening / berekeninge betrokke. die filter stel 'n definitiewe bedrag van die vertraging 3) Die filter dien as 'n laaglaatfilter (met 'n swak frekwensiedomein reaksie en 'n goeie tyd domein reaksie). Matlab Kode: Na aanleiding van Matlab kode simuleer die tydgebied reaksie van 'n M-punt bewegende gemiddelde filter en ook plotte die frekwensieweergawe vir verskeie filter lengtes. Tyd Domain Reaksie: Op die eerste plot, ons het die insette wat gaan in die bewegende gemiddelde filter. Die insette is raserig en ons doel is om die geraas te verminder. Die volgende figuur is die uitset reaksie van 'n 3-punt bewegende gemiddelde filter. Dit kan afgelei word uit die figuur dat die 3-punt bewegende gemiddelde filter nie veel in die filter van die geraas gedoen het. Ons verhoog die filter krane tot 51-punte en ons kan sien dat die geraas in die uitset baie, wat uitgebeeld word in die volgende figuur verminder. Ons verhoog die krane verder tot 101 en 501 en ons kan waarneem dat selfs-al die geraas is amper nul, die oorgange is drasties afgestomp uit (kyk na die helling op die weerskante van die sein en vergelyk kan word met die ideale baksteenmuur oorgang in ons insette). Frekwensie: Van die frekwensieweergawe dit kan beweer dat die roll-off is baie stadig en die stop orkes verswakking is nie goed nie. Gegewe hierdie stop-band attenuasie, duidelik, die bewegende gemiddelde filter kan nie een band van frekwensies van 'n ander te skei. Soos ons weet dat 'n goeie vertoning in die tydgebied resultate in 'n swak vertoning in die frekwensiedomein, en omgekeerd. In kort, die bewegende gemiddelde is 'n buitengewoon goeie glad filter (die aksie in die tydgebied), maar 'n besonder slegte laaglaatfilter (die aksie in die frekwensiedomein) Eksterne skakel: aanbevole boeke: Primêre SidebarAs 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


No comments:

Post a Comment