Czy są jakieś biblioteki wygładzające sygnał dla Arduino?


14

Pracuję nad robotem mobilnym sterowanym za pomocą bezprzewodowego łącza 2,4 GHz. Odbiornik jest podłączony do Arduino Uno, który służy na pokładzie jako główny kontroler. Najbardziej krytyczny (i główny) kanał wejściowy pochodzący z odbiornika wytwarza bardzo głośny sygnał, co prowadzi do wielu drobnych zmian na wyjściu siłowników, nawet jeśli nie są one potrzebne.

wprowadź opis zdjęcia tutaj
                    Rysuj dane wejściowe Arduino w odstępie 30 sekund.

Szukam bibliotek, które mogą wykonywać wydajne wygładzanie. Czy są dostępne biblioteki wygładzania sygnału dla Arduino (Uno)?


Nie wiem, czy możesz znaleźć tego rodzaju biblioteki, ale obawiam się, że mogą one wymagać dużej mocy procesora dla Arduino. W miarę możliwości wolałbym zastosować rozwiązanie elektroniczne (filtr dolnoprzepustowy).
jfpoilpret

Jestem z Jfpoilpret w tej sprawie. Myślę, że potrzebujesz rozwiązania elektronicznego. Wypróbowałbym kondensator stabilizujący (prosty filtr dolnoprzepustowy). Zakładam, że używasz kanału ADC, więc powinieneś wprowadzić ograniczenie z tego kanału do ziemi. Zacznij od wartości około 100pf i zacznij od tego miejsca.
John b

Odpowiedzi:


8

Microsmooth to lekka biblioteka wygładzania sygnałów, którą obecnie opracowuję.

Nadal nad tym pracujemy, a jego celem jest uczynienie go lekkim pod względem pamięci i szybkości. Biblioteka zawiera wiele filtrów do wygładzania:

  • Prosta średnia ruchoma
  • Wykładnicza średnia ruchoma
  • Skumulowana średnia ruchoma
  • Filtr Savitzky Golay
  • Algorytm Ramera Douglasa Peckera
  • Filtr Kalmogorov Zurbenko

Aby skorzystać z biblioteki, pobierz ją i dodaj do katalogu źródłowego. Dodaj również następujący wiersz do pliku źródłowego:

#include "microsmooth.h"

Cześć, mam problem z użyciem twojej biblioteki. Nie użyłbyś „Importuj bibliotekę ...” do importowania biblioteki, prawda? Próbowałem po prostu skopiować źródło do mojego folderu .ino, ale pojawiają się błędy związane z brakiem pliku automicrosmooth.h, brakiem numeru seryjnego i brakiem ';'. Czy ta biblioteka nadal działa? Dzięki
waspinator,

@waspinator Przepraszamy za to. Naprawiono błędy. Dziękujemy za opinię!
asheeshr

7

Wydaje mi się, że w twoim hałaśliwym sygnale widzę wiele skoków hałasu pojedynczej próbki.

Filtr środkowy lepiej pozbywa się skoków hałasu pojedynczej próbki niż jakikolwiek filtr liniowy. (Jest lepszy niż jakikolwiek filtr dolnoprzepustowy, średnia ruchoma, ważona średnia ruchoma itp. Pod względem czasu odpowiedzi i zdolności do ignorowania takich pojedynczych próbek wartości szczytowych hałasu).

W rzeczywistości istnieje wiele bibliotek wygładzających sygnał dla Arduino, z których wiele zawiera filtr mediany.

biblioteki wygładzające sygnał na arduino.cc:

biblioteki wygładzające sygnał w github:

Czy coś takiego działałoby w twoim robocie? (Mediana z 3 wymaga bardzo małej mocy procesora, a zatem szybkiego):

/*
median_filter.ino
2014-03-25: started by 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 );
    // unnecessarily clever code
    int the_median = the_max ^ the_min ^ a ^ b ^ c;
    return( the_median );
}

int newest = 0;
int recent = 0;
int oldest = 0;

void setup()
{
    Serial.begin(9600);
    // read first value, initialize with it.
    oldest = random(200);
    recent = oldest;
    newest = recent;
    Serial.println("median filter example: ");
}

void loop()
{
    // drop oldest value and shift in latest value
    oldest = recent;
    recent = newest;
    newest = random(200);

    Serial.print("new value: ");
    Serial.print(newest, DEC);

    int median = median_of_3( oldest, recent, newest );

    Serial.print("smoothed value: ");
    Serial.print(median, DEC);
    Serial.println("");

    delay(5000);
}

4

Czy próbowałeś filtra dolnoprzepustowego? Znalazłem tutaj inny przykład tutaj .

Obie biblioteki mają listę danych odczytywanych z wybranego czujnika analogowego, który jest uśredniany. Każda nowa wartość czujnika jest dodawana do listy, a ostatnia jest wyrzucana w następujący sposób:

List: 3 4 3 3 4 3 5 3 2 3 4 3 
new reading added. old one thrown out
      /--                     /--
List: 5 3 4 3 3 4 3 5 3 2 3 4
list averaged

Prawie to, co robi prosty filtr FIR przy wszystkich wartościach tap ustawionych na 1. Fiddling przy wartości tapów może jeszcze bardziej poprawić sygnał, ale wymaga wyższej matematyki.
jippie

Uwaga: Drugie ogniwo oblicza skumulowaną średnią ruchomą, która nie jest praktycznym wyborem do sterowania siłownikiem, zwłaszcza takim, który może obejmować częste uruchamianie i zatrzymywanie. Wygładzony sygnał zawsze będzie śledził wartość szczytową rzeczywistego sygnału o całkiem margines.
asheeshr

2

Możesz to filtrować cyfrowo za pomocą filtra dolnoprzepustowego:

int valueFilt = (1-0.99)*value + 0.99*valueFilt;

Zmień 0,99, aby zmienić częstotliwość odcięcia (bliższa 1.0 to niższa częstotliwość). Rzeczywistym wyrażeniem tej wartości jest exp (-2 * pi * f / fs), gdzie f jest pożądaną częstotliwością odcięcia, a fs jest częstotliwością, z której próbkowane są dane.

Innym rodzajem „filtra cyfrowego” jest filtr zdarzeń. Działa dobrze na danych, które mają wartości odstające; np. 9,9,8,10,9,25,9. Filtr zdarzeń zwraca najczęstszą wartość. Statystycznie jest to tryb.

Średnie statystyczne, takie jak średnia, tryb itp. Można obliczyć za pomocą Biblioteki średniej Arduino .

Przykład wzięty ze strony Arduino Library, o którym mowa:

#include <Average.h>
#define CNT 600
int d[CNT];

void setup()
{
  Serial.begin(9600);
}

void loop()
{
  int i;

  for(i=0; i<CNT; i++)
  {
    d[i] = random(500);
  }  

  Serial.print("Mean: ");
  Serial.print(mean(d,CNT),DEC);
  Serial.print(" Mode: ");
  Serial.print(mode(d,CNT),DEC);
  Serial.print(" Max: ");
  Serial.print(maximum(d,CNT),DEC);
  Serial.print(" Min: ");
  Serial.print(minimum(d,CNT),DEC);
  Serial.print(" Standard deviation: ");
  Serial.print(stddev(d,CNT),4);
  Serial.println("");
  Serial.println("");

  delay(5000);
}

1
Pamiętaj, że będzie to bardzo powolne, ponieważ wykonuje wiele niejawnych rzutów, aby unosić się i wracać.
Connor Wolf,
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.