NOTA
la mia risposta precedente (prima di questa modifica) che indicava il filtro Savitzky-Golay (SG) come un input di dati non lineare, variabile nel tempo e dipendente era errata, a causa di un'interpretazione errata prematura di come un filtro Savitzky-Golay (SG) calcola il suo output secondo il link wiki fornito. Quindi ora lo sto correggendo a beneficio di coloro che vedrebbero anche come i filtri SG sono implementabili dal filtro FIR-LTI. Grazie a @MattL. per la sua correzione, l'ottimo collegamento che ha fornito e la pazienza che aveva (che non avrei mai potuto dimostrare) durante le mie indagini sulla questione. Sebbene io onestamente preferisco un'obiezione più dettagliata che non è chiaramente necessaria comunque. Si noti inoltre che la risposta corretta è l'altra, questa è solo per ulteriori chiarimenti sulla proprietà LTI dei filtri SG.
Ora non sorprende che quando qualcuno (che non ha mai usato quei filtri prima) affronti la definizione del filtro SG come un adattamento polinomiale LSE di ordine basso a determinati dati , salterebbe immediatamente alla conclusione che questi sono dipendenti dai dati, non lineari e filtri adattativi variabili nel tempo (shift).
Tuttavia, la procedura di adattamento polinomiale viene interpretata abilmente dagli stessi SG, in modo da consentire un filtro lineare completamente indipendente dai dati, invariante nel tempo, rendendo così SG come un filtro LTI-FIR fisso.
Di seguito è riportato un riepilogo più breve dal collegamento fornito da MattL. Per eventuali dettagli che sembrano mancare, consultare il documento originale o chiedere di chiarire. Ma non vorrei riprodurre qui l'intero documento.
2M+1x[−M],x[−M+1],...,x[0],x[1],...,x[M]n=0p[n]Nn=−M,−M+1,...,−1,0,1,...M
p[n]=∑k=0Naknk=a0+a1n+a2n2+...+aNnN
akNthp[n]
E=∑−MM(p[n]−x[n])2
x=[x[−M],x[−M+1],...,x[0],x[1],...,x[M]]T
akE
∂E∂ai=0 , for i=0,1,..,N(1)
Ora per coloro che hanno familiarità con la procedura polyfit LSE, scriverò semplicemente l'equazione della matrice risultante (dal collegamento) che definisce il set di coefficienti ottimale:
a=(ATA)−1ATx=Hx(2)
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⎤⎦⎥⎥⎥⎥⎥⎥⎥⎥⎥
Ora lasciamoci indietro per un momento e discutere un punto qui.
AHnakMNx[n]ak2nd
... Questo (LSE polyfit) può essere ripetuto ad ogni campione dell'ingresso, producendo ogni volta un nuovo polinomio e un nuovo valore della sequenza di uscita y [n] ...
Quindi, come possiamo superare questa sconcertante sorpresa? Interpretando e definendo l'output del filtro SG come segue:
Nnx[n]y[n]p[n]n=0
y[n]=y[0]=∑m=0Namnm=a0
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]
a0x[n]y[n]x[n]nx[n]h[n]. Ma allora, quali sono i coefficienti di filtro per questo filtro SG? Vediamo.
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]⎤⎦⎥⎥⎥⎥
a0Hx
a0=H(0,n)⋅x=∑H(0,k)x[k]=H(0,−n)⋆x[n]
h[n]=H(0,−n)
N2M+1
y[n]2M+1x[n]LhN[n]
y[n]=x[n]⋆hN[n]
COMMENTO
akh[n]y[n]xa=Hxakp[n]akh[n]
MATLAB / CODICE OCTVE
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]');
L'output è:
Spero che questo chiarisca il problema.