Kazalo:

Tekoče povprečje za vaše projekte mikrokrmilnikov: 6 korakov
Tekoče povprečje za vaše projekte mikrokrmilnikov: 6 korakov

Video: Tekoče povprečje za vaše projekte mikrokrmilnikov: 6 korakov

Video: Tekoče povprečje za vaše projekte mikrokrmilnikov: 6 korakov
Video: Ричард Хайер: Нейронаука IQ и интеллекта 2024, November
Anonim
Tekoče povprečje za vaše projekte mikrokrmilnikov
Tekoče povprečje za vaše projekte mikrokrmilnikov

V tem navodilu bom razložil, kaj je tekoče povprečje in zakaj bi morali zanj skrbeti, ter vam pokazal, kako ga je treba izvesti za največjo računalniško učinkovitost (ne skrbite zaradi zapletenosti, zelo preprosto je razumeti in bom ponuja tudi preprosto knjižnico za vaše arduino projekte:)

Tekaško povprečje, ki se običajno imenuje tudi drseče povprečje, drseče povprečje ali tekaško povprečje, je izraz, ki se uporablja za opis povprečne vrednosti zadnjih N vrednosti v podatkovnih vrstah. Izračuna se lahko tako kot običajno povprečje ali pa uporabite trik, s katerim lahko minimalno vplivate na delovanje vaše kode.

1. korak: Primer uporabe: Izravnava meritev ADC

Primer uporabe: Izravnava meritev ADC
Primer uporabe: Izravnava meritev ADC

Arduino ima dostojen 10 -bitni ADC z zelo malo hrupa. Pri merjenju vrednosti na senzorju, kot je potenciometer, fotorezistor ali druge komponente z visokim hrupom, je težko verjeti, da je meritev pravilna.

Ena od rešitev je, da vsakič, ko želite prebrati senzor, opravite več meritev in jih povprečite. V nekaterih primerih je to izvedljiva rešitev, vendar ne vedno. Če bi radi prebrali ADC 1000 -krat na sekundo, bi morali narediti 10 000, če bi naredili povprečno 10 meritev. Velika izguba računalniškega časa.

Moja predlagana rešitev je, da opravim meritve 1000 -krat na sekundo, vsakič posodobim tekoče povprečje in ga uporabim kot trenutno vrednost. Ta metoda uvaja nekaj zamud, vendar zmanjšuje računalniško zapletenost vaše aplikacije in vam daje veliko več časa za dodatno obdelavo.

Na zgornji sliki sem uporabil povprečje zadnjih 32 meritev. Videli boste, da ta metoda ni 100 -odstotno odporna, vendar bistveno izboljša natančnost (ni slabša od povprečja 32 vzorcev vsakič). Če želite vsakič izračunati povprečno 32 meritev, bi to za Arduino UNO samo za meritve trajalo več kot 0,25 ms!

2. korak: Primer uporabe: Merjenje enosmerne komponente signala mikrofona

Primer uporabe: Merjenje enosmerne komponente signala mikrofona
Primer uporabe: Merjenje enosmerne komponente signala mikrofona
Primer uporabe: Merjenje enosmerne komponente signala mikrofona
Primer uporabe: Merjenje enosmerne komponente signala mikrofona
Primer uporabe: Merjenje enosmerne komponente signala mikrofona
Primer uporabe: Merjenje enosmerne komponente signala mikrofona

Arduino lahko meri napetosti med 0 in Vcc (običajno 5 V). Zvočni signal je popolnoma izmeničen in če ga želite meriti na mikrokrmilniku, ga morate prilagoditi okoli 1/2 Vcc. V projektu Arduino UNO bi to pomenilo približno 2,5 V (DC) + zvočni signal (AC). Ko uporabljate 10 -bitni ADC in 5 V napajalnik, mora biti 2,5 V pristranskost enaka meritvi 512. Torej, da dobite AC vrednost signala, je treba od meritve ADC odšteti 512 in to je to, kajne?

