メインコンテンツ

filtfilt

ゼロ位相デジタル フィルター処理

説明

y = filtfilt(b,a,x) は、入力データ x を順方向と逆方向の両方で処理することにより、ゼロ位相デジタル フィルター処理を実行します。データを順方向でフィルター処理した後、関数は初期条件を一致させて起動時と終了時の過渡現象を最小限に抑え、フィルター処理したシーケンスを反転し、その反転したシーケンスを逆方向にフィルター処理します。結果には、以下の特性があります。

  • ゼロ位相の歪み

  • 元のフィルター伝達関数の振幅の 2 乗と等しい、フィルター伝達関数

  • ba により指定されるフィルターの次数の倍のフィルター次数

filtfilt は、Gustafsson による推奨アルゴリズム[1]を実装します。

微分器フィルターやヒルベルト FIR フィルターの演算は位相応答に大きく依存しているため、関数 filtfilt をこれらのフィルターと共に使うことは避けてください。

y = filtfilt(sos,g,x) ゼロ位相は、行列 sos およびスケール値 g で表される 2 次セクション (双二次) フィルターを使用して入力データ x をフィルター処理します。

y = filtfilt(d,x) ゼロ位相は、デジタル フィルター d を使用して入力データ x をフィルター処理します。d を周波数応答仕様に基づいて生成するには、関数 designfilt を使用します。

y = filtfilt(B,A,x,"ctf") は、分子係数 B と分母係数 A によって定義されるCascaded Transfer Functions (CTF) を使用し、入力データ x をゼロ位相でフィルター処理します。 (R2024b 以降)

メモ

A をスカラーまたはベクトルとして指定する場合、B が 2 次セクション行列入力 sos から取得した 6 列の CTF 分子行列であることを明確にするため、"ctf" オプションを指定します。

y = filtfilt({B,A,g},x) は、入力データ x のフィルター処理にフィルターのスカラー値 g を含めます。 (R2024b 以降)

すべて折りたたむ

ゼロ位相フィルター処理は、フィルター処理された時間波形の特徴を、フィルター処理されていない信号で現れる場所にそのまま保持する上で役立ちます。

合成心電図 (ECG) 波形をゼロ位相フィルター処理します。波形を生成する関数は、例の最後にあります。QRS 群は心電図波形の重要な特徴です。この例では時点 160 あたりから始まっています。

wform = ecg(500);

plot(wform)
axis([0 500 -1.25 1.25])
text(155,-0.4,"Q")
text(180,1.1,"R")
text(205,-1,"S")

Figure contains an axes object. The axes object contains 4 objects of type line, text.

心電図を加法性ノイズで乱します。再現可能な結果が必要な場合は、乱数発生器をリセットします。ローパス FIR 等リップル フィルターを作成し、ゼロ位相のフィルターと通常のフィルターの両方を使用してノイズの多い波形をフィルター処理します。

rng("default")

x = wform' + 0.25*randn(500,1);
d = designfilt("lowpassfir", ...
    PassbandFrequency=0.15,StopbandFrequency=0.2, ...
    PassbandRipple=1,StopbandAttenuation=60, ...
    DesignMethod="equiripple");
y = filtfilt(d,x);
y1 = filter(d,x);

tiledlayout("flow")
nexttile
plot([y y1])
title("Filtered Waveforms")
legend(["Zero-phase Filtering" "Conventional Filtering"])

nexttile
plot(wform)
title("Original Waveform")

Figure contains 2 axes objects. Axes object 1 with title Filtered Waveforms contains 2 objects of type line. These objects represent Zero-phase Filtering, Conventional Filtering. Axes object 2 with title Original Waveform contains an object of type line.

ゼロ位相フィルター処理では信号のノイズが低減し、QRS 群は元々の発生と同じ時点に保持されます。通常のフィルター処理では信号のノイズは低減しますが、QRS 群に遅延が生じます。

バタワース 2 次セクション フィルターを使用してフィルター処理を繰り返します。

d1 = designfilt("lowpassiir",FilterOrder=12, ...
    HalfPowerFrequency=0.15,DesignMethod="butter");
y = filtfilt(d1,x);

figure
plot(x)
hold on
plot(y,LineWidth=3)
hold off
legend(["Noisy ECG" "Zero-Phase Filtering"])

Figure contains an axes object. The axes object contains 2 objects of type line. These objects represent Noisy ECG, Zero-Phase Filtering.

この関数は ECG 波形を生成します。

function x = ecg(L)
%ECG Electrocardiogram (ECG) signal generator.
%   ECG(L) generates a piecewise linear ECG signal of length L.
%
%   EXAMPLE:
%   x = ecg(500).';
%   y = sgolayfilt(x,0,3); % Typical values are: d=0 and F=3,5,9, etc. 
%   y5 = sgolayfilt(x,0,5); 
%   y15 = sgolayfilt(x,0,15); 
%   plot(1:length(x),[x y y5 y15]);

