Main Content

このページの内容は最新ではありません。最新版の英語を参照するには、ここをクリックします。

sgolayfilt

Savitzky-Golay フィルター

説明

y = sgolayfilt(x,order,framelen) は、ベクトル x のデータに、多項式の次数 order およびフレーム長 framelen の Savitzky-Golay 有限インパルス応答 (FIR) 平滑化フィルターを適用します。x が行列の場合、sgolayfilt は各列に適用されます。

y = sgolayfilt(x,order,framelen,weights) は、最小二乗の最小化中に使用する重みベクトルを指定します。

y = sgolayfilt(x,order,framelen,weights,dim) は、フィルターが作用する次元を指定します。

すべて折りたたむ

ランダムな信号を生成して、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')

Figure contains an axes object. The axes object contains 2 objects of type line. These objects represent 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')

Figure contains an axes object. The axes object contains 3 objects of type line. These objects represent 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

Figure contains an axes object. The axes object contains 4 objects of type line. These objects represent signal, sgolay, steady, complete.

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

Fs=7418 Hz でサンプリングされた音声信号を読み込みます。ファイルには、"MATLAB®" という単語を発声している女性の録音音声が含まれています。

load mtlb
t = (0:length(mtlb)-1)/Fs;

21 の長さのデータ フレームに多項式の次数が 9 の Savitzky-Golay フィルターを適用して、信号を平滑化します。元の信号とフィルター処理された信号をプロットします。0.02 秒区間を拡大します。

rd = 9;
fl = 21;

smtlb = sgolayfilt(mtlb,rd,fl);

subplot(2,1,1)
plot(t,mtlb)
axis([0.2 0.22 -3 2])
title('Original')
grid

subplot(2,1,2)
plot(t,smtlb)
axis([0.2 0.22 -3 2])
title('Filtered')
grid

Figure contains 2 axes objects. Axes object 1 with title Original contains an object of type line. Axes object 2 with title Filtered contains an object of type line.

計算を繰り返しますが、今回はカイザー ウィンドウを重みベクトルとして使用します。形状係数 β=38 を指定します。新しいフィルター処理された信号をプロットします。

kmtlb = sgolayfilt(mtlb,rd,fl,kaiser(fl,38));

subplot(2,1,2)
hold on
plot(t,kmtlb)
axis([0.2 0.22 -3 2])
hold off

Figure contains 2 axes objects. Axes object 1 with title Original contains an object of type line. Axes object 2 with title Filtered contains 2 objects of type line.

入力引数

すべて折りたたむ

ベクトルまたは行列として指定される入力信号。

データ型: single | double

多項式の次数。正の整数として指定します。orderframelen よりも小さくしなければなりません。order = framelen – 1 の場合、フィルターでは平滑化は行われません。

データ型: single | double

フレーム長。正の奇数の整数で指定します。

データ型: single | double

重み付け配列。長さ framelen の正の実数ベクトルまたは正の実数行列で指定します。

データ型: single | double

フィルターを適用する次元。正の整数のスカラーで指定します。既定では、sgolayfilt はサイズが 1 より大きい x の最初の次元に沿って機能します。

データ型: single | double

出力引数

すべて折りたたむ

フィルター処理された信号。ベクトルまたは行列として返されます。

ヒント

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

Savitzky-Golay フィルターは、多項式をノイズ データの各フレームに近似する上で、最小二乗誤差を最小にするという意味で最適なものです。Savitzky-Golay アルゴリズムの詳細については、sgolay を参照してください。

参照

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

[2] Schafer, Ronald. “What Is a Savitzky-Golay Filter? [Lecture Notes].” IEEE Signal Processing Magazine 28, no. 4 (July 2011): 111–17. https://doi.org/10.1109/MSP.2011.941097.

拡張機能

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

バージョン履歴

R2006a より前に導入