Programowy filtr dolnoprzepustowy

Programowy filtr dolnoprzepustowy
  • Rejestracja: dni
  • Ostatnio: dni
0

Przeglądam kody w języku c i widzę taką funkcję.

Kopiuj
static float low_pass_filter(float signal, float input, float f)
{	
	return ((1-f)*signal + f*input);
} 

i takie wywołanie

Kopiuj
 psi_ref = low_pass_filter(psi, psi_ref, 0.95)

Jaki jest cel stosowania takiego filtru? Co on robi? Dzięki za wytłumaczenie.

Wibowit
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: XML Hills
0

Kod wygląda mi na interpolację liniową. Więcej ciężko wywróżyć z tak małego kawałka kodu.

Endrju
  • Rejestracja: dni
  • Ostatnio: dni
0

Nie no, to ma być filtr RC. Tylko jak dla mnie trochę dziwny. Jeżeli signal to jest obecna wartość a input to poprzednia, to współczynniki są na odwrót.

vpiotr
  • Rejestracja: dni
  • Ostatnio: dni
0

Na razie to nie jest filtr tylko mikser.
Jak dodasz opis co to jest psi, psi_ref to można będzie opisać jak działa to jako filtr.

MarekR22
  • Rejestracja: dni
  • Ostatnio: dni
0

nazwa sugeruje całkiem inną funkcjonalność niż zapewnia kod.
To jest jakaś średnia ważona (f ot waga drugiego elementu input).

Od low_pass_filter oczekiwałbym na wejściu jakieś tablicy opisującej jakiś przebieg i ma zwracać tablicę z przefiltrowanym przebiegiem.
Albo jeśli to jest C++ jakiś obiekt, który przetwarza kolejne dostarczane wartości i zwraca wartość przefiltrowaną (poprzednie wartości mają wpływ na wynik dla bieżącej wartości).

  • Rejestracja: dni
  • Ostatnio: dni
0

W zamieszczonym przeze mnie kodzie w temacie był mał błąd, zamiast input, powinno być output. Niby tylko nazwa zmiennej a może kogoś zmylić. Inaczej było w pliku .h a inczej w .c.

Kopiuj
static float low_pass_filter(float signal, float **output**, float f)
{    
    return ((1-f)*signal + f***output**);
} 

psi to wartość odczytana z enkodera obrotowego. Jak działa enkoder obrotowy wiem, ale co dzieje się w funkcji już nie.

Kopiuj
psi=(float)get_count(PORT_ENC);

psi_ref to zmienna dalej używana w programie.

vpiotr
  • Rejestracja: dni
  • Ostatnio: dni
0

Zakładając, że wygląda to mniej więcej tak:

Kopiuj
psi=(float)get_count(PORT_ENC);
psi_ref = psi;
psi_ref = low_pass_filter(psi, psi_ref, 0.95);
//---
psi=(float)get_count(PORT_ENC);
psi_ref = low_pass_filter(psi, psi_ref, 0.95);
//---
psi=(float)get_count(PORT_ENC);
psi_ref = low_pass_filter(psi, psi_ref, 0.95);
//....

To tak, jest to filtr dolnoprzepustowy. Po prostu na wartość sygnału mają mały wpływ chwilowe wachnięcia i żeby sygnał się znacząco zmienił (wzrósł, zmalał) musi być przetworzone n próbek.

Tu masz ilustrację jak to działa:
http://elektronikab2b.pl/images/stories/42692:tech_filtr2.jpg

  • Rejestracja: dni
  • Ostatnio: dni
0

Tak to właśnie wygląda. Zapomniałem napisać, że funkcje get_count i low_pass_filter są wywoływane w pętli while(1);

U4
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 8
0

Dla ciekawskich
Wzór postaci:
(1-a) * x + a * y
to ogólnie rzecz biorąc wzór na filtr komplementarny. "a" jest wagą z przedziału 0-1, x i y - wiadomo - zmienne.

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.