Jak napisać filtr dolnoprzepustowy w Java

Chcę napisać filtr dolnoprzepustowy wg. wzoru:

y(n) = 2y(n-1) - y(n-2) + x(n) - 2x(n 6) + x(n 12)

Kod funkcji odpowiedzialnej za to wygląda tak:

public static void lowPassFilter(int data[], int wynik[], int length)

   {

       int n=12;

       wynik[n-1]=0;

       wynik[n-2]=0;


       for (n=12; n < length; n++)

       {

        wynik[n]= 2 * wynik[n-1] - wynik [n-2] + data[n] - 2 * data [n-6] + data [n-12];

       }

   }

Jednak wynik jest zupełnie inny niż bym się spodziewał. Tutaj wygląd oryginalnego sygnału:

http://img401.imageshack.us/img401/3118/g68v.jpg

a tu po filtrowaniu:

http://img849.imageshack.us/img849/9499/6vu7.jpg

Sygnał ma coraz większe wartości co jest ewidentnym błędem. Ktoś ma pomysł o co chodzi?

podałeś bardzo mały kawałek kodu z którego nie wiele da się wywnioskować. Jeśli pytasz czy dobrze przepisałeś wzór matematyczny na kod Javy to tak. Jest według mnie ok.

Mógłbym się czepiać ogólnego stylu itp. ale to nie jest meritum problemu. Jeśli podasz więcej danych być może będzie łatwiej rozwiązać ten problem.

Nie wiem jakie inne dane Cię jeszcze interesują :slight_smile:

Reszta kodu to zapisywanie tego do pliku (żeby otrzymać wykresy).

Ten wzór jest dziwny, za bardzo się nie znam, ale przykładowo jak masz pierwszy obrót pętli:

data[n] = dużo

data[n-6] = 0

data[n-12] = dużo

czyli takie V jak rozumiem na wykresie to ten wzór w pierwszym obrocie zwróci ci: 0 - 0 + dużo - 0 + dużo, co ci da dużo. Tak to ma działać?

PS

http://en.wikipedia.org/wiki/Low-pass_filter

Tu jest inny wzór.

cała tablica data jest pełna danych, więc wszystko co jest data[n - X] da na początku dużo.

Tak jest zapisany wzór w publikacjach z których korzystałem. A że wynik[n] odnosi się do wcześniejszych pozycji (które nie są na początku jeszcze policzone) to podstawiam tam 0. Później w tablicy wynik również będzie “dużo”.

Ten filtr jest częścią większego algorytmu i o dziwo cały algorytm działa, choć prawdopodobnie ten filtr jest niepoprawny.