Kérdés:
Van-e jelsimító könyvtár az Arduino számára?
asheeshr
2014-02-16 19:57:38 UTC
view on stackexchange narkive permalink

Egy mobil roboton dolgozom, amelyet vezeték nélküli 2,4 GHz-es kapcsolaton keresztül lehet irányítani. A vevőegység az Arduino Uno-hoz csatlakozik, amely a fedélzeten szolgál fő vezérlőként. A vevőkészüléktől érkező legkritikusabb (és legfontosabb) bemeneti csatorna nagyon zajos jelet produkál, ami sok kisebb változáshoz vezet a működtetők kimenetében, bár ezekre nincs szükség.

 enter image description here Az Arduino bemenetének ábrázolása 30 másodperces intervallumban. 

Olyan könyvtárakat keresek, amelyek hatékony simítást tudnak végrehajtani. Van-e jelsimító könyvtár az Arduino (Uno) számára?

Nem tudom, talál-e ilyen könyvtárakat, de attól tartok, hogy ezeknek nagy CPU-energiára lehet szükségük egy Arduino számára. Inkább elektronikus megoldással (aluláteresztő szűrővel) járok, ha lehetséges.
Jfpoilpret vagyok ebben. Szerintem szüksége van egy elektronikus megoldásra. Kipróbálnék egy stabilizációs kondenzátort (egyszerű aluláteresztő szűrőt). Feltételezem, hogy adc csatornát használ, ezért ennek a csatornának a földre kell tenni egy sapkát. Kezdje a 100pf körüli értékekkel, és onnan dolgozzon fel.
Négy válaszokat:
asheeshr
2014-03-07 20:14:24 UTC
view on stackexchange narkive permalink

Microsmooth egy könnyű jelkiegyenlítő könyvtár, amelyet jelenleg fejlesztem.

Még mindig dolgoznak rajta, és célja, hogy memóriája szempontjából könnyű és gyors legyen . A könyvtár több szűrőt biztosít a simításhoz:

  • egyszerű mozgóátlag
  • exponenciális mozgóátlag
  • kumulatív mozgóátlag
  • Savitzky Golay Szűrés
  • Ramer Douglas Pecker algoritmus
  • Kalmogorov Zurbenko szűrő

A könyvtár használatához töltse le és adja hozzá a forrás könyvtárhoz. Adja hozzá a következő sort a forrásfájljához:

  #include "microsmooth.h"  
Szia, gondjaim vannak a könyvtárad használatával. Nem használná a "Könyvtár importálása ..." lehetőséget a könyvtár importálásához? Megpróbáltam csak átmásolni a forrást az .ino mappámba, de hibákat kapok az automicrosmooth.h hiányában, a Sorozat nincs meghatározva, és hiányzik a ';'. Még működik ez a könyvtár? Köszönöm
@waspinator Sajnálom. Javítva a hibákat. Köszönöm a visszajelzést!
David Cary
2014-03-26 22:37:56 UTC
view on stackexchange narkive permalink

Azt hiszem, sok egymintás zajcsúcsot látok a zajos jelében.

A mediánszűrő jobban képes megszabadulni az egymintás zajtüskéktől, mint bármely lineáris szűrő. (Jobb mint bármelyik aluláteresztő szűrő, mozgóátlag, súlyozott mozgóátlag stb. a válaszidejét és az ilyen, egyetlen mintából származó zajcsúcs-eltéréseket figyelmen kívül hagyó képességét tekintve).

Valójában sok jel van -kímélő könyvtárak az Arduino számára, amelyek közül sok medián szűrőt tartalmaz.

jelet simító könyvtárak az arduino.cc címen:

jel-simító könyvtárak a github-nál:

