Main Content

このページの翻訳は最新ではありません。ここをクリックして、英語の最新版を参照してください。

filter

1 次元のデジタル フィルター

説明

y= filter(b,a,x)は、分子係数bと分母係数aで定義される有理伝達関数を使用して、入力データxをフィルター処理します。

a(1)1に等しくない場合、filtera(1)でフィルター係数を正規化します。このためa(1)は非ゼロでなければなりません。

  • xがベクトルの場合、filterはフィルター処理されたデータをxと同じサイズのベクトルとして返します。

  • xが行列の場合、filterは最初の次元に沿って機能し、各列のフィルター処理されたデータを返します。

  • xが多次元配列の場合、filterは、サイズが 1 でない最初の配列次元に沿って機能します。

y= filter(b,a,x,zi)は、フィルター遅延の初期条件ziを使用します。ziの長さは、max(length(a),length(b))-1と等しくなければなりません。

y= filter(b,a,x,zi,dim)は次元dimに沿って機能します。たとえば、xが行列の場合、filter(b,a,x,zi,2)は各行のフィルター処理されたデータを返します。

[y,zf] = filter(___)は前述の任意の構文を使用し、フィルター遅延の最終状態zfも返します。

すべて折りたたむ

移動平均フィルターは、ノイズを含むデータの平滑化に使用される一般的なメソッドです。この例では、関数filterを使用して、データのベクトルに沿って平均を計算します。

ランダム ノイズで乱した正弦波データの 1 行 100 列の行ベクトルを作成します。

t = linspace(-pi,pi,100); rngdefault%initialize random number generatorx = sin(t) + 0.25*rand(size(t));

移動平均フィルターは、データに沿って長さ w i n d o w S i z e のウィンドウをスライドし、各ウィンドウに含まれるデータの平均を計算します。次の差分方程式は、ベクトル x の移動平均フィルターを定義します。

y ( n ) = 1 w i n d o w S i z e ( x ( n ) + x ( n - 1 ) + . . . + x ( n - ( w i n d o w S i z e - 1 ) ) ) .

ウィンドウ サイズが 5 の場合の有理伝達関数の分子係数と分母係数を計算します。

windowSize = 5; b = (1/windowSize)*ones(1,windowSize); a = 1;

データの移動平均を求め、元のデータに対してプロットします。

y = filter(b,a,x); plot(t,x) holdonplot(t,y) legend('Input Data','Filtered Data')

Figure contains an axes. The axes contains 2 objects of type line. These objects represent Input Data, Filtered Data.

この例では、データ行列を次の有理伝達関数でフィルター処理します。

H ( z ) = b ( 1 ) a ( 1 ) + a ( 2 ) z - 1 = 1 1 - 0 . 2 z - 1

2 行 15 列の乱数入力データの行列を作成します。

rngdefault%initialize random number generatorx = rand(2,15);

有理伝達関数の分子係数と分母係数を定義します。

b = 1; a = [1 -0.2];

xの 2 番目の次元に沿って伝達関数を適用し、各行の 1 次元デジタル フィルターを返します。フィルター処理されたデータに対して元のデータの 1 行目をプロットします。

y = filter(b,a,x,[],2); t = 0:length(x)-1;%index vectorplot(t,x(1,:)) holdonplot(t,y(1,:)) legend('Input Data','Filtered Data') title('First Row')

Figure contains an axes. The axes with title First Row contains 2 objects of type line. These objects represent Input Data, Filtered Data.

フィルター処理されたデータに対して入力データの 2 行目をプロットします。

figure plot(t,x(2,:)) holdonplot(t,y(2,:)) legend('Input Data','Filtered Data') title('Second Row')

Figure contains an axes. The axes with title Second Row contains 2 objects of type line. These objects represent Input Data, Filtered Data.

フィルター遅延の初期条件と最終状態を使用し、分割してデータをフィルター処理します。メモリ制限に考慮が必要な場合は特に有効です。

大規模な乱数データ シーケンスを作成し、x1x2の 2 つのセグメントに分割します。

x = randn(10000,1); x1 = x(1:5000); x2 = x(5001:end);

全体のシーケンスxは、x1x2の垂直連結です。

有理伝達関数の分子係数と分母係数を定義します。

H ( z ) = b ( 1 ) + b ( 2 ) z - 1 a ( 1 ) + a ( 2 ) z - 1 = 2 + 3 z - 1 1 + 0 . 2 z - 1 .

b = [2,3]; a = [1,0.2];

サブシーケンスx1およびx2を一度に 1 つずつフィルター処理します。最初のセグメントが終了した時点のフィルターの内部状態を保存するために、x1のフィルター処理の最終条件を出力します。

[y1,zf] = filter(b,a,x1);

x1のフィルター処理の最終条件を、2 番目のセグメントx2のフィルター処理の初期条件として使用します。

y2 = filter(b,a,x2,zf);

y1x1からフィルター処理されたデータで、y2x2からフィルター処理されたデータです。フィルター処理された全体のシーケンスは、y1y2の垂直連結です。

比較のために全体シーケンスを一度にフィルター処理します。

y = filter(b,a,x); isequal(y,[y1;y2])
ans =logical1

入力引数

すべて折りたたむ

有理伝達関数の分子係数。ベクトルとして指定します。

