Jak zawsze, niektóre narzędzia są lepsze od innych.
Filtry średniej ruchomej (MA) mogą być używane do wygładzania danych i są FIR. Są one najprostszym filtrem, jaki możesz wymyślić, i sprawdzają się w wielu zadaniach, o ile nie próbujesz modelować nagłych skoków lub trendów wielomianowych. Pamiętaj jednak, że są to po prostu filtry dolnoprzepustowe, więc działają najlepiej, gdy dane, na których Ci zależy w sygnale, mają niską częstotliwość i dość wąskie pasmo.
Filtry Savitzky-Golay (SG) to specjalna grupa filtrów FIR, które zasadniczo dopasowują wielomian do twoich szeregów czasowych, gdy splot przesuwa się wzdłuż sygnału. Filtry SG są przydatne w przypadku sygnałów, w których ważne są niekoniecznie niskie częstotliwości i dość wąskie pasmo.
Myślę, że przekonasz się, że jeśli dokładnie przeczytasz stronę Wikipedii, do której odsyłałeś, to dość rygorystycznie wyjaśnia różnicę między filtrami SG i MA. Pamiętaj jednak: w końcu oba są tylko narzędziami do robienia podobnych rzeczy, od Ciebie zależy, kiedy wybierzesz odpowiednie narzędzie
EDYCJA :
Ponieważ wydaje się, że istnieje pewne zamieszanie, że filtry SG są w jakiś sposób „adaptacyjne” na poziomie podstawowym, zamieściłem prosty przykład MATLAB. Jak zauważył Dan, można je dostosować, ale ich podstawowe wdrożenie często nie jest. Sprawdzając kod, zobaczysz, że jest to po prostu wyszukiwanie matrycy ze specjalną obsługą. Nic w tym filtrze nie jest „adaptacyjne” w tradycyjnym znaczeniu, po prostu wybierasz dopasowanie wielomianowe i długość, na której ten wielomian będzie dopasowany do sygnału poprzez splot; SG jest niezbędnym FIR. Skrypt, który mam poniżej, tworzy tę fabułę:
Patrząc na tę figurę, można zauważyć, że MA i SG zasadniczo osiągają to samo, ale z kilkoma ważnymi różnicami:
- MA świetnie sobie radzi z tłumieniem hałasu, ale słabo radzi sobie z przechwytywaniem przejściowych skoków sygnału. Możemy tłumić jeszcze więcej szumów, zwiększając długość filtra, ale wtedy będzie on działał jeszcze gorzej na stanach nieustalonych; efekt ten będzie postrzegany jako „rozmazywanie” w pobliżu wszelkich stanów przejściowych, które powinieneś zobaczyć na pokazanym rysunku.
- SG świetnie sobie radzi z przechwytywaniem stanów nieustalonych sygnału, ale nie tak dobrze tłumi szumy (przynajmniej w porównaniu z MA tej samej wielkości). Możemy poprawić tłumienie szumów w pobliżu stanów nieustalonych przez zwiększenie długości ramki, ale wprowadzi to dzwonienie analogiczne do zjawiska Gibb'a w pobliżu jakichkolwiek stanów nieustalonych.
Aby lepiej zrozumieć działanie tych filtrów, zachęcam do wzięcia kodu tutaj i manipulowania nim oraz sprawdzenia, jak działają wszystkie poszczególne części filtra SG.
Kod dla przykładu MATLAB:
% Generate a signal "s" that has square waves, and scale it with a
% polynomial of order 5
up = 1*ones(1,100);
down = zeros(1,150);
s = [down down up up down up down up down up up up down down down down down];
n = numel(s);
nn = linspace(0,4,numel(s));
s = s .* (nn .^5);
sn = (s + 4*randn(size(s))).';
% smooth it with SMA of length 15
sz = 15;
h = 1/sz * ones(1,sz);
sn_sma = conv(sn,h,'same');
% smooth it with sgolay of frame length 15
m = (sz-1)/2;
% look up the SG matrix for this order and size
B = sgolay(5, sz);
% compute the steady state response for the signal, i.e. everywhere that
% isnt the first or last "frame" for the SG filter
steady = conv(sn, B(m+1,:), 'same');
% handle the transiet portion at the start of the signal
y_st = B(1:m,:)*sn(1:sz);
% handle the transient portion at the end of the signal
y_en = B(sz -m+1 : sz, :) * sn(n - sz+1:n);
% combine our results
sn_sg = steady;
sn_sg(1:m) = y_st;
sn_sg(n-m+1:n) = y_en;
% plots
figure(1);
hold off;
plot(sn,'Color',[0.75 0.75 0.75]);
hold on;
plot(sn_sma,'b');
plot(sn_sg,'r');
legend('Noisy Signal','MA Smoothing','SG Smoothing, order 5','Location','NorthWest');
UWAGA
moja poprzednia odpowiedź (przed tą edycją) oznaczająca filtr Savitzky-Golay (SG) jako nieliniową zależną od danych wejściowych zmienną w czasie była błędna z powodu przedwczesnej błędnej interpretacji sposobu, w jaki filtr Savitzky-Golay (SG) oblicza swoje dane wyjściowe zgodnie z podanym linkiem wiki. Więc teraz poprawiam to z korzyścią dla tych, którzy chcieliby zobaczyć, w jaki sposób filtry SG są implementowane przez filtrowanie FIR-LTI. Dzięki @MattL. za jego poprawkę, wielki link, który podał, i cierpliwość, której miał (czego nigdy nie mogłem wykazać) podczas mojego dochodzenia w tej sprawie. Chociaż szczerze wolę bardziej szczegółowy sprzeciw, który jednak nie jest konieczny. Należy również pamiętać, że poprawna odpowiedź to druga, ta służy jedynie dodatkowemu wyjaśnieniu właściwości LTI filtrów SG.
Nic dziwnego, że gdy ktoś (kto nigdy wcześniej nie korzystał z tych filtrów) stoi przed definicją filtra SG jako wielomianowego dopasowania LSE niskiego rzędu do danych , od razu doszedłby do wniosku, że są one zależne od danych, nieliniowe i zmienne w czasie (przesunięcie), filtry adaptacyjne.
Jednak procedura dopasowania wielomianu jest sprytnie interpretowana przez samych SG, tak że umożliwia całkowicie niezależne od danych, niezmienne w czasie, liniowe filtrowanie, dzięki czemu SG jest stałym filtrem LTI-FIR.
Poniżej znajduje się najkrótsze streszczenie z linku dostarczonego przez MattL. W celu uzyskania jakichkolwiek brakujących informacji zapoznaj się z oryginalnym dokumentem lub poproś o wyjaśnienie. Ale nie chciałbym tutaj reprodukować całego dokumentu.
Teraz rozważmy wartości danych wejściowych które są wyśrodkowane wokół i do którego chcemy dopasować wielomian rzędu , przy czym jest wskaźnikami czasu całkowitego:2 mln+ 1 x [ - M] , x [ - M+ 1 ] , . . . , X [ 0 ] , x [ 1 ] , . . . , x [ M] n = 0 p [ n ] N. n = - M, - M+ 1 , . . . , - 1 , 0 , 1 , . . . M.
Klasyczna procedura dopasowania wielomianu LSE oblicza te współczynniki aby znaleźć optymalny wielomian rzędu , który minimalizuje sumę kwadratów błędówzak N.t godz p [ n ]
nad podanym wektorem danych .x = [ x [ - M] , x [ - M+ 1 ] , . . . , X [ 0 ] , x [ 1 ] , . . . , x [ M] ]T.
Te optymalne współczynniki wielomianowe są uzyskiwane przez ustawienie pochodnej na zero:zak mi
Teraz dla tych, którzy są zaznajomieni z procedurą LIT Polyfit, po prostu napiszę wynikowe równanie macierzowe (z łącza), które definiuje optymalny zestaw współczynników:
Teraz oprzyjmy się na chwilę i przedyskutujmy tutaj punkt.
Jak wyraźnie wskazuje równanie (2), chociaż i są niezależne od danych wejściowych i zależą tylko od wskaźników czasu , optymalne współczynniki wielomianowe LSE zależą od danych wejściowych. Ponadto, także zależy od wielkości okna i porządku wielomianu . Ponadto, ponieważ okno przesuwa się wzdłuż danych wejściowych , współczynnik powinien zostać ponownie obliczony (zaktualizowany), a zatem będzie również zależny od czasu. Dokładnie tak zdefiniowano filtr SG w linku na stronie poniżej:A H n ak M N x[n] ak 2nd
... To (polifunkcja LSE) można powtórzyć dla każdej próbki danych wejściowych, za każdym razem wytwarzając nowy wielomian i nową wartość sekwencji wyjściowej y [n] ...
Jak więc pokonać tę zagadkową niespodziankę? Poprzez interpretację i zdefiniowanie wyjściowego filtru SG jako:
Filtr SG rzędu , dla każdej próbki , przyjmuje zestaw wejściowy i wytwarza pojedynczą próbkę wyjściową zdefiniowaną jako wielomian obliczony przy ; to znaczy,N n x[n] y[n] p[n] n=0
Oznacza to, że dla każdego zestawu wejściowego próbek (wyśrodkowanych wokół ) filtr SG wytwarza wynik oznaczony przez , który jest równoważny pojedynczemu współczynnikowi optymalnego LSE wielomian związany z tym konkretnym oknem próbek . Nawiasem mówiąc, gdy okno przesuwa się wzdłuż długości danych wejściowych, za każdym razem nowa próbka wyjściowa jest obliczana zgodnie z oknem próbek . Tutaj jest to filtr trzustkowy.2M+1 x[n] n=d y[n] a0 p[n] x[n] n=d y[d] x[d−M],x[d−M+1],...,x[d−1],x[d],x[d+1],...x[d+M]
Nadszedł czas, aby pokazać, że współczynnik jest uzyskiwany jako liniowa kombinacja wartości sygnału wejściowego w oknie , a wyjście filtra jest zatem liniową kombinacją wartości wejściowych . I to jest właśnie definicja splotu (LTI) przez filtr FIR; wyjście w czasie jest liniową kombinacją jego wejścia i współczynników filtra . Ale jakie są współczynniki filtra dla tego filtra SG? Zobaczmy.a0 x[n] y[n] x[n] n x[n] h[n]
Ponownie rozważ obliczenia :ak
z którego możemy zobaczyć, że pojedynczy współczynnik jest iloczynem iloczynu pierwszego wiersza z wektorem danych wejściowych ; to znaczy,a0 H x
gdzie w ostatniej równości zinterpretowaliśmy sumę iloczynu kropkowego jako sumę splotu, biorąc pod uwagę odpowiedź impulsową filtra SG na ,h[n]=H(0,−n)
dokładniej jest to odpowiedź impulsowa filtra SG rzędu o długości okna .N 2M+1
I całkowite wyjście filtra SG N-tego rzędu o rozmiarze okna , dla wejścia o długości jest uzyskiwane przez pojedynczy splot LTI z odpowiedzią impulsowąy[n] 2M+1 x[n] L hN[n]
KOMENTARZ
Fakt, że współczynniki wielomianowe zależą od danych wejściowych, nie wyklucza, że filtr może być FIR LTI. Ponieważ odpowiedź impulsowa może być zdefiniowana jako reprezentująca wynik do obliczenia z liniowych kombinacji próbek wejściowych. Liniowe kombinacje próbki sygnału są nieodłącznie dorozumiany przez iloczyn macierzy , który definiuje współczynniki optymalne z , a więc kombinacja liniowa również prowadzić w filtrze FIR LTI reprezentuje procedura dopasowania wielomianu LSE.ak h[n] y[n] x a=Hx ak p[n] ak h[n]
KOD MATLAB / OCTVE
Poniższego prostego MATLAB / OCTAVE można użyć do obliczenia odpowiedzi impulsowych filtra SG (Należy pamiętać, że jego wbudowany projektant SG może generować inny zestaw zgodnie z linkiem pdf)h[n] h[n]
Dane wyjściowe to:
Mam nadzieję, że to wyjaśnia problem.
źródło