Savitzky–GolayフィルターとIIRまたはFIR線形フィルター


11
  • 従来のIIR / FIRフィルター(高周波数の振動を除去するためのローパス)、たとえば移動平均、

  • またはSavitzky-Golayフィルター

エンベロープ信号などの信号を平滑化するのに便利です。

ここに画像の説明を入力してください

Savitzky-Golayフィルターが古典的なローパスよりも興味深いアプリケーションはどれですか?

標準フィルターとの違いは何ですか?標準フィルターと比較して何が追加されますか?

入力データに適応しますか?

一時的な保存に適していますか?


「移動平均または別のFIRローパスの代わりにSGフィルターを使用しましょう!これとこれとこれで...」と決めたエンジニアリングの状況にあったことがありますか?次に、この質問はあなたのためです!

回答:


4

既存の回答とコメントでの議論は、主にSavitzky-Golayフィルターが実際に何であるかに焦点を当てているため(これは非常に便利でした)、平滑化フィルターを実際に選択する方法に関するいくつかの情報を提供することにより、既存の回答に追加しようとします。私の理解では、質問は実際に何についてであるかです。

まず、他の回答から生まれたディスカッションで明らかになった点を繰り返したいと思います。質問の平滑化フィルターを一方で線形および時間不変(LTI)FIR / IIRフィルターに分類し、一方、Savitzky-Golayフィルターは誤解を招く可能性があります。Savitkzy-Golayフィルターは、特定の基準(ローカル多項式近似)に従って設計された標準のFIRフィルターです。したがって、質問で言及されているすべてのフィルターはLTIフィルターです。

残りの問題は、平滑化フィルターの選択方法です。計算の複雑さやメモリが問題になる場合、FIRフィルターよりもはるかに低いフィルター次数で同等のノイズ抑制(つまり、阻止帯域の減衰)を実現できるため、FIRフィルターよりもIIRフィルターの方が好ましい場合があります。ただし、リアルタイム処理が必要な場合、IIRフィルターの1つの不利な点は、正確に線形の位相応答を持つことができないことです。そのため、目的の信号には位相歪みが生じます。オフライン処理の場合、IIRフィルターを使用する場合でも、ゼロ位相フィルターを適用することにより、位相の歪みを回避できます

前の段落で説明した考慮事項とは別に、問題となるのは主に設計基準です。フィルターがFIRまたはIIRの場合はそれほど重要ではありません。FIRフィルターによって任意の(安定した)IIRフィルターを任意の精度で近似できるため、 FIRフィルターはIIRフィルターで近似できますが、後者ははるかに困難な場合があります。適切な設計基準は、データとノイズの特性に明らかに依存します。平滑化に関しては、通常、十分にオーバーサンプリングされた(つまり平滑化された)データを想定しています。ノイズが主に高周波成分を持っている場合、つまりデータとノイズのスペクトルのオーバーラップがほとんどない場合は、目的の信号をできるだけ維持しながら、ストップバンドの減衰を最大化するか、ストップバンドのエネルギーを最小化する必要があります。この場合、Parks-McClellanアルゴリズムを使用して、ミニマックス基準に従って設計された線形位相FIRフィルターを選択できます。また、最小二乗法を選択することにより、阻止帯域エネルギーを最小化(つまり、阻止帯域のノイズパワーを最小化)することもできます。2つの基準(ミニマックスと最小二乗)の混合は、制約付き最小二乗設計。これにより、通過帯域の最大近似誤差を抑制しながら、阻止帯域エネルギーを最小限に抑えます。

ノイズスペクトルが信号スペクトルと大幅に重複している場合は、より慎重なアプローチが必要です。また、あまりにも多くのノイズを残す(カットオフ周波数を高く設定しすぎる)か、必要な歪みを加えるため、ブルートフォース減衰はうまく機能しません。信号が多すぎます。この場合、Savitzky-Golay(SG)フィルターが適しています。支払うべき代償は平凡な阻止帯域の減衰ですが、1つの利点はいくつかの信号特性が非常によく維持されることです。これは、SGフィルターの通過帯域応答がフラットであること、つまり

(1)dkH(ejω)dωk|ω=0=0k=1,2,,r

