ドキュメンテーション

最新のリリースでは、このページがまだ翻訳されていません。 このページの最新版は英語でご覧になれます。

sgolayfilt

Savitzky-Golay フィルター

構文

y = sgolayfilt(x,order,framelen)
y = sgolayfilt(x,order,framelen,weights)
y = sgolayfilt(x,order,framelen,weights,dim)

説明

y = sgolayfilt(x,order,framelen) では、ベクトル x のデータに Savitzky-Golay FIR 平滑化フィルターが適用されます。x が行列の場合、sgolayfilt は各列に適用されます。多項式の次数 order はフレーム長 framelen よりも短く、また、framelen は奇数でなければなりません。order = framelen-1 の場合、フィルターでは平滑化は行われません。

y = sgolayfilt(x,order,framelen,weights) では、最小二乗の最小化で使用される正の実数値の重みを含む、長さ framelen の重みベクトル weights が指定されます。weights を指定しない場合、または空 [] を指定した場合は、既定で単位行列が使用されます。

y = sgolayfilt(x,order,framelen,weights,dim) では、フィルターが作用する次元 dim が指定されています。dim を指定しない場合、sgolayfilt は、大きさが 1 でない最初の次元 (すなわち、列ベクトルや自明でない行列の場合は次元 1、行ベクトルの場合は次元 2) に沿って動作します。

すべて折りたたむ

ランダムな信号を生成して、sgolayfilt を使用して平滑化します。多項式の次数 3 およびフレーム長 11 を指定します。元の信号と平滑化された信号をプロットします。

order = 3;
framelen = 11;

lx = 34;
x = randn(lx,1);

sgf = sgolayfilt(x,order,framelen);

plot(x,':')
hold on
plot(sgf,'.-')
legend('signal','sgolay')

関数 sgolayfilt は、信号と中心の行 B (sgolay の出力) のたたみ込みを行って、ほとんどのフィルター処理を実行します。結果はフィルター処理された信号の定常状態部分です。この部分を生成およびプロットします。

m = (framelen-1)/2;

B = sgolay(order,framelen);

steady = conv(x,B(m+1,:),'same');

plot(steady)
legend('signal','sgolay','steady')

信号エッジの近傍のサンプルは対称ウィンドウの中心に配置できないため、異なる方法で扱わなければなりません。

開始時の過渡状態を求めるため、行列は B の最初の (framelen-1)/2 行を信号の最初の framelen サンプルで乗算します。

ybeg = B(1:m,:)*x(1:framelen);

終了時の過渡状態を求めるため、行列は B の最後の (framelen-1)/2 行を信号の最後の framelen サンプルで乗算します。

yend = B(framelen-m+1:framelen,:)*x(lx-framelen+1:lx);

過渡状態と定常状態部分を連結して、完全な信号を生成します。

cmplt = steady;
cmplt(1:m) = ybeg;
cmplt(lx-m+1:lx) = yend;

plot(cmplt)
legend('signal','sgolay','steady','complete')
hold off

最小化に重みを加えると、B の対称性がこわれ、正しい解を得るために追加のステップが必要になります。

41 の長さのデータ フレームに 3 次の Savitzky-Golay フィルターを適用して、mtlb 信号を平滑化します。

load mtlb
smtlb = sgolayfilt(mtlb,3,41);

subplot(2,1,1)
plot(1:2000, mtlb(1:2000))
axis([0 2000 -4 4])
title('mtlb')
grid

subplot(2,1,2)
plot(1:2000,smtlb(1:2000))
axis([0 2000 -4 4])
title('smtlb')
grid

ヒント

Savitzky-Golay 平滑化フィルターは、デジタル平滑化多項式フィルター、または最小二乗平滑化フィルターとも呼ばれ、通常、ノイズなしの状態でも広い周波数範囲をもつ、ノイズの多い信号の平滑化に使用されます。この種のアプリケーションでは、Savitzky-Golay 平滑化フィルターの方が標準の平均化 FIR フィルターよりうまく機能します。これは、標準の平均化 FIR フィルターでは、ノイズとともに信号の高周波数部分でかなりのゲインがフィルターによって除去されてしまうからです。ただし、Savitzky-Golay フィルターは信号の高周波数成分を維持するには効果的ですが、標準の平均化 FIR フィルターほどノイズの除去は優れていません。

Savitzky-Golay フィルターは、多項式をノイズ データの各フレームに近似する上で、最小二乗誤差を最小にするという意味で最適なものです。

参照

[1] Orfanidis, Sophocles J. Introduction to Signal Processing. Englewood Cliffs, NJ: Prentice-Hall, 1996.

拡張機能

C/C++ コード生成
MATLAB® Coder™ を使用して C および C++ コードを生成します。

R2006a より前に導入