Valami hasonló működne a robotjában? (A 3-as érték mediánja nagyon kevés CPU-energiát igényel, ezért gyors):

  /*median_filter.ino2014-03-25: David Cary indította * / int median_of_3 (int a, int b, int c) {int the_max = max (max (a , időszámításunk előtt ); int the_min = min (min (a, b), c); // feleslegesen okos kód int the_median = the_max ^ the_min ^ a ^ b ^ c; return (the_median);} int legújabb = 0; int legújabb = 0; int legidősebb = 0; érvénytelen beállítás () {Serial.begin (9600); // olvassa el az első értéket, inicializálja vele. legidősebb = véletlenszerű (200); közelmúlt = legidősebb; legújabb = legújabb; Serial.println ("medián szűrő példa:");} void loop () {
// a legrégebbi érték elvetése és a legutóbbi érték eltolódása legrégebbi = legújabb; legújabb = legújabb; legújabb = véletlenszerű (200); Serial.print ("új érték:"); Serial.print (legújabb, DEC); int medián = medián_of_3 (legidősebb, legújabb, legújabb); Serial.print ("simított érték:"); Soros nyomtatás (medián, DEC); Soros.println (""); késleltetés (5000);}  
TheDoctor
2014-02-16 20:45:56 UTC
view on stackexchange narkive permalink

Kipróbálta az aluláteresztő szűrőt? Találtam egy példát itt és egy másikat itt.

Mindkét könyvtár tartalmaz egy listát az Ön által választott analóg érzékelőből olvasott adatokról átlagolt. Minden új érzékelőérték hozzáadódik a listához, és az utolsó kidobásra kerül, így:

  List: 3 4 3 3 4 3 5 3 2 3 4 3 új olvasmány hozzáadva. a régi kidobott / - / - lista: 5 3 4 3 3 4 3 5 3 2 3 4 lista átlaga  
Nagyjából mit csinál egy egyszerű [FIR szűrő] (https://en.wikipedia.org/wiki/Finite_impulse_response), ha az összes koppintás értéke 1.
Megjegyzés: A második link kiszámítja a [kumulatív mozgóátlagot] (http://en.wikipedia.org/wiki/Moving_average#Cumulative_moving_average), amely nem praktikus választás a működtető vezérléséhez, különösen egy olyan link, amely gyakori indítással és leállítással járhat. A kiegyenlített jel mindig meglehetősen nagy különbséggel követi a tényleges jel csúcsértékét.
akellyirl
2014-02-16 22:34:31 UTC
view on stackexchange narkive permalink

Ezt digitálisan szűrheti aluláteresztő szűrővel:

  int valueFilt = (1-0,99) * érték + 0,99 * valueFilt;  

A vágási frekvencia megváltoztatásához változtassa meg a 0,99 értéket (az 1.0-hoz közelebb van az alacsonyabb frekvencia). Ennek az értéknek a tényleges kifejezése az exp (-2 * pi * f / fs), ahol f a kívánt cutoff frekvencia, és fs az a frekvencia, amelyről az adatokat mintavételezik. "egy eseményszűrő. Jól működik azokon az adatokon, amelyeknek kiugró értékei vannak; például. 9,9,8,10,9,25,9. Egy eseményszűrő adja vissza a leggyakoribb értéket. Statisztikailag ez az üzemmód.

Az olyan statisztikai átlagok, mint a Mean, Mode stb., Kiszámolhatók az Arduino Average Library segítségével.

Egy példa az Arduino Library oldal a következőkre hivatkozott:

  #include <Average.h> # define CNT 600int d [CNT]; void setup () {Serial.begin (9600);} void loop () {int én; for (i = 0; i<CNT; i ++) {d [i] = véletlenszerű (500); } Soros nyomtatás ("Mean:"); Soros nyomtatás (átlag (d, CNT), DEC); Serial.print ("Mód:"); Soros nyomtatás (mód (d, CNT), DEC); Serial.print ("Max:"); Soros nyomtatás (maximum (d, CNT), DEC); Serial.print ("Min:"); Soros nyomtatás (minimum (d, CNT), DEC); Serial.print ("Szórás:"); Soros nyomtatás (stddev (d, CNT), 4); Soros.println (""); Soros.println (""); késleltetés (5000);}  
Vegye figyelembe, hogy ez nagyon lassú lesz, mivel rengeteg implicit dobást hajt végre lebegni és vissza.


Ezt a kérdést és választ automatikusan lefordították angol nyelvről.Az eredeti tartalom elérhető a stackexchange oldalon, amelyet köszönünk az cc by-sa 3.0 licencért, amely alatt terjesztik.
Loading...