%   Copyright 1988-2002 The MathWorks, Inc.

a0 = [0,1,40,1,0,-34,118,-99,0,2,21,2,0,0,0]; % Template
d0 = [0,27,59,91,131,141,163,185,195,275,307,339,357,390,440];
a = a0/max(a0);
d = round(d0*L/d0(15)); % Scale them to fit in length L
d(15)=L;

for i=1:14
       m = d(i):d(i+1)-1;
       slope = (a(i+1)-a(i))/(d(i+1)-d(i));
       x(m+1) = a(i)+slope*(m-d(i));
end

end

R2024b 以降

カスケード型伝達関数を使用して、ゼロ位相フィルター処理を実行します。

通過帯域リップルと阻止帯域の減衰量がそれぞれ 0.1 dB と 40 dB である楕円フィルターを設計します。サンプル レート 2000 Hz を指定します。フィルターの周波数応答をプロットします。

Fs = 2000;
[B,A] = ellip(20,0.1,40,[0.3 0.7],"ctf");
freqz(B,A,2048,Fs,"ctf")

Figure contains 2 axes objects. Axes object 1 with title Phase, xlabel Frequency (kHz), ylabel Phase (degrees) contains an object of type line. Axes object 2 with title Magnitude, xlabel Frequency (kHz), ylabel Magnitude (dB) contains an object of type line.

1 秒でナイキスト周波数に達する線形スイープ チャープ信号をフィルター処理します。入力信号と出力信号のスペクトルを比較します。

t = 0:1/Fs:1;
x = chirp(t,0,t(end),Fs/2)';
y = filtfilt(B,A,x,"ctf");
pspectrum([x y],Fs,Leakage=1,FrequencyResolution=1)

Figure contains an axes object. The axes object with title Fres = 1 Hz, xlabel Frequency (kHz), ylabel Power Spectrum (dB) contains 2 objects of type line.

R2024b 以降

伝達関数によるゼロ位相フィルター処理を使用して、ノイズの多い正弦波アーティファクトを再作成します。CTF とスケール値を使用して、振動信号をフィルター処理します。

正規分布ノイズと 3 つの正弦波形で構成される信号 u を作成します。サンプル レートは 1 kHz です。

rng("default")
Fs = 1e3;
ts = (0:1/Fs:2)';

a0 = [3 2 1];
f0 = [0.1 0.5 0.9]*Fs/2;
p0 = [0 pi/4 pi/2];

u = 0.1*randn(size(ts)) + 0.1*sin(2*pi*f0.*ts+p0)*a0';

3 次のバタワース バンドストップ デジタル フィルターで n0 をフィルター処理して信号 v を作成し、ノイズの多い正弦波アーティファクトを再作成します。

[b,a] = butter(3,[0.15 0.85],"stop");
v = filtfilt(b,a,u);

uv を比較します。両方の信号が同位相であることを確認します。

tiledlayout("flow")
nexttile
strips([u(ts<0.1) v(ts<0.1)],0.1,Fs)
legend(["u" "v"],Location="southeast")
xlabel("Time (seconds)")
nexttile
pspectrum([u v],Fs)
legend(["u" "v"],Location="southeast")

Figure contains 2 axes objects. Axes object 1 with xlabel Time (seconds) contains 2 objects of type line. These objects represent u, v. Axes object 2 with title Fres = 1.2821 Hz, xlabel Frequency (Hz), ylabel Power Spectrum (dB) contains 2 objects of type line. These objects represent u, v.

電圧制御された振動信号 x を作成します。信号 v で表されるノイズの多い正弦波アーティファクトを追加します。

vo = exp(-2*abs(ts-1)).*sin(8*pi*ts);
x = vco(vo,[0.25 0.75]*Fs/2,Fs) + v;

信号 x を 24 次のチェビシェフ II 型フィルターでフィルター処理します。CTF 形式とスケール値 (B,A,g) を使用します。

[B,A,g] = cheby2(24,50,[0.2 0.8],"ctf");
y = filtfilt({B,A,g},x);

短時間フーリエ変換の振幅の 2 乗を比較します。阻止帯域で振幅が急激に減少するのを観察します。

tiledlayout("flow")
nexttile
stft(x,Fs,Window=bohmanwin(128),OverlapLength=120, ...
    FFTLength=512,FrequencyRange="onesided")
title("Input x")
nexttile
stft(y,Fs,Window=bohmanwin(128),OverlapLength=120, ...
    FFTLength=512,FrequencyRange="onesided")
title("Output y")

Figure contains 2 axes objects. Axes object 1 with title Input x, xlabel Time (s), ylabel Frequency (Hz) contains an object of type image. Axes object 2 with title Output y, xlabel Time (s), ylabel Frequency (Hz) contains an object of type image.

入力引数

すべて折りたたむ