データ型:double|single|int8|int16|int32|int64|uint8|uint16|uint32|uint64|logical
複素数のサポート:あり

有理伝達関数の分母係数。ベクトルとして指定します。

データ型:double|single|int8|int16|int32|int64|uint8|uint16|uint32|uint64|logical
複素数のサポート:あり

入力データ。ベクトル、行列または多次元配列として指定します。

データ型:double|single|int8|int16|int32|int64|uint8|uint16|uint32|uint64|logical
複素数のサポート:あり

フィルター遅延の初期条件。ベクトル、行列または多次元配列として指定します。

  • ziがベクトルの場合、その長さはmax(length(a),length(b))-1でなければなりません。

  • ziが行列または多次元配列の場合、最初の次元のサイズはmax(length(a),length(b))-1でなければなりません。残りの次元のサイズはそれぞれ対応するxの次元のサイズと同じでなければなりません。たとえば、3 x 4 x 5 の配列xの 2 番目の次元 (dim = 2) に沿ってfilterを使用するとします。配列ziのサイズは、[max(length(a),length(b))-1] x 3 x 5 でなければなりません。

既定値は[]で指定され、すべてのフィルター遅延はゼロに初期化されます。

データ型:double|single|int8|int16|int32|int64|uint8|uint16|uint32|uint64|logical
複素数のサポート:あり

演算の対象の次元。正の整数のスカラーとして指定します。値を指定しない場合、既定値は、サイズが 1 ではない最初の配列の次元です。

2 次元の入力配列xについて考えます。

  • dim = 1の場合、filter(b,a,x,zi,1)xの行に沿って機能し、各列に適用されるフィルターを返します。

  • dim = 2の場合、filter(b,a,x,zi,2)xの列に沿って機能し、各行に適用されるフィルターを返します。

dimndims(x)よりも大きい場合、filterxを返します。

データ型:double|single|int8|int16|int32|int64|uint8|uint16|uint32|uint64|logical

出力引数

すべて折りたたむ

フィルター処理されたデータ。入力データxと同じサイズのベクトル、行列または多次元配列として返されます。

xの型がsingleである場合、filterはネイティブ レベルの単精度で計算し、yの型もsingleになります。それ以外の場合、ydouble型として返されます。

データ型:double|single

フィルター遅延の最終状態。ベクトル、行列または多次元配列として返されます。

  • xベクトルの場合、zfは長さmax(length(a),length(b))-1の列ベクトルになります。

  • xが行列または多次元配列の場合、zfは長さmax(length(a),length(b))-1の列ベクトルの配列になり、zfの列数はxの列数と等しくなります。たとえば、3 x 4 x 5 の配列xの 2 番目の次元 (dim = 2) に沿ってfilterを使用するとします。配列zfのサイズは、[max(length(a),length(b))-1] x 3 x 5 です。

データ型:double|single

詳細

すべて折りたたむ

有理伝達関数

Z 変換領域でのベクトルのfilter操作の入出力記述が有理伝達関数です。有理伝達関数は次の形式になります。

Y ( z ) = b ( 1 ) + b ( 2 ) z 1 + ... + b ( n b + 1 ) z n b 1 + a ( 2 ) z 1 + ... + a ( n a + 1 ) z n a X ( z ) ,

これは、FIR フィルターと IIR フィルターの両方を扱います[1]naはフィードバック フィルターの次数、nbはフィードフォワード フィルターの次数です。正規化により、a(1) = 1 と仮定します。

有理伝達関数は、次の差分方程式で表すこともできます。

a ( 1 ) y ( n ) = b ( 1 ) x ( n ) + b ( 2 ) x ( n 1 ) + ... + b ( n b + 1 ) x ( n n b ) a ( 2 ) y ( n 1 ) ... a ( n a + 1 ) y ( n n a ) .

さらに有理伝達関数は、次の図に示すように直接型 II 転置構成の実装で表すこともできます。ここで、na= nbです。

サンプル m でのfilterの動作は、時間領域での差分方程式で与えられます。

y ( m ) = b ( 1 ) x ( m ) + w 1 ( m 1 ) w 1 ( m ) = b ( 2 ) x ( m ) + w 2 ( m 1 ) a ( 2 ) y ( m ) = w n 2 ( m ) = b ( n 1 ) x ( m ) + w n 1 ( m 1 ) a ( n 1 ) y ( m ) w n 1 ( m ) = b ( n ) x ( m ) a ( n ) y ( m ) .

ヒント

  • FIR フィルターの係数bを指定して関数filterを使用するには、y = filter(b,1,x)を使用します。

  • Signal Processing Toolbox™ がある場合は、digitalFilter(Signal Processing Toolbox)オブジェクトdを指定し、y = filter(d,x)を使用して入力信号xをフィルター処理します。周波数応答の仕様に基づいてdを生成するには、designfilt(Signal Processing Toolbox)を使用します。

  • フィルター処理関数の詳細については、デジタル フィルター処理(Signal Processing Toolbox)を参照してください。

参照

[1] Oppenheim, Alan V., Ronald W. Schafer, and John R. Buck. Discrete-Time Signal Processing. Upper Saddle River, NJ: Prentice-Hall, 1999.

拡張機能

R2006a より前に導入