Main Content

filtfilt

영위상(Zero-Phase) 디지털 필터링

설명

y = filtfilt(b,a,x)는 입력 데이터 x를 순방향과 역방향 모두로 처리하여 영위상 디지털 필터링을 수행합니다. 이 함수는 데이터를 순방향으로 필터링한 후, 시작 부분과 끝부분의 과도를 최소화하기 위해 초기 조건과 일치하도록 만들고, 필터링된 시퀀스를 역방향으로 뒤집은 다음, 반전된 시퀀스를 다시 필터에 통과시킵니다. 결과는 다음과 같은 특성을 가집니다.

  • 영위상 왜곡

  • 원래 필터 전달 함수 크기의 제곱과 같은 필터 전달 함수

  • ba로 지정된 필터 차수의 2배에 해당하는 필터 차수

filtfilt 함수는 Gustafsson[1]이 제안한 알고리즘을 구현합니다.

미분기 FIR 필터와 힐베르트 FIR 필터는 위상 응답에 따라 동작이 크게 달라지므로 이러한 필터와 함께 filtfilt 함수를 사용하지 마십시오.

y = filtfilt(sos,g,x)는 행렬 sos로 표현되는 2차섹션형(SOS)(바이쿼드) 필터와 스케일 값 g를 사용하여 입력 데이터 x를 영위상 필터링합니다.

예제

y = filtfilt(d,x)는 디지털 필터 d를 사용하여 입력 데이터 x를 영위상 필터링합니다. designfilt를 사용하여 주파수-응답 사양을 기반으로 d를 생성합니다.

예제

모두 축소

영위상 필터링을 사용하면 필터링되지 않은 신호에서 발생하는 특징들을, 필터링한 시간 파형의 정확히 동일한 위치에 유지할 수 있습니다.

합성 심전도(ECG) 파형을 영위상 필터링합니다. 파형을 생성하는 이 함수가 예제의 맨 끝에 있습니다. QRS 복합파는 심전도의 중요한 특징입니다. 여기서는 시간 지점 160 부근에서 QRS 복합파가 시작됩니다.

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);

subplot(2,1,1)
plot([y y1])
title("Filtered Waveforms")
legend("Zero-phase Filtering","Conventional Filtering")

subplot(2,1,2)
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 복합파를 유지합니다. 일반적인 필터링은 신호에서 잡음을 줄이지만, QRS 복합파를 지연시킵니다.

버터워스 2차섹션형(SOS) 필터를 사용하여 필터링을 반복합니다.

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

subplot(1,1,1)
plot(x)
hold on
plot(y,LineWidth=3)
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.

다음 함수는 심전도 파형을 생성합니다.

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

입력 인수

모두 축소

전달 함수 계수로, 벡터로 지정됩니다. 전극점 필터를 사용하는 경우 b1을 입력합니다. 전영점 (FIR) 필터를 사용하는 경우 a1을 입력합니다.

예: b = [1 3 3 1]/6a = [3 0 1 0]/3은 0.5π rad/sample의 정규화된 3dB 주파수를 갖는 3차 버터워스 필터를 지정합니다.

데이터형: single | double

입력 신호로, 실수 벡터 또는 복소수 벡터, 행렬 또는 N차원 배열로 지정됩니다. x는 유한한 값이어야 합니다. x의 길이는 max(length(B)-1, length(A)-1)로 정의된 필터 차수의 3배보다 커야 합니다. x가 행 벡터가 아닌 한, 함수는 x의 첫 번째 배열 차원을 따라 연산을 수행합니다. x가 행 벡터인 경우 함수는 두 번째 차원을 따라 연산을 수행합니다.

예: cos(pi/4*(0:159))+randn(1,160)은 단일채널 행 벡터 신호입니다.

예: cos(pi./[4;2]*(0:159))'+randn(160,2)는 2채널 신호입니다.

데이터형: single | double
복소수 지원 여부:

2차섹션형 계수로, 행렬로 지정됩니다. sos는 K×6 행렬이며, 여기서 섹션 개수 K는 2보다 크거나 같아야 합니다. 섹션 개수가 2보다 작으면 함수가 입력값을 분자 벡터로 간주합니다. sos의 각 행은 2차(바이쿼드) 필터의 계수에 대응됩니다. sos의 i번째 행은 [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]은 0.5π rad/sample의 정규화된 3dB 주파수를 갖는 3차 버터워스 필터를 지정합니다.

데이터형: single | double

스케일링 인자로, 벡터로 지정됩니다.

데이터형: single | double

디지털 필터로, digitalFilter 객체로 지정됩니다. designfilt를 사용하여 주파수 응답 사양을 기반으로 하여 디지털 필터를 생성합니다.

예: d = designfilt("lowpassiir",FilterOrder=3,HalfPowerFrequency=0.5)은 0.5π rad/sample의 정규화된 3dB 주파수를 갖는 3차 버터워스 필터를 지정합니다.

출력 인수

모두 축소

필터링된 신호로, 벡터, 행렬 또는 N차원 배열로 반환됩니다.

filtfilt 함수에 대한 입력값이 단정밀도인 경우 함수는 출력값 y를 단정밀도로 반환합니다.

참고 문헌

[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] Mitra, Sanjit K. Digital Signal Processing. 2nd Ed. New York: McGraw-Hill, 2001.

[3] 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 이전에 개발됨