ドキュメンテーション

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

sgolay

Savitzky-Golay フィルター設計

構文

b = sgolay(order,framelen)
b = sgolay(order,framelen,weights)
[b,g] = sgolay(...)

説明

b = sgolay(order,framelen) では、多項式次数 order およびフレーム長 framelen をもつ Savitzky-Golay FIR 平滑化フィルターが設計されます。orderframelen 未満で、framelen は奇数でなければなりません。order = framelen-1 の場合、設計されるフィルターは平滑化されません。

出力 b は、framelenframelen 列の行列で、その行は時変の FIR フィルター係数を表しています。平滑化フィルターを実装 (たとえば、sgolayfilt を実装) する際には、最後の (framelen-1)/2 行 (個々の FIR フィルター) は、開始時の過渡状態中に信号に適用されます。また、最初の (framelen-1)/2 行は、終了時の過渡状態中に信号に適用されます。中心の行は、安定状態で信号に適用されます。

b = sgolay(order,framelen,weights) では、最小二乗の最小化で使用される正の実数値の重みを含む、長さ framelen の重みベクトル weights が指定されます。

[b,g] = sgolay(...) では、差分フィルターの行列 g が返されます。g の各列は、次数 p-1 の導関数に対応する差分フィルターです。ここで、p は列インデックスです。長さが framelen の信号 x が与えられた場合、以下の式により、中央値の p 次の導関数 xp の推定を求めることができます。

xp((framelen+1)/2) = (factorial(p)) * g(:,p+1)' * x

すべて折りたたむ

ホワイト ガウス ノイズに含まれる 0.2 Hz の正弦波で構成される信号を生成し、200 秒間、毎秒 5 回サンプリングします。

dt = 1/5;
t = (0:dt:200-dt)';

x = 5*sin(2*pi*0.2*t) + randn(size(t));

sgolay を使用して信号を平滑化します。21 サンプルのフレームと 4 次多項式を使用します。

order = 4;
framelen = 21;

b = sgolay(order,framelen);

b の中心の行でたたみ込みを行って、信号の定常状態部分を計算します。

ycenter = conv(x,b((framelen+1)/2,:),'valid');

過渡状態を計算します。開始時に b の最後の行を使用し、終了時に b の最初の行を使用します。

ybegin = b(end:-1:(framelen+3)/2,:) * x(framelen:-1:1);
yend = b((framelen-1)/2:-1:1,:) * x(end:-1:end-(framelen-1));

過渡状態と定常状態部分を連結して、完全に平滑化された信号を生成します。元の信号および Savitzky-Golay 推定をプロットします。

y = [ybegin; ycenter; yend];
plot([x y])
legend('Noisy Sinusoid','S-G smoothed sinusoid')

ホワイト ガウス ノイズに含まれる 0.2 Hz の正弦波で構成される信号を生成し、20 秒間、毎秒 4 回サンプリングします。

dt = 0.25;
t = (0:dt:20-1)';

x = 5*sin(2*pi*0.2*t)+0.5*randn(size(t));

Savitzky-Golay 法を使用して、正弦波の最初の 3 つの導関数を推定します。25 サンプルのフレームと 5 次多項式を使用します。列を dt のべき乗で分割して、導関数を正しくスケーリングします。

[b,g] = sgolay(5,25);

dx = zeros(length(x),4);
for p = 0:3
  dx(:,p+1) = conv(x, factorial(p)/(-dt)^p * g(:,p+1), 'same');
end

元の信号、平滑化されたシーケンスおよび導関数の推定をプロットします。

plot(x,'.-')
hold on
plot(dx)
hold off

legend('x','x (smoothed)','x''','x''''', 'x''''''')
title('Savitzky-Golay Derivative Estimates')

ヒント

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

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

参考文献

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

拡張機能

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

R2006a より前に導入