Kysymys:
Onko Arduinolle signaalin tasoituskirjastoja?
asheeshr
2014-02-16 19:57:38 UTC
view on stackexchange narkive permalink

Työskentelen mobiilirobotilla, jota ohjataan langattomalla 2,4 GHz: n linkillä. Vastaanotin on kytketty Arduino Unoon, joka toimii laivalla pääohjaimena. Kriittisin (ja pää) vastaanottimesta tuleva tulokanava tuottaa erittäin meluisan signaalin, mikä johtaa paljon pieniin muutoksiin toimilaitteiden lähdössä, vaikka niitä ei tarvita.

 enter image description here Suunnittele Arduinon tulo 30 sekunnin välein. 

Etsin kirjastoja, jotka voivat suorittaa tehokkaan tasoituksen. Onko Arduinolle (Uno) saatavana signaalin tasoituskirjastoja?

En tiedä löytyykö tällaisia ​​kirjastoja, mutta pelkäänpä näiden tarvitsevan paljon keskusyksikkötehoa Arduinolle. Haluan mieluummin käyttää elektronista ratkaisua (alipäästösuodatin), jos mahdollista.
Olen tässä jfpoilpretin kanssa. Luulen, että tarvitset sähköisen ratkaisun. Yritän stabilointikondensaattoria (yksinkertainen alipäästösuodatin). Oletan, että käytät ADC-kanavaa, joten sinun pitäisi laittaa korkki tältä kanavalta maahan. Aloita arvoilla noin 100 pf ja jatka sieltä.
Neljä vastused:
#1
+9
asheeshr
2014-03-07 20:14:24 UTC
view on stackexchange narkive permalink

Microsmooth on kevyt signaalin tasoituskirjasto, jota kehitän parhaillaan.

Sitä kehitetään edelleen ja tavoitteena on tehdä siitä kevyt muistin ja nopean suhteen. . Kirjasto tarjoaa useita suodattimia tasoitusta varten:

  • yksinkertainen liukuva keskiarvo
  • eksponentiaalinen liukuva keskiarvo
  • kumulatiivinen liukuva keskiarvo
  • Savitzky Golay Suodatin
  • Ramer Douglas Pecker -algoritmi
  • Kalmogorov Zurbenko -suodatin

Käyttääksesi kirjastoa lataa ja lisää se lähdekoodihakemistoon. Lisää myös seuraava rivi lähdetiedostoon:

  #include "microsmooth.h"  
Hei, minulla on vaikeuksia käyttää kirjastoa. Etkö käytä "Tuo kirjasto ..." -toimintoa tuoda kirjastosi oikein? Yritin vain kopioida lähde .ino-kansioon, mutta saan virheitä siitä, että puuttuu automicrosmooth.h, Sarjaa ei määritetä ja puuttuu ';'. Toimiiko tämä kirjasto edelleen? Kiitos
@waspinator Anteeksi. Korjattu virheet. Kiitos palautteesta!
#2
+7
David Cary
2014-03-26 22:37:56 UTC
view on stackexchange narkive permalink

Luulen, että meluisassa signaalissasi on paljon yhden näytteen kohinapiikkejä.

