Sunday 29 October 2017

Liukuva Keskiarvo C Koodi Avr


Olen kokeillut muutamia juoksevia keskiarvotekniikoita, jotka heikentävät ADC-tietojen muutoksia AtMega48: ssa valojen (PWM) ohjaamiseen potin (ADC) kiertämisen aikana. Suodattimet (pseudokoodit): Huomasin, että suodattimet ovat erittäin mukavia. Mutta hidas vaste, jota odotetaan. Etsin tekniikoita kuten eksponentiaalinen liukuva keskiarvo. Sanottiin olevan herkempi. Onko olemassa toinen tällainen Kuten sanoo: missä on välillä 0 ja 1. Kuinka koodata ja optimoida nämä koodi viisas (ilman kellukkeita) Tai Miten voin muuntaa kellukkeet vastaaviin kokonaislukuihin, jotta koodi pieni, nopea ja reagoiva yksi. ja pidin 1 muu sitten, että se ei toimi odotetusti. Koska Idve muuttaa kaikki muuttujat kellumaan. Älä keskity nyt seuraaviin ilmoituksiin, vaan huomaa. Pakettien pitäminen koodipohjallani täyttää ohjelmamuistin 45: stä 137: een, mikäli voit toteuttaa minimipään ylärajan rajoittamalla binäärisiin jakeisiin. Olen käyttänyt tätä hyvällä tuloksella. Käytä nykyistä tulosta, Siirrä se N paikka oikealle jaa 2N vähennä nykyisestä tuloksesta. Lisää uusia tietoja Tämä ei ole yhtä nopea muuttuessa syöttötietojen askelvaiheessa kuin haluatte, mutta se on helppo toteuttaa ja tehokkaasti suodattimena monissa tapauksissa. Voit nopeuttaa vastaustasi tekemällä epävirallisia päätöksiä sen käyttäytymisestä liian erilaisissa tapauksissa. esim. ylläpitää peräkkäisten tulojen lukumäärää, jotka ylittävät jonkin verran eri kuin nykyinen tulos. Jos tämä määrä ylittää jonkin verran kynnysarvon, muuta N-jakauman suhdetta joissakin tekijöissä. esim. N on yleensä 4- tulokset siirretään oikealle 4 kertaa 16 jakamalla. Jos panos on enemmän kuin xxx pois vastauksesta, tee vain kaksi siirtymää oikealle ja lisää uusi näyte 4: llä ennen lisäystä. Vastaus 4 lokakuuhun, 12, 6: 08Muut muut ovat maininneet, sinun on harkittava IIR (ääretön impulssivaste) suodatin sen sijaan, että käytät nykyistä FIR (äärellistä impulssivaste) - suodatinta. Siitä on enemmän, mutta ensisilmäyksellä FIR-suodattimet toteutetaan eksplisiittisina konvoluuteina ja IIR-suodattimina yhtälöillä. Erityinen IIR-suodatin, jota käytän paljon mikrokontrollereissa, on yksi napainen alipäästösuodatin. Tämä on yksinkertainen R-C-analoginen suodatin digitaalinen ekvivalentti. Useimmissa sovelluksissa niillä on paremmat ominaisuudet kuin käyttämäsi laatikkosuodattimen. Suurin osa käyttämistäsi laatisuodattimista on seurausta siitä, että joku ei kiinnitä huomiota digitaaliseen signaalinkäsittelyluokkaan, ei sen vuoksi, että he tarvitsisivat erityisiä ominaisuuksia. Jos haluat vain heikentää korkeita taajuuksia, jotka tiedät ovat melua, yhden napainen alipäästösuodin on parempi. Paras tapa toteuttaa yksi digitaalisesti mikrokontrolleriin on yleensä: FILT lt - FILT FF (NEW - FILT) FILT on pala pysyvästä tilasta. Tämä on ainoa pysyvä muuttuja, jonka sinun on laskettava tämä suodatin. NEW on uusi arvo, jota suodatin päivitetään tällä iteroinnilla. FF on suodatinfraktio. joka säätää suodattimen raskautta. Katso tämä algoritmi ja katso, että FF 0: ssä suodatin on äärettömän raskas, koska tuotos ei koskaan muutu. FF 1: lle ei todellakaan ole ollenkaan suodatinta, koska lähtö vain seuraa tuloa. Hyödyllisiä arvoja on välillä. Pienissä järjestelmissä valitset FF: n 12 N niin, että kerrotaan FF: llä voidaan suorittaa oikea siirtymä N-bittien avulla. Esimerkiksi FF voi olla 116 ja kertoa FF: llä siten oikea 4 bittien siirto. Muussa tapauksessa tämän suodattimen on vähennettävä vain yksi ja yksi lisätään, vaikka numeroiden on tavallisesti oltava leveämpiä kuin syöttöarvot (lisätietoja numeerisesta tarkkuudesta erillisessä osiossa). Yleensä AD-lukemat otetaan huomattavasti nopeammin kuin niitä tarvitaan ja niitä käytetään kahdella suodattimella. Tämä on kahden R-C-suodattimen digitaalinen ekvivalentti sarjassa ja vaimentaa 12 dBoctave - kerroksen taajuuden yläpuolella. AD-lukemissa sen on kuitenkin yleensä enemmän merkitystä tarkastella suodatinta aikatasossa tarkastelemalla sen askelvasetta. Tämä kertoo, kuinka nopeasti järjestelmäsi näkyy muutos, kun mittaustasi muutetaan. Näiden suodattimien suunnittelun helpottamiseksi (mikä tarkoittaa vain FF: n poimimista ja päättäen, kuinka monta niistä kaskadiin) käytän FILTBITS-ohjelmaa. Määrität siirrettävien bittien lukumäärän kullekin FF: lle kaskadiin sarjasuodattimissa ja lasketaan vaihevastaus ja muut arvot. Oikeastaan ​​käytän yleensä tätä kääreen käsikirjoituksen PLOTFILT kautta. Tämä toimii FILTBITS, joka tekee CSV-tiedoston ja piirtää sitten CSV-tiedoston. Esimerkiksi tässä on tulos PLOTFILT 4 4: Molemmat parametrit PLOTFILT tarkoittavat, että edellä mainitulla tyypillä on kaksi suodatinta kaskadataan. 4: n arvot osoittavat siirtymäbittien lukumäärän FF: n moninkertaistamiseksi. Kaksi FF-arvoa siis ovat 116 tässä tapauksessa. Punainen jälki on yksivaiheinen vaste, ja se on tärkein asia tarkastella. Esimerkiksi tämä kertoo, että jos tulo muuttuu hetkellisesti, yhdistetyn suodattimen lähtö laskeutuu 90: een uudesta arvosta 60 toistossa. Jos välität 95 laskeutumisaikaa, sinun on odotettava noin 73 iteraatiota ja 50 asettumisaikaa vain 26 toistoa. Vihreä jälki näyttää yhden ainoan täyden amplitudipiikin lähdön. Tämä antaa sinulle käsityksen satunnaisesta äänenvaimennuksesta. Näyttää siltä, ​​että mikään yksittäinen näyte ei aiheuta yli 2,5 muutosta tuotokseen. Sininen jälki on antaa subjektiivinen tunne siitä, mitä tämä suodatin tekee valkoisen melun kanssa. Tämä ei ole tarkka testi, koska ei ole takeita siitä, mitä sisältöä satunnaislukuista otettiin valittuna valkoisen melutason panoksena tähän PLOTFILT-juoksuun. Sen vain antaa sinulle karkea tunne, kuinka paljon se puristuu ja kuinka sileä se on. PLOTFILT, ehkä FILTBITS ja paljon muuta hyödyllistä tavaraa, erityisesti PIC-firmware-kehitykselle, on saatavilla PIC Development Tools - ohjelmistopäivityksessä My Software downloads - sivulla. Lisätty numeerisesta tarkkuudesta näen kommentista ja nyt uudesta vastauksesta, että on kiinnostusta keskustella tämän suodattimen toteuttamiseen tarvittavien bittien määrästä. Huomaa, että kerroin FF: llä luodaan lokit 2 (FF) uusia bittejä binaaripisteen alapuolella. Pienissä järjestelmissä FF valitaan tavallisesti 12 N niin, että tämä kerroin todella toteutuu oikealla N-bittien siirtymällä. FILT on siis tavallisesti kiinteä pisteen kokonaisluku. Huomaa, että tämä ei muuta mitään matematiikkaa prosessorin näkökulmasta. Jos esimerkiksi suodatetaan 10-bittiset AD-lukemat ja N 4 (FF 116), tarvitset 4 bittiä bittiä alle 10 bittisen kokonaisluku AD-lukemat. Yksi useimmista prosessoreista, olet tehnyt 16-bittisiä kokonaislukuja 10-bitin AD-lukemien ansiosta. Tässä tapauksessa voit silti tehdä täsmälleen samoja 16-bittisiä kokonaislukuja, mutta aloita AD-lukemat vasemmalle siirrettynä 4 bittiä. Prosessori ei tiedä eroa ja doesnt tarvitse. Matematiikan tekeminen koko 16-bittisille kokonaislukuille toimii, pidätkö ne 12.4 kiinteänä pisteenä vai tosi 16-bittisenä kokonaislukuna (16.0 kiinteä piste). Yleensä sinun on lisättävä N bittiä jokaista suodatinpylvää, jos et halua lisätä melua numeerisen esityksen vuoksi. Yllä olevassa esimerkissä kahden toisen suodattimen pitäisi olla 1044 18 bittiä, jotta tietoja ei menetettäisi. Käytännössä 8-bittisellä koneella, mikä tarkoittaa, että käytät 24 bittisiä arvoja. Teknisesti vain kahden toisen napa tarvitsisi laajempaa arvoa, mutta firmware-yksinkertaisuuden vuoksi käytän yleensä samaa esitystä ja samalla samaa koodia suodattimen kaikille napoille. Tavallisesti kirjoitan aliohjelman tai makron suorittamaan yhden suodattimen napaoperaation, ja sovita sitten jokaiseen napaan. Olipa aliohjelma tai makro riippuu siitä, ovatko syklit tai ohjelmamuisti tärkeämpiä tässä projektissa. Joko niin, käytän jonkin verran naarmuuntumista ohittamaan UUSI subroutinemacroon, joka päivittää FILT: n, mutta lataa myös samaan naarmuuntumistilaan, jossa UUSI oli sisään. Tämän ansiosta on helpompi soveltaa useita napoja sen jälkeen, kun yhden napapisteen päivitetty FILT on uusi seuraavasta. Aliohjelman ollessa hyödyllinen, kun osoitin osoittaa FILT: iä tiellä, joka päivitetään heti FILTin jälkeen ulosmatkalla. Näin aliohjelma toimii automaattisesti peräkkäisissä suodattimissa muistissa, jos sitä kutsutaan useita kertoja. Makroon et tarvitse osoitinta, koska siirrät osoitteen toimimaan jokaisella iteraatiolla. Koodiesimerkit Seuraavassa on esimerkki makroista, kuten edellä on kuvattu PIC 18: lle: Ja tässä on samanlainen makro PIC 24: lle tai dsPIC: lle 30 tai 33: Molemmat esimerkit toteutetaan makroina käyttäen PIC-kokoonpanon esikäsittelyohjelmaa. joka kykenee paremmin kuin mikään sisäänrakennetuista makroyksiköistä. clabacchio: Toinen asia, jonka olisi pitänyt mainita, on firmware-toteutus. Voit kirjoittaa yhden napaisen alipäästösuodattimen alirutiinin kerran ja käyttää sitä sitten useita kertoja. Itse kirjoitan tyypillisesti tällaisen alirutiinin ottamaan osoittimen muistiin suodatustilaan, sitten siirrä se eteenpäin osoitinta niin, että sitä voidaan kutsua peräkkäin helposti monipolkisuodattimien toteuttamiseksi. ndash Olin Lathrop 20. huhtikuuta 2012 klo 15:03 1. kiitos paljon vastauksista - ne kaikki. Päätin käyttää tätä IIR-suodatinta, mutta tätä suodatinta ei käytetä vakio-LowPass-suodattimena, koska minun täytyy keskimäärin vastata arvoja ja verrata niitä havaitsemaan muutokset tietyllä alueella. koska nämä arvot ovat hyvin erilaisia ​​mittasuhteita riippuen laitteistosta, jonka halusin ottaa keskimäärin voidakseen vastata näihin laitteistokohtaisiin muutoksiin automaattisesti. ndash sensslen 21 toukokuu 12 at 12:06 Jos voit elää rajoittamalla tehoa kahden määrän kohteita keskimäärin (eli 2,4,8,16,32 jne.), jakaminen voidaan helposti ja tehokkaasti tehdä matala suorituskykyinen mikro, jossa ei ole erillistä jakamista, koska se voidaan tehdä vähän siirrettävänä. Jokainen siirtymäoikeus on yksi kahdesta voimasta: OP toivoi, että hänellä oli kaksi ongelmaa, jotka jakautuivat PIC16: een ja muistiin hänen rengaspuskurilleen. Tämä vastaus osoittaa, että jakaminen ei ole vaikeaa. Tosin se ei käsittele muistiongelmia, mutta SE-järjestelmä mahdollistaa osittaiset vastaukset ja käyttäjät voivat ottaa jokaisesta vastauksesta itselleen jotain tai jopa muokata ja yhdistää muiden vastauksia. Koska jotkin muut vastaukset edellyttävät jako-operaatiota, ne ovat samalla puutteellisia, koska ne eivät osoita, kuinka tehokkaasti tämä saavutettaisiin PIC16: ssa. ndash Martin Huhtikuu 20 12 at 13:01 On vastaus todellinen liikkuva keskimääräinen suodatin (aka boxcar suodatin) vähemmän muistia vaatimuksia, jos et mielessä downsampling. Sen nimi on kaskadattu integraattori-kampasuodatin (CIC). Ajatuksena on, että sinulla on integraattori, jolla otat eroja ajanjaksolta, ja tärkein muistin säästölaite on, että alaspäin näytteenoton yhteydessä sinun ei tarvitse tallentaa integraattorin kaikkia arvoja. Se voidaan toteuttaa käyttäen seuraavia pseudokoodeja: Tehokas liikkuvan keskimäärän pituus on decimationFactorstatesize, mutta sinun tarvitsee vain pitää ympärilleen statesize näytteitä. On selvää, että voit saada paremman suorituskyvyn, jos valtiot ja decimationFactor ovat 2: n voimia, jotta jako ja loput operaattorit korvataan muutoksilla ja maskit. Postscript: Olen samaa mieltä Olinin kanssa siitä, että sinun pitäisi aina harkita yksinkertaisia ​​IIR-suodattimia ennen liikkuvaa keskisuodatinta. Jos et tarvitse vaunun suodattimen taajuus-nollia, 1-napainen tai 2-napainen alipäästösuodatin todennäköisesti toimii hyvin. Toisaalta, jos suodatetaan desimaatiota varten (ottamalla suuren näytteenottoprosentin ja laskemalla se keskikokoiseksi käytettäväksi alhaisen prosessin avulla), niin CIC-suodatin voi olla juuri sitä mitä etsit. (varsinkin jos voit käyttää statesize1 ja välttää rengaspuskurin yhdessä vain yhden aiemman integraattoriarvon kanssa) Käytä syvällistä analyysiä matematiikasta käyttäen ensimmäisen järjestyksen IIR-suodattimen avulla, jonka Olin Lathrop on jo kuvannut Digital Signal Processing - pinon vaihtoon (sisältää paljon kauniita kuvia.) Tämän IIR-suodattimen yhtälö on: Tämä voidaan toteuttaa käyttämällä vain kokonaislukuja eikä jakamista käyttäen seuraavaa koodia (tarvitsen jonkinlaista virheenkorjausta kirjoittaessani muistista.) Tämä suodatin on likimääräinen liukuva keskiarvo viimeiset K-näytteet asettamalla alfa-arvon arvoon 1K. Tee tämä edellisessä koodissa määrittämällä BITS: n LOG2 (K): lle, ts. K 16 asetetun BITS: n 4: lle, K 4 set BITS: lle 2: lle jne. (Ill tarkista tässä oleva koodi heti, kun saan muutoksen ja muokata tätä vastausta tarvittaessa.) vastasi 23.6. klo 12.44 Heres yksinapainen alipäästösuodatin (liikkuva keskiarvo, jonka rajataajuus CutoffFrequency). Erittäin yksinkertainen, erittäin nopea, toimii hyvin ja lähes muistin yläpuolella. Huomaa: Kaikilla muuttujilla on suodatustoiminnon ulkopuolella oleva suodatustoiminto, paitsi uudenInput Huomautus: Tämä on yhden vaiheen suodatin. Useita vaiheita voidaan yhdistää yhteen suodattimen terävyyden lisäämiseksi. Jos käytät useampaa kuin yhtä vaihetta, sinun täytyy säätää DecayFactor (joka liittyy Cutoff-taajuuteen) kompensoimaan. Ja tietenkin kaikki, mitä tarvitset, ovat ne kaksi riviä, jotka on sijoitettu missä tahansa, he eivät tarvitse omaa toimintaansa. Tällä suodattimella on nousuaika ennen kuin liikkuva keskiarvo edustaa tulosignaalin määrää. Jos sinun on ohitettava tämä nousupyyntö, voit alustaa MovingAverage ensimmäisen uuden arvon arvoon 0 eikä toivoa, että uusi newInput ei ole outlier. (CutoffFrequencySampleRate) on välillä 0 ja 0,5. DecayFactor on arvo välillä 0 ja 1, yleensä lähellä 1. Yhden tarkkuuden kellukkeet ovat tarpeeksi hyviä useimpiin asioihin. Jos haluat säilyttää kokonaislukuja, voit muuntaa DecayFactorin ja amplitudi-tekijän murto-kokonaislukuihin, joissa numeerinen arvo on kokonaisluku ja nimittäjä on kokonaisluku 2 (joten voit siirtyä oikealle nimittäjä eikä jakaa suodattimen silmukan aikana). Esimerkiksi, jos DecayFactor 0.99 ja haluat käyttää kokonaislukuja, voit asettaa DecayFactor 0.99 65536 64881: n. Sitten aina, kun kerrotaan DecayFactorilla suodatussilmukassasi, siirrä vain tulosta 16. Lisätietoja tästä on erinomainen kirja, joka online, luku 19 rekursiivisista suodattimista: dspguidech19.htm PS Liikkuvan keskiarvon paradigmalle on erilainen lähestymistapa DecayFactorin ja AmplitudeFactorin määrittämiseen, jotka voivat olla tarpeellisempia tarpeidesi mukaan. Voit sanoa, että haluat edellisen, noin 6 kohteen keskimäärin, tekemällä sen diskreetin mukaan, lisää 6 kohdetta ja jakaa 6: lla voit asettaa AmplitudeFactorin arvoon 16 ja DecayFactor arvoon (1,0 - AmplitudeFactor). Vastaus 14. toukokuuta 12 klo 22:55 Jokainen muu on kommentoinut perusteellisesti IIR: n vs. FIR: n hyödyllisyyttä ja kahdella eri tavalla. Haluan vain antaa joitakin toteutus yksityiskohtia. Alla toimii hyvin pieniä mikro-ohjaimia, joissa ei ole FPU: ta. Siinä ei ole kertolaskua, ja jos pidät N: n tehon kahdella, kaikki jakautuminen on yksikiertoinen bittivirta. Perus FIR-rengaspuskuri: pidä viimeisten N-arvojen käynnissä oleva puskuri ja puskuriin kaikki arvot juokseva SUM. Joka kerta kun uusi näyte tulee sisään, vähennä SUM: n puskuriin vanhin arvo, korvaa se uudella näytteellä, lisää uusi näyte summaan ja anna SUMN. Modifioitu IIR-rengaspuskuri: pidä viimeisen N-arvon SUM-juoksua. Joka kerta, kun uusi näyte tulee sisään, lisää uusi summa SUM - SUMN ja anna SUMN. Vastaus 28 elokuu 13 klo 13.45 Jos olen lukenut oikein, kuvataan ensimmäisen asteen IIR-suodattimen arvoa, jota vähennät, ei ole vanhin arvo, joka on laskenut, vaan on sen sijaan keskimääräinen aikaisemmista arvoista. Ensimmäisen luokan IIR-suodattimet voivat olla hyödyllisiä, mutta en ole varma siitä, mitä tarkoitat, kun ehdotat, että lähtö on sama kaikille jaksottaisille signaaleille. 10 KHz: n näytteenottotaajuudella syötetään 100 Hz: n kenttä aalto 20-vaiheiseen laatikkosuodattimeen, joka tuottaa 20 näytteen tasaiselle nousevalle signaalille 30: lle korkean 30: n, tiputtaa 20 näytettä tasalaatuisesti ja 30: IIR-suodatin. ndash supercat 28. elokuuta 13 klo 15:31 tuo aallon, joka alkaa jyrkästi nousta ja vähitellen laskeutuu lähelle (mutta ei) sisääntulon enimmäismäärää, sitten alkaa jyrkästi laskeutua ja vähitellen laskeutuu lähelle (mutta ei) sisääntulon vähimmäismäärää. Hyvin erilainen käyttäytyminen. Yksi asia on se, että yksinkertainen liikkuva keskiarvo saattaa olla hyödyllinen. IIR-suodattimen avulla saat mukavan suodattimen, jossa on suhteellisen vähän kalkkia. Kuvailmaasi FIR: hen voi vain antaa suorakulmion ajaksi - sinc in freq - ja et voi hallita sivulohkoja. Saattaa olla sen arvoista, että se heittää muutaman kokonaisluku kertoo, jotta se olisi mukava symmetrinen viritettävä FIR, jos voit säästää kellotappeja. ndash Scott Seidman 29 elokuu 13 13:50 ScottSeidman: Ei tarvitse kertoa, jos jokainen FIR: n jokaisessa vaiheessa joko syöttää tulon keskiarvon tähän vaiheeseen ja sen aiempiin tallennettuihin arvoihin, ja tallentaa sitten tulon (jos sellainen on numeerinen alue, yksi voisi käyttää summaa pikemminkin kuin keskimäärin). Riippumatta siitä, onko se parempi kuin laatikkosuodatin, riippuu sovelluksesta (esimerkiksi 1 ms: n kokonaisviiveellä oleva laatusuodattimen vaihevaste on huono d2dt-piikki, kun tulo muuttuu ja 1 ms myöhemmin, mutta sen minimi mahdollinen ddt suodattimelle yhteensä 1 ms viiveellä). ndash supercat 29 elokuu 13 at 15:25 Kuten mikeselectricstuff sanoi, jos todella tarvitset vähentää muistin tarpeisiin, ja et muista, että impulssi vaste on eksponentiaalinen (suorakulmainen pulssin sijaan), menen eksponentiaalisen liukuvan keskimääräisen suodattimen . Käytän niitä laajasti. Tällaisella suodattimella et tarvitse puskuria. Sinun ei tarvitse tallentaa N viime näytteitä. Vain yksi. Joten, muistivaatimukset saavat leikata tekijä N. Lisäksi et tarvitse mitään jakamista varten. Vain kertoja. Jos sinulla on mahdollisuus käyttää liukuluvusta aritmeettista, käytä liukulukuisia kertolaskuja. Muuten tee kokonaisluku kertoo ja siirtää oikealle. Olemme kuitenkin vuonna 2012, ja suosittelen käyttämään kääntäjiä (ja MCU: ita), joiden avulla voit työskennellä liukulukujen kanssa. Sen lisäksi, että muistit ovat tehokkaampia ja nopeampia (sinun ei tarvitse päivittää kohteita missään pyöreässä puskurissa), sanoisin, että se on myös luonnollisempi. koska eksponentiaalinen impulssivaste vastaa paremmin tapaa, jolla luonto käyttäytyy useimmissa tapauksissa. Vastaus IIR-suodattimella, jota olin ja supercat koskettivat melkein, mutta jotka muuten ilmeisesti ovat jättäneet huomiotta, on se, että pyöristys alentaa jonkin verran epätarkkuutta (ja mahdollisesti biasyrjintä). olettaen, että N on kahden ja vain kokonaisluku aritmeettinen, siirtymäoikeus poistaa järjestelmällisesti uuden näytteen LSB: t. Tämä tarkoittaa sitä, kuinka kauan sarja voi olla, keskimääräinen ei koskaan ota niitä huomioon. Oletetaan esimerkiksi, että hitaasti laskeva sarja (8,8,8,8,7,7,7,6,6,6) ja olettaa, että keskiarvo on todellakin 8 alussa. Vartalo 7-näyte tuo keskimäärin 7, riippumatta suodattimen lujuudesta. Vain yksi näyte. Sama tarina 6: lle, jne. Ajattele nyt päinvastaista. sarja nousee ylös. Keskimäärin pysyy 7: llä ikuisesti, kunnes näyte on tarpeeksi suuri, jotta se muuttuisi. Tietenkin voit korjata bias lisäämällä 12N2, mutta se tapana todella ratkaista tarkkuusongelma. tässä tapauksessa laskeva sarja pysyy ikuisesti 8: ssa, kunnes näyte on 8-12 (N2). Esimerkiksi N4: lle nollan yläpuolella oleva näyte pitää keskimäärin ennallaan. Uskon, että ratkaisu tähän tarkoittaisi pidättämään menetetyn LSB: n akun. Mutta en tehnyt sitä tarpeeksi kauan, jotta koodi olisi valmis, ja en ole varma, että se ei vahingoittaisi IIR-tehoa joissakin muissa sarjojen tapauksissa (esimerkiksi 7,9,7,9: n keskiarvo olisi 8). Olin, kaksivaiheinen kaskadi tarvitsisi myös selitystä. Tarkoitatko, että pidät keskimäärin kaksi keskiarvoa ensimmäisen tuloksen tuloksena jokaiseen iteraatioon toiseen. Mitä hyötyä tästä Jos sinulla on keskimäärin N näytteet, yksinkertaisesti kerro keskimäärin N, lisää uusi näyte ja jaa N1. Se ei tee liikkuvaa keskiarvoa. Sinun täytyy olla halukas tallentamaan 150 näytettä. Sitten, kun saat uuden näytteen, kerro keskimäärin 150, vähennä vanhimmat, lisää uusin ja jaa 150: llä. Aseta uusin 150-kokoiseen puskuriin ja poista vanhin. On olemassa muita järjestelmiä, jotka pitävät NA: n keskiarvon, mikä vähentää kertoimia vähän. Jim Wagner Oregon Tutkimuselektroniikka, konsultointi Div. Tangent, OR, USA orelectronics Kleinstein Taso: Posting Freak Liittynyt: la. 22.09.2007 Lähettäjä Kleinstein. Aurinko. 18 tammikuu 2009 - 04:34 Ei ole mitään keinoa tallentaa viimeiset N (n. 150) näytteet, jos tarvitaan todellista liukuva keskiarvo kunkin sijainnin. 150 Samleen pitäisi edelleen sopeutua RAM: iin. Voit kuitenkin tallentaa kertolaskuja. Lisää uusi näyte ja supista viimeinen putoaminen. Sitten jaa summa N: llä tulos ja pidä summa seuraavalle vaiheelle. Devision saa paljon helpompaa, jos voit käyttää 128 näytettä. Taso: 10k Postman Liittynyt: la. 12.02.2005 Sijainti: Wormshill, Englanti Lähettäjä david. prentice. Aurinko. 18.01.2009 - 16:51 Keskiarvo yhteensä näytteitä. newaverage (yhteensä uudet) (näytteet 1) Jos olet huolissasi siitä, että ilmoitat voimassa olevan keskiarvon, kunnes näytteiden määrä on 150, lähetät raportin viipymättä, kunnes se on voimassa. 16000 näytteitä säännöllisesti ints helposti mahtuu pitkä kokonaismäärä. Jaat, kun sinua pyydetään raportoimaan keskimääräinen arvo. Voit myös laskea keskiarvon ja nollata summan jokaista 150 näytettä kohden. Ilmoitat tämän keskiarvon seuraavaan laskelmaan. Hieman kuin pyörintätietokoneen nopeus. Etupyörän on tehtävä enemmän kuin yksi kierros ennen kuin nopeus voidaan laskea. curtvm Taso: Raving Lunatic Liittynyt: Ke 21.09.2005 Lähettäjä curtvm. Ma 19.01.2009 - 04:40 (tämä on samanlainen kuin Kleinsteinsin idea). Taso: 10k Postman Liittynyt: Ma 19.02.2001 Sijainti: Wisconsin USA Lähettäjä theusch. Ma Jan 19, 2009 - 02:58 PM Kuvauksen luonteen mukaan liikkuvan keskiarvon suuri määrä näytteitä signaali hidastuu. Jos minun tarvitsee yleistää sovelluksiani, tyypillinen on sulkea silmukka 500 ms: n välein. Minulla on ADC ottaa jatkuvasti (keskeyttää) näytteenotto kaikista käytetyistä AD-näytteistä, jotka tallentavat raakaa lukua ryhmään. Jokainen 10 ms yksi tai useampi konversio on tehty jokaisella kanavalla. (At 57600 ADC kello, joka on 226usconversion kanssa ISR overhead ehkä 250us niin noin 40 konversiota joka 10ms.) 10ms pisteen lisätä raaka-arvo edustaa viimeisin tulos tulos yhteensä kullekin kanavalle. Jokaisella 500 ms: n keskiarvolla suljetaan sovellussilmukan. Tämä toimii hyvin hitaasti liikkuville signaaleille, kuten termistoreille, nykyisille piirtolukemille ja ohjausjännitteille. Summa-keskiarvo vie paljon melua ja lukemat ovat tyypillisesti rock-vakaa. (ADC-lukemissa on havaittu huomattavia kierroksia). Huomaa, että summan käyttäminen keskimäärin säilyttää paremman matalan bittien, mutta heck - jopa hitaasti liikkuva signaali saattaa alkaa muuttua segmentin että 500ms niin mikä on kohta Nyt nopeammin liikkuvat signaalit tai ne, jotka vaativat nopeampaa vastausta, tarvitsevat toisenlaisen lähestymistavan. Yleinen tilanne minulle on seurata raakaa DC tulevan tehon menetykseen. Tämä signaali saattaa olla raakaa puhdistettu AC ja sillä on paljon aaltoilua. Tai saattaa olla muita tekijöitä, jotka saattavat aiheuttaa sen. Näissä tapauksissa teen yksinkertaisen keskiarvojärjestelmän, kuten Kleinsteinin, uuden näytteen paino muuttaa edellistä arvoa. Ei, ei todellista liikkuvaa keskiarvoa, koska kaikkia näytteitä ei ylläpidetä. Tehonvalvonnassa uusi näyte voi olla 12 tai 14 tai 18 paino, empiirisesti määritelty, mikä toimii parhaiten tietyssä tapauksessa. Alla on koodi sovelluksesta, jossa 12 oli liian karkea ja lopullinen 116: Voit laittaa huulipunan sikaon, mutta se on silti sika. En ole koskaan tavannut sikaa, jota en pitänyt, niin kauan kuin sinulla on suolaa ja pippuria. Jäljitelmä Yksinkertainen liukuva keskiarvo Keskimäärin Yksinkertainen liukuva keskiarvo Sinua kannustetaan ratkaisemaan tehtävän tehtäväluokituksen mukaan käyttämällä mitä tahansa kieltä, jota tiedät. Lasketaan joukko numeroiden yksinkertainen liikkuva keskiarvo. Luo stateful functionclassinstance, joka kestää ajan ja palauttaa rutiinin, joka ottaa numeron argumenttina ja palauttaa yksinkertaisen liukuvan keskiarvon argumentteihinsa toistaiseksi. Yksinkertainen liikkuva keskiarvo on menetelmä, jolla lasketaan keskimääräinen lukuvirta vain laskemalla viimeiset 160 P 160 - numerot virrasta 160, jossa 160 P 160 tunnetaan ajanjaksoksi. Se voidaan toteuttaa kutsumalla 160: n 160 160: n 160 160 (160) 160 P 160 - määritä rutiini, joka sitten palauttaa rutiinin, joka kutsutaan yksittäisten, peräkkäisten numeroiden virran jäsenten kanssa laskemalla to), niiden viimeinen 160 P 160, soita 160 SMA: lle (). Toimintotehtävissä oleva 160 sana 160 viittaa 160: n 160 SMA: n (160) tarpeeseen muistaa tiettyjä tietoja kutsujen välille: 160 Ajanjakso, 160 P 160 Tilattu astia, jossa on ainakin viimeiset 160 P 160 - numerot kustakin sen yksittäiset puhelut. Stateful 160 tarkoittaa myös, että peräkkäiset kutsuja 160 I (), 160 alustunnistin 160: n pitäisi palauttaa erilliset rutiinit, jotka eivät 160: stä 160: stä jakaa tallennettua tilaa, jotta niitä voitaisiin käyttää kahdessa itsenäisessä datavirrassa. Pseudokoodi 160: n SMA 160: n käyttöönotosta on: Tämä versio käyttää pysyvää jonoa pitämään viimeisimmät p-arvot. Jokainen toiminto, joka palautuu init-moving-keskiarvosta, on sen tilan atomissa, jolla on jonon arvo. Tämä toteutus käyttää pyöreää luetteloa, joka tallentaa numerot ikkunaan jokaisen iterointi-osoittimen alussa, joka sisältää luettelon solun, joka pitää arvon siirtyessään ulos ikkunasta ja korvataan juuri lisättynä arvolla. Closure-muokkauksen käyttäminen Tällä hetkellä tämä sma cant be nogc koska se jakaa sulkemisen kasaan. Jotkut poistuvat analyysit voisivat poistaa kasaosuuden. Struct-muokkauksen käyttäminen Tässä versiossa vältetään sulkemisen kasa-allokointi pitämällä tiedot päätoiminnon pino-kehyksessä. Sama tuotos: Jotta vältettäisiin liukulukujen approksimaatiot pysyisivät paikoillaan ja kasvaisivat, koodi voisi suorittaa jaksottaisen summan koko ympyränmuotoisessa jonojärjestelmässä. Tämä toteutus tuottaa kaksi (funktio) objektia, jotka jakavat tilaa. E: ssä on E: n erottama tulosta lähtöstä (luetaan kirjoituksesta) sen sijaan, että ne yhdistettäisiin yhteen objektiksi. Rakenne on sama kuin Standard Devation E: n toteutus. Alla oleva elixir-ohjelma tuottaa nimettömän funktion, jossa on upotettu aika p, jota käytetään yksinkertaisen liukuvan keskiarvon ajanjaksona. Käynnistysfunktio lukee numerotulon ja siirtää sen äskettäin luotuun nimettömään funktioon ja tarkastaa tuloksen STDOUT: lle. Lähtö esitetään alla, keskiarvona, jota seuraa ryhmitelty tulo, joka muodostaa kunkin liikkuvaa keskiarvon perustan. Erlangilla on sulkimet, mutta muuttumattomat muuttujat. Sitten ratkaisu on käyttää prosesseja ja yksinkertaista sanomapohjaista API: ta. Matrix-kielillä on rutiineja laskea liukuva avarageja tietylle kohteelle. Se on vähemmän tehokas silmukka kuin seuraavissa komennoissa. Toimii jatkuvasti syöttöä I. joka lisätään luettelon L1 loppuun. L1 löytyy painamalla 2ND1, ja keskiarvo löytyy ListOPS: stä. Paina ON - painiketta lopettaaksesi ohjelman. Toiminto, joka palauttaa luettelon, joka sisältää toimitetun argumentin keskimääräiset tiedot, joka palauttaa yksinkertaisen arvon jokaisella kutsulla: luettelo on keskimääräinen lista: p on ajanjakso: 5 palauttaa keskimääräisen luettelon: Esimerkki 2: Ohjelman käyttäminen movinav2 (i , 5) - Siirrä keskimääräinen laskenta ja määritä 5 movinav2 (3, x) jakso: x - uusi tieto listalle (arvo 3), ja tulos tallennetaan muuttujaan x ja näytetään movinav2 (4, x) : x - uusi tieto (arvo 4), ja uusi tulos tallennetaan muuttujaan x ja näytetään (43) 2. Toiminnon kuvaus movinavg: muuttuja r - on tulos (keskiarvoinen lista), joka palautetaan muuttuja i - on indeksimuuttuja ja se viittaa alaluettelon loppuun listan keskiarvo. muuttuja z - avustaja-muuttuja Toiminto käyttää muuttujaa i määrittääkseen, mitkä luettelon arvot otetaan huomioon seuraavassa keskimääräisessä laskelmassa. Jokaisella iteraatiolla muuttuja i osoittaa viimeisen listan arvon, jota käytetään keskimääräisessä laskelmassa. Joten tarvitsemme vain selville, mikä on luettelon ensimmäinen arvo. Yleensä on p-osaa pitää p-elementtejä, joten ensimmäinen elementti on indeksoima (i-p1). Ensimmäisten iterointien aikana laskennan on kuitenkin yleensä negatiivinen, joten seuraavalla yhtälöllä vältetään negatiiviset indeksit: max (i-p1,1) tai järjestämällä yhtälö max (i-p, 0) 1. Ensimmäisten iterointien elementtien määrä on myös pienempi, oikea arvo on (pääindeksi - aloita indeksi 1) tai järjestämällä yhtälö (i - (max (ip, 0) 1) 1) ja sitten , (i-max (ip, 0)). Muuttujalle z on yhteinen arvo (max (ip), 0), joten beginindex tulee olemaan (z1) ja elementtien numero on (iz) puolivälissä (list, z1, iz) palauttaa arvoluettelon, .) Summa summa summa (.) (iz) ri keskittää ne ja tallentaa tulokset sopivaan paikkaan tulosluettelossa fp1 luo osittaisen sovelluksen, joka vahvistaa (tässä tapauksessa) toisen ja kolmannen parametrin

No comments:

Post a Comment