V idealnem svetu bi bilo to res. Na žalost je resnično življenje bolj zapleteno in naša pristranskost signala se ponavadi premika. Zelo pogost je hrup 50 Hz (60 Hz, če živite v ZDA) iz električnega omrežja. Običajno ni vse preveč problematično, vendar je dobro vedeti, da obstaja. Bolj problematičen je linearni premik zaradi segrevanja komponent. Previdno nastavite korekcijo odmika DC pri zagonu in se med izvajanjem aplikacije počasi oddaljuje.

To težavo bom ponazoril z detektorjem (glasbenih) utripov. Nastavili ste odstranjevanje pristranskosti in utripi so jasni (slika 2). Po določenem času se premik DC -ja premakne in utripi so komaj opazni za mikrokrmilnik (slika 3). Algoritem zaznavanja utripov bo v prihodnje poučen, saj presega obseg tega članka.

Na srečo obstaja način, kako nenehno izračunati DC odmik zvoka. Ne bo presenečenje, da teka tega povprečja, ki teče po povprečju, ponuja rešitev.

Vemo, da je povprečna vrednost katerega koli AC signala 0. S tem znanjem lahko odštejemo, da je povprečna vrednost AC+DC signala njegova pristranskost DC. Če ga želite odstraniti, lahko vzamemo tekoče povprečje zadnjih nekaj vrednosti in ga odštejemo od trenutnih odčitkov ADC. Upoštevajte, da morate uporabiti dovolj dolgo tekaško povprečje. Za zvok bi morala zadostovati desetina sekunde (število vzorcev je odvisno od hitrosti vzorčenja), vendar veste, da daljša povprečja delujejo bolje. Na prvi sliki lahko vidite primer pravega izračuna DC pristranskosti s tekočim povprečjem s 64 elementi pri frekvenci vzorčenja 1 kHz (manj, kot sem priporočil, vendar še vedno deluje).

3. korak: Izračun

Izračun
Izračun

Tekaško povprečje si lahko predstavljate kot povprečno težo ljudi v zdravniški čakalnici. Zdravnik konča pregled enega bolnika in hkrati vstopi nov v čakalnico.

Če želite ugotoviti povprečno težo vseh čakajočih pacientov v čakalnici, bi lahko medicinska sestra nato vprašala vsakega bolnika o njihovi teži, jih seštela in razdelila na število bolnikov. Vsakič, ko zdravnik sprejme novega bolnika, bi medicinska sestra ponovila celoten postopek.

Morda mislite: "To se ne sliši preveč učinkovito … Za to mora obstajati boljši način." In imeli bi prav.

Za optimizacijo tega procesa bi lahko medicinska sestra vodila evidenco skupne teže trenutne skupine bolnikov. Ko zdravnik pokliče novega bolnika, ga bo medicinska sestra vprašala o njegovi teži in jo odštela od skupne vrednosti in ga pustila. Medicinska sestra bi nato vprašala pacienta, ki je pravkar stopil v čakalnico, o njegovi teži in jo dodala k skupni vrednosti. Povprečna teža bolnikov po vsaki izmeni bi bila vsota utež, deljena s številom bolnikov (ja, enako kot prej, zdaj pa je medicinska sestra vprašala le dve osebi o njihovi teži, ne pa vseh). Zavedam se, da je bil ta odstavek nekoliko zmeden, zato si za večjo jasnost oglejte zgornjo sliko (ali postavite vprašanja v komentarjih).

Toda tudi če vam zadnji odstavek ni bil zmeden, bi lahko imeli vprašanja, na primer, kaj bi moralo biti v akumulatorju na začetku, kako naj to, kar sem pravkar prebral, vnesem v dejansko kodo C? To bomo obravnavali v naslednjem koraku, kjer boste dobili tudi mojo izvorno kodo.

4. korak: Koda

Kodeks
Kodeks

Za izračun tekočega povprečja morate najprej shraniti zadnjih N vrednosti. lahko imate matriko z N elementi in premaknete celotno vsebino za eno mesto vsakič, ko dodate element (prosim, tega ne storite), ali pa prepišete enega starega elementa in prilagodite kazalec na naslednji element, ki ga želite odstraniti (naredite to:)

Akumulator se mora začeti inicializirati na 0, enako velja za vse elemente v vrstici za zakasnitev. V nasprotnem primeru bo vaše povprečje vedno napačno. Videli boste, da delayLine_init skrbi za inicializacijo zakasnitvene črte, sami bi morali poskrbeti za akumulator.