ここでr近似多項式の次数であり、H(ejω)であり、フィルタの周波数応答は。プロパティ(1)は、入力信号の最初のrモーメントが出力で保持されることを保証します。つまり、目的の信号のピークの幅と高さが適切に保持されます。

もちろん、上記の2種類の平滑化フィルター(高阻止帯域減衰とSG)の間には妥協点もあります。ω=0で一定の平坦度を持つFIRフィルターを設計し、残りの自由度を使用して阻止帯域の減衰を最大化するか、阻止帯域エネルギーを最小化できます。FIRフィルターの場合、結果として生じる設計問題は十分に単純(かつ凸型)であり、いくつかのソフトウェアパッケージで利用可能な一般的な最適化ルーチンを使用して、特定のアプリケーションに最適なフィルターを取得できます。

SGフィルターの理論に興味がある人のために、私が推奨できる最も関連性の高い参考文献は次のとおりです。


2

何でもそうですが、特定のツールが他のツールより優れている場合があります。

移動平均(MA)フィルターはデータを平滑化するために使用でき、FIRです。これらは、あなたが考え出すことができる最も単純なフィルターであり、突然のジャンプや多項式の傾向をモデル化しようとしない限り、多くのタスクでうまく機能します。ただし、これらは基本的に単なるローパスフィルターであるため、信号内で気になるデータが低周波数でかなり狭帯域である場合に最適に機能します。

Savitzky-Golay(SG)フィルターは、FIRフィルターの特別なグループで、畳み込みが信号に沿ってスライドするときに、基本的に多項式を時系列に適合させます。SGフィルターは、気になるものが必ずしも低周波やかなり狭い帯域ではない信号に役立ちます。

かなり完全にリンクしたウィキペディアのページを読むと、SGフィルターとMAフィルターの違いが非常に詳細に説明されていることがわかります。ただし、結局のところ、どちらも同じようなことを行うための単なるツールであり、適切なツールをいつ使用するかはあなた次第です。

編集

SGフィルターが基本レベルで何らかの形で「適応」しているという混乱があるようですので、簡単なMATLABの例を含めました。ダンが指摘したように、これらは適応可能にすることができますが、それらの基本的な実装はしばしばそうではありません。コードを検査すると、これは単にいくつかの特別な処理を伴う単なるマトリックスルックアップであることがわかります。このフィルターについては、従来の意味での「適応性」はありません。多項式の適合と、その多項式が畳み込みによって信号に適合される長さを選択するだけです。SGは不可欠なFIRです。以下のスクリプトは、このプロットを生成します。 MAとSGフィルターの比較

この図を見ると、MAとSGは基本的に同じことを実現していますが、いくつかの重要な違いがあります。

  1. MAはノイズを抑制するのに優れていますが、信号の一時的なジャンプをキャプチャするのには適していません。フィルターの長さを長くすることで、さらに多くのノイズを抑えることができますが、トランジェントではパフォーマンスがさらに低下します。この効果は、トランジェントの近くで「にじむ」ように見えます。これは、図に示されているはずです。
  2. SGは信号のトランジェントをキャプチャするのに優れていますが、ノイズを抑制するのにはそれほど優れていません(少なくとも同じサイズのMAと比較すると)。フレーム長を長くすることにより、非一時的な近くのノイズ抑制を改善できますが、これにより、任意の過渡的な近くのギブ現象に類似したリンギングが発生します。

これらのフィルターがどのように機能するかについて理解を深めるために、ここでコードを取得して操作し、SGフィルターの個々の部分すべてがどのように機能するかを確認することをお勧めします。

MATLABの例のコード:

% Generate a signal "s" that has square waves, and scale it with a
% polynomial of order 5
up = 1*ones(1,100);
down = zeros(1,150);
s = [down down up up down up down up down up up up down down down down down];
n = numel(s);
nn = linspace(0,4,numel(s));
s = s .* (nn .^5);
sn = (s + 4*randn(size(s))).';

% smooth it with SMA of length 15
sz = 15;
h = 1/sz * ones(1,sz);
sn_sma = conv(sn,h,'same');

% smooth it with sgolay of frame length 15
m = (sz-1)/2;
% look up the SG matrix for this order and size
B = sgolay(5, sz);