Mediaanisuodatin auttaa paremmin eroon yhden näytteen kohinapiikeistä kuin mikään lineaarinen suodatin. (On parempi kuin mikään alipäästösuodatin, liukuva keskiarvo, painotettu liukuva keskiarvo jne. sen vasteajan ja kyvyn ohittaa tällaiset yhden näytteen kohinapoikkeamat mukaan lukien.

Signaaleja on itse asiassa monia -saravat kirjastot Arduinolle, joista monet sisältävät mediaanisuodattimen.

signaalin tasoittavat kirjastot osoitteessa arduino.cc:

signaalin tasoittavat kirjastot githubissa:

Toimiiko jotain tällaista robotissasi? (Mediaanin 3 mediaani vaatii hyvin vähän suorittimen tehoa ja siten nopeasti):

  /*median_filter.ino2014-03-25: aloitti David Cary * / int median_of_3 (int a, int b, int c) {int the_max = max (max (a , b), c); int the_min = min (min (a, b), c); // tarpeettoman fiksu koodi int the_median = the_max ^ the_min ^ a ^ b ^ c; return (the_median);} int uusin = 0; int viimeinen = 0; int vanhin = 0; mitätön asennus () {Sarja.alku (9600); // lue ensimmäinen arvo, alusta sen kanssa. vanhin = satunnainen (200); viimeaikainen = vanhin; uusin = viimeisin; Serial.println ("mediaansuodatinesimerkki:");} void loop () {
// pudota vanhin arvo ja muutos uusimmassa arvossa vanhin = viimeisin; viimeaikainen = uusin; uusin = satunnainen (200); Serial.print ("uusi arvo:"); Serial.print (uusin, DEC); int mediaani = mediaanin_of_3 (vanhin, viimeisin, uusin); Serial.print ("tasoitettu arvo:"); Sarjaprintti (mediaani, DEC); Sarja.println (""); viive (5000);}  
#3
+4
TheDoctor
2014-02-16 20:45:56 UTC
view on stackexchange narkive permalink

Oletko kokeillut alipäästösuodatinta? Löysin esimerkin täältä ja toisen täältä.

Molemmissa kirjastoissa on luettelo valitsemastasi analogisesta anturista luettavasta datasta on keskiarvo. Jokainen uusi anturin arvo lisätään luetteloon ja viimeinen heitetään pois tällä tavoin:

  List: 3 4 3 3 4 3 5 3 2 3 4 3 uusi lukema lisätty. vanha heitetty pois / - / - Luettelo: 5 3 4 3 3 4 3 5 3 2 3 4 luettelon keskiarvo  
Melkein mitä yksinkertainen [FIR-suodatin] (https://fi.wikipedia.org/wiki/Finite_impulse_response) tekee kaikkien napautusarvojen ollessa 1. Hanat-arvojen viilentäminen voi parantaa signaalia edelleen, mutta vaatii suurempaa matematiikkaa.
Huomaa: Toinen linkki laskee [kumulatiivisen liukuvan keskiarvon] (http://en.wikipedia.org/wiki/Moving_average#Cumulative_moving_average), joka ei ole käytännöllinen valinta toimilaitteen ohjaukselle, varsinkin sellainen, johon voi liittyä usein käynnistyksiä ja pysäytyksiä. Tasoitettu signaali seuraa aina varsinaisen signaalin huippuarvoa.
#4
+2
akellyirl
2014-02-16 22:34:31 UTC
view on stackexchange narkive permalink

Voit suodattaa tämän digitaalisesti alipäästösuodattimella:

  int valueFilt = (1-0,99) * arvo + 0,99 * valueFilt;  

Muuta raja-arvoa muuttamalla 0,99 (lähempänä arvoa 1,0 on matalampi taajuus). Kyseisen arvon todellinen lauseke on exp (-2 * pi * f / fs), jossa f on haluamasi rajataajuus ja fs on taajuus, jolla tiedoista otetaan näyte.

Toinen tyyppi "digitaalinen suodatin" "on tapahtumasuodatin. Se toimii hyvin datalla, jolla on poikkeavuuksia; esim. 9,9,8,10,9,25,9. Tapahtumasuodatin palauttaa yleisimmän arvon. Tilastollisesti tämä on tila.

Tilastolliset keskiarvot, kuten Keskiarvo, Tila jne., Voidaan laskea käyttämällä Arduinon keskikirjastoa.

Esimerkki otetusta Arduino-kirjastosivulla viitattiin:

  #include <Average.h> # define CNT 600int d [CNT]; void setup () {Serial.begin (9600);} void loop () {int i; for (i = 0; i<CNT; i ++) {d [i] = satunnainen (500); } Sarja.tulos ("Tarkoitus:"); Sarjapaino (keskiarvo (d, CNT), DEC); Serial.print ("Tila:"); Sarjaprintti (tila (d, CNT), DEC); Sarja.tulos ("Max:"); Sarjaprintti (suurin (d, CNT), DEC); Sarjaprintti ("Min:"); Sarjaprintti (vähintään (d, CNT), DEC); Serial.print ("Keskihajonta:"); Sarjaprintti (stddev (d, CNT), 4); Sarja.println (""); Sarja.println (""); viive (5000);}  
Huomaa, että tämä on hyvin hidasta, koska se tekee paljon implisiittisiä heittoja kellumaan ja takaisin.


Tämä Q & A käännettiin automaattisesti englanniksi.Alkuperäinen sisältö on saatavilla stackexchange-palvelussa, jota kiitämme cc by-sa 3.0-lisenssistä, jolla sitä jaetaan.
Loading...