NOTA
mi respuesta anterior (antes de esta edición) denotaba que el filtro Savitzky-Golay (SG) como un dato de entrada no lineal y variable en el tiempo era incorrecto, debido a una interpretación errónea prematura de cómo un filtro Savitzky-Golay (SG) calcula su salida de acuerdo con el enlace wiki proporcionado. Así que ahora lo estoy corrigiendo para beneficio de aquellos que también verían cómo los filtros SG son implementables mediante el filtrado FIR-LTI. Gracias a @MattL. para su corrección, el gran vínculo que ha brindado y la paciencia que tuvo (que nunca podría haber mostrado) durante mi investigación del problema. Aunque honestamente preferiría una objeción más detallada que claramente no es necesaria, sin embargo. También tenga en cuenta que la respuesta correcta es la otra, esta es solo para una aclaración adicional de la propiedad LTI de los filtros SG.
Ahora no es sorprendente que cuando alguien (que nunca ha usado esos filtros antes) se enfrenta a la definición del filtro SG como un ajuste polinomial LSE de bajo orden a los datos dados, él / ella saltaría inmediatamente a la conclusión de que son dependientes de datos, no lineales y Tiempo (cambio) variable, filtros adaptativos.
Sin embargo, el procedimiento de ajuste polinomial es interpretado hábilmente por los propios SG, de modo que permite un filtrado lineal completamente independiente de datos, invariante en el tiempo, lo que hace que SG sea un filtro LTI-FIR fijo.
El siguiente es un resumen más breve del enlace proporcionado por MattL. Para cualquier detalle que parezca faltar, consulte el documento original o solicite aclaraciones. Pero no me gustaría volver a producir el documento completo aquí.
2 millones+ 1x [ - M] , x [ - M+ 1 ] , . . . , X [ 0 ] , x [ 1 ] , . . . , x [ M]n = 0p [ n ]norten = - M, - M+ 1 , . . . , - 1 , 0 , 1 , . . . METRO
p [ n ] = ∑k = 0norteunknortek= a0 0+ a1n + a2norte2+ . . . + anortenortenorte
unknortet hp [ n ]
mi= ∑- MMETRO( p [ n ] - x [ n ] )2
x = [ x [ - M] , x [ - M+ 1 ] , . . . , X [ 0 ] , x [ 1 ] , . . . , x [ M] ]T
unkmi
∂mi∂unyo= 0 , para i = 0 , 1 , . . , N (1)
Ahora, para aquellos que están familiarizados con el procedimiento LSE polyfit, simplemente escribiré la ecuación matricial resultante (del enlace) que define el conjunto de coeficientes óptimo:
a = ( ATA )- 1UNTx = HX(2)
X( 2 M+ 1 ) × 1H2 millones+ 1norteUNnorteUNHUN
A = [ αn , i] = ⎡⎣⎢⎢⎢⎢⎢⎢⎢⎢⎢( - M)0 0( - M+ 1 )0 0( 0 )0 0( M)0 0( - M)1( - M+ 1 )1. . .( 0 )1. . .( M)1. . .. . .. . .. . .( - M)norte( - M+ 1 )norte( 0 )norte( M)norte⎤⎦⎥⎥⎥⎥⎥⎥⎥⎥⎥
Ahora recostémonos un momento y discutamos un punto aquí.
UNHnorteunkMETROnortex [ n ]unk2n d
... Esto (el polyfit LSE) puede repetirse en cada muestra de la entrada, produciendo cada vez un nuevo polinomio y un nuevo valor de la secuencia de salida y [n] ...
Entonces, ¿cómo superamos esta sorprendente sorpresa? Al interpretar y definir la salida del filtro SG para que sea la siguiente:
nortenortex [ n ]y[ n ]p [ n ]n = 0
y[ n ] = y[ 0 ] = ∑m = 0norteunmetronortemetro= a0 0
2 millones+ 1x [ n ]n = dy[ n ]un0 0p [ n ]x [ n ]n = dy[ d]x [ d- M] , x [ d- M+ 1 ] , . . . , x [ d- 1 ] , x [ d] , x [ d+ 1 ] , . . . x [ d+ M]
un0 0x [ n ]y[ n ]x [ n ]nortex [ n ]h [ n ]. Pero entonces, ¿cuáles son los coeficientes de filtro para este filtro SG? Veamos.
unk
a = HX
⎡⎣⎢⎢⎢⎢un0 0un1⋮unnorte⎤⎦⎥⎥⎥⎥= ⎡⎣⎢⎢⎢⎢h ( 0 , 0 )h ( 1 , 0 )h ( N, 0 )h ( 0 , 1 )h ( 1 , 1 ). . .h ( 0 , 1 ). . .. . .. . .h ( 0 , 2 M)h ( 1 , 2 M)h ( 0 , 2 M)⎤⎦⎥⎥⎥⎥⋅ ⎡⎣⎢⎢⎢⎢x [ - M]x [ - M+ 1 ].. .x [ M]⎤⎦⎥⎥⎥⎥
un0 0HX
un0 0= H( 0 , n ) ⋅ x = ∑ H( 0 , k ) x [ k ] = H( 0 , - n ) ⋆ x [ n ]
h [ n ] = H( 0 , - n )
norte2 millones+ 1
y[ n ]2 millones+ 1x [ n ]Lhnorte[ n ]
y[ n ] = x [ n ] ⋆ hnorte[ n ]
COMENTARIO
unkh [ n ]y[ n ]Xa = HXunkp [ n ]unkh [ n ]
CODIGO 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]');
El resultado es:
Espero que esto aclare el problema.