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+ 1x [ - M] , x [ - M+ 1 ] , . . . , X [ 0 ] , x [ 1 ] , . . . , x [ M]n = 0p [ n ]N.n = - M, - M+ 1 , . . . , - 1 , 0 , 1 , . . . M.
p [ n ] = ∑k = 0N.zaknk= a0+ a1n + a2)n2)+ . . . + aN.nN.
Klasyczna procedura dopasowania wielomianu LSE oblicza te współczynniki aby znaleźć optymalny wielomian rzędu , który minimalizuje sumę kwadratów błędówzakN.t godzp [ n ]
mi= ∑- MM.( p [ n ] - x [ n ] )2)
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:zakmi
∂mi∂zaja= 0 , dla i = 0 , 1 , . . , N (1)
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:
a=(ATA)−1ATx=Hx(2)
gdzie to wektor danych wejściowych, macierz LSE polyfit i o macierzy jest macierzą Chwilę (moce momentach czasowych całkowitych ); tzn. należy zauważyć, że zarówno jak i są niezależne od wartości danych wejściowych, ponieważ jest podane przez:x(2M+1)×1H2M+1NAnAHA
A=[αn,i]=⎡⎣⎢⎢⎢⎢⎢⎢⎢⎢⎢(−M)0(−M+1)0(0)0(M)0(−M)1(−M+1)1...(0)1...(M)1............(−M)N(−M+1)N(0)N(M)N⎤⎦⎥⎥⎥⎥⎥⎥⎥⎥⎥
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:AHnakMNx[n]ak2nd
... 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,Nnx[n]y[n]p[n]n=0
y[n]=y[0]=∑m=0Namnm=a0
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+1x[n]n=dy[n]a0p[n]x[n]n=dy[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.a0x[n]y[n]x[n]nx[n]h[n]
Ponownie rozważ obliczenia :ak
a=Hx
⎡⎣⎢⎢⎢⎢a0a1⋮aN⎤⎦⎥⎥⎥⎥=⎡⎣⎢⎢⎢⎢h(0,0)h(1,0)h(N,0)h(0,1)h(1,1)...h(0,1).........h(0,2M)h(1,2M)h(0,2M)⎤⎦⎥⎥⎥⎥⋅⎡⎣⎢⎢⎢⎢x[−M]x[−M+1]...x[M]⎤⎦⎥⎥⎥⎥
z którego możemy zobaczyć, że pojedynczy współczynnik jest iloczynem iloczynu pierwszego wiersza z wektorem danych wejściowych ; to znaczy,a0Hx
a0=H(0,n)⋅x=∑H(0,k)x[k]=H(0,−n)⋆x[n]
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 .N2M+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+1x[n]LhN[n]
y[n]=x[n]⋆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.akh[n]y[n]xa=Hxakp[n]akh[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]
% Savitzky-Golay Filter
%
clc; clear all; close all;
N = 3; % a0,a1,a2,a3 : 3rd order polynomial
M = 4; % x[-M],..x[M] . 2M + 1 data
A = zeros(2*M+1,N+1);
for n = -M:M
A(n+M+1,:) = n.^[0:N];
end
H = (A'*A)^(-1)* A'; % LSE fit matrix
h = H(1,:); % S-G filter impulse response (nancausal symmetric FIR)
figure,subplot(2,1,1)
stem([-M:M],h);
title(['Impulse response h[n] of Savitzky-Golay filter of order N = ' num2str(N), ' and window size 2M+1 = ' , num2str(2*M+1)]);
subplot(2,1,2)
plot(linspace(-1,1,1024), abs(fftshift(fft(h,1024))));
title('Frequency response magnitude of h[n]');
Dane wyjściowe to:
Mam nadzieję, że to wyjaśnia problem.