NOTA
minha resposta anterior (antes desta edição) que indica o filtro Savitzky-Golay (SG) como um dependente não linear dos dados de entrada com variação de tempo estava errado, devido a uma interpretação incorreta prematura de como um filtro Savitzky-Golay (SG) calcula sua saída de acordo com o link wiki fornecido. Portanto, agora estou corrigindo isso para o benefício daqueles que também veriam como os filtros SG são implementáveis pela filtragem FIR-LTI. Graças a @MattL. por sua correção, o grande vínculo que ele forneceu e a paciência que ele tinha (que eu nunca poderia ter demonstrado) durante minha investigação do problema. Embora honestamente prefira uma objeção mais detalhada, que claramente não é necessária. Observe também que a resposta correta é a outra, esta é apenas para esclarecimentos adicionais das propriedades LTI dos filtros SG.
Agora, não é de surpreender que quando alguém (que nunca usou esses filtros antes) enfrenta a definição do filtro SG como um ajuste polinomial de LSE de baixa ordem para dados fornecidos, ele imediatamente salta para a conclusão de que esses dados são dependentes, não lineares e filtros adaptativos com variação de tempo (turno).
No entanto, o procedimento de ajuste polinomial é inteligentemente interpretado pelo próprio SG, de modo que permite uma filtragem linear completamente independente dos dados, invariável no tempo e possível de dados, tornando o SG um filtro LTI-FIR fixo.
Abaixo está um resumo mais curto do link fornecido por MattL. Para detalhes que parecem estar faltando, consulte o documento original ou peça esclarecimentos. Mas eu não gostaria de reproduzir todo o documento aqui.
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)
Agora, para aqueles que estão familiarizados com o procedimento polyfit LSE, simplesmente escreverei a equação da matriz resultante (no link) que define o conjunto ideal de coeficientes:
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⎤⎦⎥⎥⎥⎥⎥⎥⎥⎥⎥
Agora vamos recuar por um momento e discutir um ponto aqui.
AHnakMNx[n]ak2nd
... Este (o polifit LSE) pode ser repetido em cada amostra da entrada, produzindo sempre um novo polinômio e um novo valor da sequência de saída y [n] ...
Então, como superamos essa surpresa intrigante? Ao interpretar e definir a saída do filtro SG para o seguinte:
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]. Mas então, quais são os coeficientes de filtro para esse filtro SG? Vamos ver.
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]
COMENTE
akh[n]y[n]xa=Hxakp[n]akh[n]
CÓDIGO MATLAB / 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]');
A saída é:
Espero que isso esclareça a questão.