НОТА
мой предыдущий ответ (перед этим редактированием), в котором было указано, что фильтр Савицкого-Голея (SG) является нелинейной изменяющейся во времени зависимой от входных данных, был неверным из-за преждевременной неверной интерпретации того, как фильтр Савицкого-Голея (SG) вычисляет свои выходные данные по предоставленной вики-ссылке. Так что теперь я исправляю это для тех, кто также увидит, как фильтры SG реализуются фильтрацией FIR-LTI. Благодаря @MattL. за его исправление, за отличную связь, которую он обеспечил, и за терпение, которое он имел (что я никогда не мог проявить) во время моего исследования проблемы. Хотя я бы честно предпочел более подробные возражения, которые, тем не менее, явно не нужны. Также обратите внимание, что правильный ответ - другой, этот только для дополнительного разъяснения свойства LTI фильтров SG.
Теперь неудивительно, что когда кто-то (кто никогда раньше не использовал эти фильтры) сталкивается с определением фильтра SG как полиномиального соответствия LSE низкого порядка с данными, он / она сразу же приходит к выводу, что они зависят от данных, нелинейны и изменяющиеся во времени (смены), адаптивные фильтры.
Тем не менее, процедура полиномиальной подгонки грамотно интерпретируется самими SG, так что она обеспечивает полностью независимую от данных линейную фильтрацию, не зависящую от времени, и, следовательно, делает SG в качестве фиксированного фильтра LTI-FIR.
Ниже приведена краткая сводка по ссылке, предоставленной MattL. По поводу каких-либо подробностей, которые, по-видимому, отсутствуют, обратитесь к оригинальному документу или попросите уточнить. Но я не хотел бы перепечатывать весь документ здесь.
2 М+ 1х [ - М] , х [ - М+ 1 ] , . , , , Х [ 0 ] , х [ 1 ] , . , , , х [ М]n = 0p [ n ]Nn = - M, - М+ 1 , . , , , - 1 , 0 , 1 , . , , M
p [ n ] = ∑к = 0NaКNК= а0+ а1н + а2N2+ . , , + аNNN
aКNт чp [ n ]
Е= ∑- МM( p [ n ] - x [ n ] )2
x=[x[−M] , х [ - М+ 1 ] , . , , , Х [ 0 ] , х [ 1 ] , . , , , х [ М] ]T
aКЕ
∂Е∂aя= 0 , для я = 0 , 1 , . , , N (1)
Теперь для тех, кто знаком с процедурой полифизики LSE, я просто напишу полученное матричное уравнение (по ссылке), которое определяет оптимальный набор коэффициентов:
а = ( АTА )- 1ATх = НИкс(2)
Икс( 2 М+ 1 ) × 1ЧАС2 М+ 1NANAЧАСA
A = [ αн , я] = ⎡⎣⎢⎢⎢⎢⎢⎢⎢⎢⎢( - М)0( - М+ 1 )0( 0 )0( М)0( - М)1( - М+ 1 )1, , ,( 0 )1, , ,( М)1, , ,, , ,, , ,, , ,( - М)N( - М+ 1 )N( 0 )N( М)N⎤⎦⎥⎥⎥⎥⎥⎥⎥⎥⎥
Теперь давайте на мгновение откинемся назад и обсудим вопрос здесь.
AЧАСNaКMNх [ н ]aК2н д
... Это (полифит LSE) может повторяться для каждой выборки входных данных, каждый раз создавая новый многочлен и новое значение выходной последовательности y [n] ...
Так как же нам преодолеть этот удивительный сюрприз? Путем интерпретации и определения вывода фильтра SG следующим образом:
NNх [ н ]Y[ п ]p [ n ]n = 0
Y[ n ] = у[ 0 ] = ∑m = 0NaмNм= а0
2 М+ 1х [ н ]n = dY[ п ]a0p [ n ]х [ н ]n = dY[ д]х [ д- М] , х [ д- М+ 1 ] , . , , , х [ д- 1 ] , х [ д] , х [ д+ 1 ] , . , , х [ д+ М]
a0х [ н ]Y[ п ]х [ н ]Nх [ н ]ч [ п ], Но тогда, каковы коэффициенты фильтра для этого фильтра SG? Посмотрим.
aК
а = НИкс
⎡⎣⎢⎢⎢⎢a0a1⋮aN⎤⎦⎥⎥⎥⎥= ⎡⎣⎢⎢⎢⎢ч ( 0 , 0 )ч ( 1 , 0 )ч ( N, 0 )ч ( 0 , 1 )ч ( 1 , 1 ), , ,ч ( 0 , 1 ), , ,, , ,, , ,ч ( 0 , 2 М)ч ( 1 , 2 М)ч ( 0 , 2 М)⎤⎦⎥⎥⎥⎥⋅ ⎡⎣⎢⎢⎢⎢х [ - М]х [ - М+ 1 ], , ,х [ М]⎤⎦⎥⎥⎥⎥
a0ЧАСИкс
a0= H( 0 , n ) ⋅ x = ∑ H( 0 , k ) x [ k ] = H( 0 , - n ) ⋆ x [ n ]
h [ n ] = H( 0 , - n )
N2 М+ 1
Y[ п ]2 М+ 1х [ н ]LчасN[ п ]
Y[ n ] = x [ n ] ⋆ hN[ п ]
КОММЕНТАРИЙ
aКч [ п ]Y[ п ]Икса = НИксaКp [ n ]aКч [ п ]
MATLAB / OCTVE CODE
ч [ п ]ч [ п ]
% 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]');
Выход:
Надеюсь, что это проясняет проблему.