2012-07-14 20 views

Odpowiedz

11

Potrzebowałem wyodrębnić sygnał z bardzo hałaśliwych danych o zużyciu procesora. Oto filtr mediana Jeffa McClintocka ...

Inicjalizuj średnią i medianę na zero, następnie dla każdej próbki "cal" medianę w kierunku próbki wejściowej o mały przyrost. Ostatecznie ustabilizuje się w punkcie, w którym około 50% próbek wejściowych jest większych, a 50% jest mniejszych niż mediana. Wielkość inkrementu powinna być proporcjonalna do rzeczywistej mediany. Ponieważ nie znamy rzeczywistej mediany, używam średniej jako przybliżonej. Wielkość kroku jest obliczana jako 0,01 wartości szacunkowej. Mniejsze rozmiary kroku są bardziej dokładne, ale wymagają więcej czasu.

float median = 0.0f; 
float average = 0.0f; 

// for each sample 
{ 
    average += (abs(sample) - average) * 0.1f; // rough running average magnitude. 
    median += _copysign(average * 0.01, sample - median); 
} 

enter image description here

+0

Chociaż to rozwiązanie jest bardzo wydajny, uwaga z następujących zastrzeżeń: 1) szybkość zbieżności zależy od amplitudy sygnału (porównanie odpowiedzi krok z różnych przesunięć i amplitudy), które nie są zbieżne na sygnał blisko zera! 2) dla prawie stałego sygnału wejściowego ten szacunek wprowadza fluktuacje z amplitudą "średniej * 0,01" i częstotliwością próbkowania 3) ugięcia na krótkich impulsach (których mediana początkowo nie ma, stąd popularność jako filtr pieprzu i szumu) – orzechow

+0

Tak, poprawa w usuwaniu jittera polega na ograniczeniu wielkości kroku (średnio * 0.01) do nie większego niż sygnał błędu (próbka - mediana), tj .: std :: max (średnia * 0.01, fabs (sample - mediana)). –

Powiązane problemy