REMARQUE
ma réponse précédente (avant cette modification) dénotant le filtre Savitzky-Golay (SG) comme un filtre non linéaire dépendant des données d'entrée était erronée, en raison d'une mauvaise interprétation prématurée de la façon dont un filtre Savitzky-Golay (SG) calcule sa sortie selon le lien wiki fourni. Alors maintenant, je le corrige pour le bénéfice de ceux qui verraient également comment les filtres SG sont implémentables par le filtrage FIR-LTI. Merci à @MattL. pour sa correction, le grand lien qu'il a fourni et la patience qu'il a eu (que je n'aurais jamais pu montrer) lors de mon enquête sur la question. Bien que je préfère honnêtement une objection plus verbeuse qui n'est clairement pas nécessaire néanmoins. Veuillez également noter que la bonne réponse est l'autre, celle-ci est juste pour une clarification supplémentaire de la propriété LTI des filtres SG.
Maintenant, il n'est pas surprenant que lorsque quelqu'un (qui n'a jamais utilisé ces filtres auparavant) fait face à la définition du filtre SG comme un ajustement polynomial LSE d'ordre inférieur à des données données, il / elle saute immédiatement à la conclusion que ceux-ci sont dépendants des données, non linéaires et filtres adaptatifs variant dans le temps (décalage).
Pourtant, la procédure d'ajustement polynomial est intelligemment interprétée par SG eux-mêmes, de sorte qu'elle permet un filtrage linéaire complètement indépendant des données, invariable dans le temps, rendant ainsi SG un filtre LTI-FIR fixe.
Ce qui suit est un résumé le plus court du lien fourni par MattL. Pour tout détail qui semble manquer, veuillez consulter le document d'origine, ou demander à clarifier. Mais je ne voudrais pas reproduire tout le document ici.
2 M+ 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 = 0Nuneknk= a0+ a1n + a2n2+ . . . + aNnN
unekNt hp [ n ]
E= ∑- MM( p [ n ] - x [ n ] )2
x = [ x [ - M], x [ - M+ 1 ] , . . . , X [ 0 ] , X [ 1 ] , .. . , x [ M] ]T
unekE
∂E∂uneje= 0 , pour i = 0 , 1 , . . , N(1)
Maintenant, pour ceux qui connaissent la procédure de polyfit LSE, je vais simplement écrire l'équation de matrice résultante (à partir du lien) qui définit l'ensemble de coefficients optimal:
a = ( ATUNE )- 1UNETx = HX(2)
X( 2 M+ 1 ) × 1H2 M+1NUNEnUNEHUNE
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⎤⎦⎥⎥⎥⎥⎥⎥⎥⎥⎥
Maintenant, penchons-nous un instant et discutons d'un point ici.
UNEHnunekMNx [ n ]unek2n d
... Ceci (le polyfit LSE) peut être répété à chaque échantillon de l'entrée, produisant à chaque fois un nouveau polynôme et une nouvelle valeur de la séquence de sortie y [n] ...
Alors, comment surmonter cette surprenante surprise? En interprétant et en définissant la sortie du filtre SG comme suit:
Nnx [ n ]y[ n ]p [ n ]n = 0
y[ n ] = y[ 0 ] = ∑m = 0Nunemnm= a0
2M+ 1x [ n ]n = dy[ n ]une0p [ n ]x [ n ]n = dy[ d]x [ d-M] , x [d- M+ 1 ] , . . . , x [ d- 1 ] , x [ d] , x [ d+ 1 ] , . . . x [ d+ M]
une0x [ n ]y[ n ]x [ n ]nx [ n ]h [ n ]. Mais alors, quels sont les coefficients de filtrage pour ce filtre SG? Voyons voir.
unek
a = HX
⎡⎣⎢⎢⎢⎢une0une1⋮uneN⎤⎦⎥⎥⎥⎥= ⎡⎣⎢⎢⎢⎢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]⎤⎦⎥⎥⎥⎥
une0HX
une0= H( 0 , n ) ⋅ x = ∑ H( 0 , k ) x [ k ] = H( 0 , - n ) ⋆ x [ n ]
h [ n ] = H( 0 , - n )
N2 M+ 1
y[ n ]2 M+ 1x [ n ]LhN[ n ]
y[ n ] = x [ n ] ⋆ hN[ n ]
COMMENTAIRE
unekh [ n ]y[ n ]Xa = HXunekp [ n ]unekh [ n ]
CODE 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]');
La sortie est:
J'espère que cela clarifie le problème.