伝達関数の係数。ベクトルで指定します。全極フィルターを使用する場合は、b1 に設定します。全零 (FIR) フィルターを使用する場合は、a1 に設定します。

例: b = [1 3 3 1]/6 および a = [3 0 1 0]/3 は、正規化された 3 dB の周波数 0.5π ラジアン/サンプルをもつ 3 次のバタワース フィルターを指定します。

データ型: double | single

入力信号。実数値または複素数値のベクトル、行列、または N 次元配列として指定します。x は有限の値でなければなりません。x の長さは、max(length(B)-1, length(A)-1) として定義されるフィルター次数の 3 倍より大きくなければなりません。関数は、x が行ベクトルでなければ、x の最初の配列次元に沿って動作します。x が行ベクトルである場合は、2 番目の次元に沿って動作します。

例: cos(pi/4*(0:159))+randn(1,160) は単一チャネルの行ベクトル信号です。

例: cos(pi./[4;2]*(0:159))'+randn(160,2) は 2 チャネル信号です。

データ型: double | single
複素数のサポート: あり

2 次セクションの係数。行列として指定します。sosL 行 6 列の行列で、セクション数 L が 2 以上でなければなりません。セクション数が 2 未満の場合、関数は入力を分子ベクトルとして扱います。sos の各行は 2 次 (双二次) フィルターの係数に対応しています。sosi 行目は [bi(1) bi(2) bi(3) ai(1) ai(2) ai(3)] に対応しています。

例: s = [2 4 2 6 0 2;3 3 0 6 0 0] は、正規化された 3 dB の周波数 0.5π ラジアン/サンプルをもつ 3 次のバタワース フィルターを指定します。

データ型: double | single

R2024b 以降

スケール値。実数値のスカラー、または L + 1 個の要素をもつ実数値のベクトルとして指定します。ここで、L は CTF セクションの数です。スケール値は、カスケード フィルター表現のセクション全体にわたるフィルター ゲインの分布を表します。

filtfilt 関数は、g の指定方法に応じて、scaleFilterSections 関数を使用してフィルター セクションにゲインを適用します。

  • スカラー — この関数は、すべてのフィルター セクションにわたってゲインを均一に配分します。

  • ベクトル — この関数は、最初の L 個のゲイン値を対応するフィルター セクションに適用し、最後のゲイン値をすべてのフィルター セクションに均一に配分します。

データ型: double | single

デジタル フィルター。digitalFilter オブジェクトで指定します。デジタル フィルターを周波数応答仕様に基づいて生成するには、関数 designfilt を使用します。

例: d = designfilt("lowpassiir",FilterOrder=3,HalfPowerFrequency=0.5) は、正規化された 3 dB の周波数 0.5π ラジアン/サンプルをもつ 3 次のバタワース フィルターを指定します。

R2024b 以降

カスケード伝達関数 (CTF) 係数。スカラー、ベクトル、または行列として指定します。BA は、それぞれカスケード伝達関数の分子係数と分母係数をリストします。

B のサイズは L 行 (m + 1) 列、A のサイズは L 行 (n + 1) でなければなりません。ここで、

  • L はフィルター セクションの数を表します。

  • m はフィルターの分子の次数を表します。

  • n はフィルターの分母の次数を表します。

カスケード伝達関数の形式と係数行列の詳細については、CTF 形式によるデジタル フィルターの指定を参照してください。

メモ

A(:,1) のいずれかの要素が 1 と等しくない場合、filtfilt はフィルター係数を A(:,1) で正規化します。この場合、A(:,1) はゼロ以外でなければなりません。

データ型: double | single
複素数のサポート: あり

出力引数

すべて折りたたむ

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

  • filtfilt 関数は、x と同じサイズの y を返します。

  • 入力引数を single 型として指定した場合、filtfilt は単精度演算を使用してフィルター処理演算を計算し、single 型として y を返します。それ以外の場合、filtfiltdouble 型として y を返します。

詳細

すべて折りたたむ

ヒント

  • スケーリング ゲインを含むフィルターを CTF 形式で取得できます。buttercheby1cheby2ellip などのデジタル IIR フィルター設計関数の出力を使用します。これらの関数で、"ctf" フィルタータイプ引数を指定し、スケール値を取得するために BAg を返すように指定します。 (R2024b 以降)

参照

[1] Gustafsson, F. “Determining the initial states in forward-backward filtering.” IEEE® Transactions on Signal Processing. Vol. 44, April 1996, pp. 988–992. https://doi.org/10.1109/78.492552.

[2] Lyons, Richard G. Understanding Digital Signal Processing. Upper Saddle River, NJ: Prentice Hall, 2004.

[3] Mitra, Sanjit K. Digital Signal Processing. 2nd Ed. New York: McGraw-Hill, 2001.

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

拡張機能

すべて展開する

バージョン履歴

R2006a より前に導入

すべて展開する