% compute the steady state response for the signal, i.e. everywhere that
% isnt the first or last "frame" for the SG filter
steady = conv(sn, B(m+1,:), 'same');
% handle the transiet portion at the start of the signal
y_st   = B(1:m,:)*sn(1:sz);
% handle the transient portion at the end of the signal
y_en   = B(sz -m+1 : sz, :) * sn(n - sz+1:n);

% combine our results
sn_sg  = steady;
sn_sg(1:m) = y_st;
sn_sg(n-m+1:n) = y_en;

% plots
figure(1);
hold off;
plot(sn,'Color',[0.75 0.75 0.75]);
hold on;
plot(sn_sma,'b');
plot(sn_sg,'r');

legend('Noisy Signal','MA Smoothing','SG Smoothing, order 5','Location','NorthWest');

1
要点は、(他の回答を見ると)SGフィルターが「完全にデータ依存の非線形時変フィルターであり、その係数はその入力の短いセグメントごとに再計算される」ということです。
g6kxjv1ozn 2018

1
SGフィルターは、何度か実装したことで理解できますが、特にLMSやRLSなどの平均的な適応フィルターと比較すると、まったく適応フィルターではありません。フィルターの重みは時変であるという記述には完全に同意しません。SGフィルターは基本的にテーブルルックアップであり、テーブルからの値でフィルターして過渡応答を計算し、次に戻って信号の開始/終了でエッジケースを処理します。これをあなたに示すために、MATLABの例を使用して投稿を編集します。
matthewjpollard

2
@matthewjpollard注意してください、私は個人的にこのフィルターを使用する重要な経験はありませんが、SGフィルターは、最適に実装されているため、時変係数を持つ適応フィルター実装であるように見えます。コードでフィルターを適用する方法は(シーケンス全体をデータの「サブセット」として扱うため)ではなく、具体的にはWikipedia en.wikipedia.org/wiki/Savitzky%E2%80%で説明されている方法です 93Golay_filter とサビツキーとゴーレイの論文自体には確かに適応です:pdfs.semanticscholar.org/4830/...
ダンBoschen

2
@matthewjpollardリアルタイムシステムでは、データが継続的にストリーミングされるため、より短い間隔で係数を再計算しますか、それとも常に小さなデータブロックで作業しますか?
Dan Boschen 2018

2
マットに感謝します。したがって、おそらく、データ収集ごとに係数が計算されるという意味で、あなたの行動を適応/時間変化として関連付けることができます(ただし、データ収集内の同じ係数は開始と終了の適切な処理を伴いますが、収集ごとに異なります-私が正しく理解する)。コードとサンプルアプリケーションを共有していただきありがとうございます。
Dan Boschen

2

注意

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

(1)Eai=0   ,   for    i=0,1,..,N

LSEポリフィット手順に慣れている人のために、最適な係数セットを定義する(リンクからの)結果の行列方程式を簡単に記述します。

(2)a=(ATA)1ATx=Hx
x(2M+1)×1H2M+1NAnAHA

A=[αn,i]=[(M)0(M)1...(M)N(M+1)0(M+1)1...(M+1)N...(0)0(0)1...(0)N...(M)0(M)1...(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[dM],x[dM+1],...,x[d1],x[d],x[d+1],...x[d+M]

a0x[n]y[n]x[n]nx[n]h[n]。しかし、このSGフィルターのフィルター係数は何ですか?どれどれ。

ak

a=Hx

[a0a1aN]=[h(0,0)h(0,1)...h(0,2M)h(1,0)h(1,1)...h(1,2M)...h(N,0)h(0,1)...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]');

出力は次のとおりです。

ここに画像の説明を入力してください

これで問題が明確になることを願っています。


2
@ Fat32これはコメントの長いリストが前後にあったためだと思います。ボードをきれいに保つために、彼らは通常「チャット」のためにそれを移動します。それはすべてまだそこにあり、メインページを散らかすだけではありません。そのため、システムは、前後が長くなったときにチャットに移動することを提案しています。心配する必要はありません。誰もがあなたを愛しています。
Dan Boschen

1
@ g6kxjv1ozn私はその点に同意しています...お待ちください...
Fat32

2
@ Fat32よくできました!私はそれを読み通しましたが、読み通す必要があり、それは非常に明確に書かれています。今のようにそれを完全に見るには、鉛筆と紙を少しずつたどる必要があります。これをここに置いてくれてありがとう。
Dan Boschen

4
1ω=0

2
akh[n]
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.