Programowy filtr dolnoprzepustowy

0

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

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

i takie wywołanie

 psi_ref = low_pass_filter(psi, psi_ref, 0.95)

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

0

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

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.

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.

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).

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.

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.

psi=(float)get_count(PORT_ENC);

psi_ref to zmienna dalej używana w programie.

0

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

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

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);

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.

1 użytkowników online, w tym zalogowanych: 0, gości: 1