注意
Savitzky-Golay(SG)フィルターがその出力を計算する方法の時期尚早な誤解により、Savitzky-Golay(SG)フィルターを非線形の時変入力データ依存として示す私の以前の回答(この編集前)提供されたwikiリンクによると。だから今私は、SGフィルターがFIR-LTIフィルタリングによってどのように実装できるかを見る人のために、それを修正しています。@MattLに感謝します。彼の訂正のために、彼が提供した素晴らしいリンクと、問題の調査中に彼が持っていた忍耐力(私が示すことはできなかったでしょう)。私は正直に言って、それでも明らかに必要ではない、より詳細な反対意見を好みます。また、正解はもう1つです。これは、SGフィルターのLTIプロパティをさらに明確にするためのものです。
さて、誰か(以前にこれらのフィルターを使用したことがない人)がSGフィルターの定義に与えられたデータへの低次LSE多項式適合として直面したとき、彼/彼女はそれらがデータ依存、非線形、時間(シフト)が変化する適応フィルター。
それでも、多項式フィッティング手順はSG自体によって巧妙に解釈されるため、完全にデータに依存せず、時間不変の線形フィルタリングが可能になり、SGを固定LTI-FIRフィルターとして使用できます。
以下は、MattLが提供するリンクからの最短の要約です。不足していると思われる詳細については、元のドキュメントを参照するか、明確にするように依頼してください。ただし、ここではドキュメント全体を再作成したくありません。
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)
LSEポリフィット手順に慣れている人のために、最適な係数セットを定義する(リンクからの)結果の行列方程式を簡単に記述します。
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⎤⎦⎥⎥⎥⎥⎥⎥⎥⎥⎥
ここで、少し傾いて、ここでポイントについて説明します。
AHnakMNx[n]ak2nd
...これ(LSEポリフィット)は入力の各サンプルで繰り返すことができ、そのたびに新しい多項式と出力シーケンスの新しい値y [n] ...を生成します。
では、この不可解な驚きをどのように克服すればよいのでしょうか。SGフィルターの出力を次のように解釈および定義します。
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]。しかし、このSGフィルターのフィルター係数は何ですか?どれどれ。
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]
コメント
akh[n]y[n]xa=Hxakp[n]akh[n]
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]');
出力は次のとおりです。
これで問題が明確になることを願っています。