Otázka:
Existují nějaké knihovny pro vyhlazení signálu pro Arduino?
asheeshr
2014-02-16 19:57:38 UTC
view on stackexchange narkive permalink

Pracuji na mobilním robotu ovládaném bezdrátovým spojením 2,4 GHz. Přijímač je připojen k Arduino Uno, který slouží na palubě jako hlavní ovladač. Nejkritičtější (a hlavní) vstupní kanál vycházející z přijímače produkuje velmi hlučný signál, který vede ke spoustě drobných změn ve výstupu akčních členů, i když to není nutné.

 enter image description here Spiknutí vstupu Arduina ve 30sekundovém intervalu. 

Hledám knihovny, které by mohly účinně vyhlazovat. Existují nějaké knihovny pro vyhlazení signálu pro Arduino (Uno)?

Nevím, jestli můžete najít tento druh knihoven, ale obávám se, že pro Arduino bude možná potřeba hodně CPU. Raději bych šel s elektronickým řešením (dolní propust), pokud je to možné.
V tomto jsem s jfpoilpret. Myslím, že potřebujete elektronické řešení. Vyzkoušel bych stabilizační kondenzátor (jednoduchý dolní propust). Předpokládám, že používáte kanál adc, takže byste měli z tohoto kanálu nasadit víčko na zem. Začněte s hodnotami kolem 100 pf a pokračujte odtud.
čtyři odpovědi:
asheeshr
2014-03-07 20:14:24 UTC
view on stackexchange narkive permalink

Microsmooth je knihovna pro vyhlazení signálu s nízkou hmotností, kterou v současné době vyvíjím já.

Stále se na ní pracuje a cílem je, aby byla lehká z hlediska paměti a rychlá . Knihovna poskytuje několik filtrů pro vyhlazení:

  • Jednoduchý klouzavý průměr
  • Exponenciální klouzavý průměr
  • Kumulativní klouzavý průměr
  • Savitzky Golay Filtr
  • Algoritmus Ramera Douglase Peckera
  • Kalmogorov Zurbenko Filtr

Chcete-li použít knihovnu, stáhněte si ji a přidejte do zdrojového adresáře. Do zdrojového souboru přidejte také následující řádek:

  #include "microsmooth.h"  
Ahoj, mám potíže s používáním vaší knihovny. K importu knihovny byste nepoužili možnost „Importovat knihovnu ...“, že? Snažil jsem se jen zkopírovat zdroj do mé složky .ino, ale dostávám chyby ohledně chybějícího automicrosmooth.h, sériového čísla není definováno a chybí ';'. Je tato knihovna stále funkční? dík
@waspinator Omlouvám se za to. Opravené chyby. Děkuji za zpětnou vazbu!
David Cary
2014-03-26 22:37:56 UTC
view on stackexchange narkive permalink

Myslím, že ve vašem hlučném signálu vidím spoustu špiček šumu s jedním vzorkem.

Střední filtr lépe odstraňuje špičky šumu s jedním vzorkem než jakýkoli lineární filtr. (Je lepší než jakýkoli nízkoprůchodový filtr, klouzavý průměr, vážený klouzavý průměr atd., pokud jde o dobu odezvy a schopnost ignorovat takové odlehlé odchylky od jediného vzorku).

Ve skutečnosti existuje mnoho signálů -hladící knihovny pro Arduino, z nichž mnohé obsahují mediánový filtr.

knihovny pro vyhlazení signálu na arduino.cc:

knihovny pro vyhlazení signálu na github:

Chtělo by něco takového ve vašem robotu fungovat? (Medián ze 3 vyžaduje velmi malý výkon procesoru, a proto rychle):

  /*median_filter.ino2014-03-25: zahájil David Cary * / int median_of_3 (int a, int b, int c) {int the_max = max (max (a , před naším letopočtem ); int the_min = min (min (a, b), c); // zbytečně chytrý kód int the_median = the_max ^ the_min ^ a ^ b ^ c; návrat (the_median);} int nejnovější = 0; int nedávný = 0; int nejstarší = 0; void setup () {Serial.begin (9600); // přečíst první hodnotu, inicializovat s ní. nejstarší = náhodný (200); recent = nejstarší; nejnovější = poslední; Serial.println ("příklad středního filtru:");} void loop () {
// zrušit nejstarší hodnotu a posunout nejnovější hodnotu nejstarší = nedávný; recent = nejnovější; nejnovější = náhodný (200); Serial.print ("nová hodnota:"); Serial.print (nejnovější, DEC); int median = median_of_3 (nejstarší, poslední, nejnovější); Serial.print ("vyhlazená hodnota:"); Serial.print (medián, DEC); Serial.println (""); delay (5000);}  
TheDoctor
2014-02-16 20:45:56 UTC
view on stackexchange narkive permalink

Vyzkoušeli jste dolní propust? Našel jsem příklad zde další zde.

Obě tyto knihovny mají seznam dat, která jsou čtena z analogového snímače podle vašeho výběru, který je zprůměrováno. Každá nová hodnota snímače je přidána do seznamu a poslední je vyhozena, například takto:

  Seznam: 3 4 3 3 4 3 5 3 2 3 4 3 přidáno nové čtení. starý vyhoden / - / - Seznam: 5 3 4 3 3 4 3 5 3 2 3 4průměrný seznam  
Docela hodně, co dělá jednoduchý [filtr FIR] (https://en.wikipedia.org/wiki/Finite_impulse_response) se všemi hodnotami odboček nastavenými na 1. Fidling s hodnotami odboček může signál dále vylepšit, ale vyžaduje vyšší matematiku.
Poznámka: Druhý odkaz vypočítává [kumulativní klouzavý průměr] (http://en.wikipedia.org/wiki/Moving_average#Cumulative_moving_average), což není praktická volba pro ovládání akčních členů, zejména těch, které mohou zahrnovat časté spouštění a zastavování. Vyhlazený signál bude vždy značně zvyšovat špičkovou hodnotu skutečného signálu.
akellyirl
2014-02-16 22:34:31 UTC
view on stackexchange narkive permalink

Toto můžete digitálně filtrovat pomocí dolní propusti:

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

Změňte 0,99 pro změnu mezní frekvence (blíže k 1,0 je nižší frekvence). Skutečný výraz pro tuto hodnotu je exp (-2 * pi * f / fs), kde f je požadovaná mezní frekvence a fs je frekvence, na které jsou data vzorkována.

Další typ „digitálního filtru“ "je filtr událostí. Funguje dobře na datech, která mají odlehlé hodnoty; např. 9,9,8,10,9,25,9. Filtr událostí vrací nejčastější hodnotu. Statisticky se jedná o režim.

Statistické průměry, jako je průměr, režim atd., Lze vypočítat pomocí průměrné knihovny Arduino.

Příklad převzatý z stránka Arduino Library uvedená:

  #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] = random (500); } Serial.print ("Průměr:"); Sériový tisk (průměr (d, CNT), DEC); Serial.print ("Režim:"); Serial.print (režim (d, CNT), DEC); Serial.print ("Max:"); Serial.print (maximum (d, CNT), DEC); Serial.print ("Min:"); Serial.print (minimum (d, CNT), DEC); Serial.print ("Standardní odchylka:"); Serial.print (stddev (d, CNT), 4); Serial.println (""); Serial.println (""); delay (5000);}  
Všimněte si, že to bude velmi pomalé, protože to dělá spoustu implicitních vrhání na float a zpět.


Tyto otázky a odpovědi byly automaticky přeloženy z anglického jazyka.Původní obsah je k dispozici na webu stackexchange, za který děkujeme za licenci cc by-sa 3.0, pod kterou je distribuován.
Loading...