dodajanje elementa v zamudno vrstico je tako preprosto, kot da indeks najnovejšega elementa znižamo za 1, pri čemer pazimo, da ne kaže na stran matrike zamikovnih vrstic. po znižanju indeksa, ko je 0, se bo zankal okoli 255 (ker je to 8 -bitno brezznačno celo število). Operater Modulo (%) z velikostjo matrike zakasnitvenih vrstic bo zagotovil, da bo indeks kazal na veljaven element.

Izračun tekočega povprečja bi moral biti enostaven za razumevanje, če bi upoštevali mojo analogijo v prejšnjem koraku. Od akumulatorja odštejte najstarejši element, akumulatorju dodajte najnovejšo vrednost, najnovejšo vrednost potisnite v zamik, vrnite akumulator deljeno s številom elementov.

Enostavno, kajne?

Če želite bolje razumeti, kako vse to deluje, poskusite z uporabo priložene kode. Trenutno stanje arduino bere analogno vrednost na analognem zatiču A0 in na serijskih vratih natisne "[vrednost ADC], [tekoče povprečje]" pri hitrosti 115200 baud. Če odprete arduinov serijski ploter s pravilno hitrostjo prenosa, boste videli dve vrstici: vrednost ADC (modra) in zglajena vrednost (rdeča).

5. korak: Dodatki

Dodatki
Dodatki

Nekaj stvari, ki jih ni nujno vedeti, da v svojem projektu uporabite povprečje, ne bo škodilo vedeti.

zamuda: Začel bom govoriti o ponazoritvi tega koraka. Opazili boste, da povprečno število elementov prinaša večjo zamudo. Če je vaš odzivni čas za spremembo vrednosti kritičen, boste morda želeli uporabiti krajše tekoče povprečje ali povečati frekvenco vzorčenja (merite pogosteje).

Iti naprej.

inicializacija: Ko sem govoril o inicializaciji akumulatorja in elementov zakasnitve, sem rekel, da jih morate vse inicializirati na 0. Druga možnost je, da lahko zakasnilno črto inicializirate na karkoli, vendar se mora akumulator začeti kot vsota najnovejših N elementov v zamikovni črti (kjer je N je število elementov v vašem povprečju). Če se akumulator zažene kot katera koli druga vrednost, bo izračunano povprečje napačno - prenizko ali previsoko, vedno za isti znesek (ob predpostavki enakih začetnih pogojev). Predlagam, da poskusite izvedeti, zakaj je temu tako, z uporabo "simulacije peresa in papirja".

velikost akumulatorja: Upoštevajte tudi, da mora biti akumulator dovolj velik, da shrani vsoto vseh elementov v zamik, če so vsi pozitivni ali negativni max. Praktično to pomeni, da mora biti akumulator en podatkovni tip večji od elementov zakasnitvene črte in podpisan, če so podpisani elementi zamikovne vrstice.

trik: Linije z dolgim zamikom zavzamejo veliko pomnilnika. To lahko hitro postane problem. Če ste zelo omejeni s pomnilnikom in ne skrbite veliko za natančnost, lahko približate tekoče povprečje tako, da v celoti izpustite zamudo in to storite namesto tega: od akumulatorja odštejte akumulator 1/N * in dodajte novo vrednost (na primer 8 dolgoletnih povprečij: akumulator = akumulator * 7/8 + nova vrednost). Ta metoda daje napačen rezultat, vendar je to dostojna metoda izračuna povprečja, ko vam primanjkuje pomnilnika.

jezikoslovje: "tekoče povprečje/povprečje" se običajno uporablja pri sklicevanju na povprečje v realnem času, medtem ko "drseče povprečje/povprečje" običajno pomeni, da se algoritem izvaja na statičnem nizu podatkov, kot je preglednica Excel.

6. korak: Zaključek

Upam, da je bilo to navodilo dovolj enostavno razumeti in da vam bo pomagalo pri vaših prihodnjih projektih. Če je kaj nejasnega, v komentarje spodaj objavite vprašanja.

Priporočena: