주요 콘텐츠

filtfilt

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

설명

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

  • 영위상 왜곡

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

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

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

예제

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

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

예제

y = filtfilt(B,A,x,"ctf")는 분자 계수 B와 분모 계수 A로 각각 정의되는 Cascaded Transfer Functions(CTF)를 사용하여 입력 데이터 x를 영위상 필터링합니다. (R2024b 이후)

참고

A를 스칼라 또는 벡터로 지정할 경우, 2차섹션형(SOS) 행렬 입력 sos의 6개 열로 CTF 분자 행렬 B를 명확히 구분하려면 "ctf" 옵션을 지정하십시오.

예제

y = filtfilt({B,A,g},x)는 입력 데이터 x의 필터링에 필터 스칼라 값 g를 포함합니다. (R2024b 이후)

예제

y = filtfilt(___,Name=Value)는 이름-값 인수를 사용하여 추가 옵션을 지정합니다. (R2026a 이후)

예제

모두 축소

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

합성 심전도(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);

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

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

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.

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

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.1dB와 40dB인 타원 필터를 설계합니다. 샘플 레이트를 2000Hz로 지정합니다. 필터의 주파수 응답을 플로팅합니다.

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와 스케일 값을 사용하여 진동 신호를 필터링합니다.

정규 분포 잡음과 세 개의 정현파 파형으로 구성된 신호 u를 생성합니다. 샘플 레이트는 1kHz입니다.

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;

24차 체비쇼프 유형 II 필터로 신호 x를 필터링합니다. CTF 형식과 스케일 값(B,A,g)을 사용합니다.

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

단시간 푸리에 변환의 크기 제곱을 비교합니다. 저지대역에서 크기가 급격히 감소하는 것을 확인합니다.

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.

R2026a 이후

60Hz 간격으로 최대 600Hz까지 확장되는 여러 고조파를 포함하는 복소수 값 30Hz 정현파 톤에 영위상 필터링을 적용합니다.

샘플 레이트가 600Hz인 2초 길이의 복소수 값 신호를 만듭니다. 이 신호는 10V 30Hz 사인 톤으로 구성되며, 60Hz에서 600Hz 사이까지 균등하게 분포된 10개의 고조파가 포함되어 있고 각 고조파의 진폭은 1V입니다.

Fs = 600;
t = (0:1/Fs:2)';
x = 10*exp(1i*2*pi*30*t) + sum(exp(1i*2*pi*60*t*(0:9)),2);

톤이 30Hz에서 진동하고 원치 않는 성분이 60Hz의 배수로 나타나 최대 10번째 배수까지 주파수 피크를 가지므로, 관심 신호인 톤을 복원하는 데에는 10차 IIR 콤(Comb) 노치 필터가 적합합니다.

ba를 품질 계수가 35인 10차 IIR 콤(Comb) 노치 필터의 분자 계수와 분모 계수를 나타내는 벡터로 정의합니다. 특정 차수와 품질 계수를 가진 IIR 콤(Comb) 필터를 설계하는 방법에 대한 자세한 내용은 iircomb (DSP System Toolbox) 항목을 참조하십시오.

b = [0.957 zeros(1,9) -0.957];
a = [1 zeros(1,9) -0.914];

0.9초에서 1.1초까지 신호의 실수부를 플로팅합니다. 0Hz에서 600Hz까지 필터 응답을 플로팅합니다.

tiledlayout("flow")
nexttile
plot(t,real(x))
xlim([0.9 1.1])
xlabel("Time (s)")
title("real(x)")
nexttile
[h,f] = freqz(b,a,8192,"whole",Fs);
plot(f,mag2db(abs(h)))
xlabel("Frequency (Hz)")
title("Magnitude Response (b,a)")

Figure contains 2 axes objects. Axes object 1 with title real(x), xlabel Time (s) contains an object of type line. Axes object 2 with title Magnitude Response (b,a), xlabel Frequency (Hz) contains an object of type line.

위상을 유지하면서 입력 신호를 필터링합니다. Gustafsson 기법을 사용하여 필터 상태의 초기 조건을 추정합니다. 과도 길이가 신호 길이와 동일하다고 가정하고 샘플을 대칭 복사하여 입력 신호를 채웁니다.

y = filtfilt(b,a,x, ...
    InitialStatesMethod="gustafsson", ...
    TransientLength=length(x), ...
    PaddingPattern="reflect");

시간 영역과 주파수 영역에서 입력 신호와 필터링된 신호를 비교합니다. 0.9초에서 1.1초까지 두 신호의 실수부와 0Hz에서 600Hz까지 Welch 파워 스펙트럼을 플로팅합니다. 필터링된 신호는 고조파가 제거된 30Hz 톤을 보여주며, 필터링된 신호 y는 입력 신호 x와 위상이 일치합니다.

figure;
tiledlayout("vertical")
nexttile
plot(t,real(x),t,real(y),"--")
legend("real(" + ["x" "y"] +")",Location="southeast")
xlabel("Time (s)")
xlim([0.9 1.1])
nexttile
[p,f] = pwelch([x y],[],[],8192,Fs);
pdb = pow2db(abs(p));
plot(f,pdb(:,1),"-",f,pdb(:,2),"--")
xlabel("Frequency (Hz)")
legend("PSD of " + ["x" "y"],Location="southeast")

Figure contains 2 axes objects. Axes object 1 with xlabel Time (s) contains 2 objects of type line. These objects represent real(x), real(y). Axes object 2 with xlabel Frequency (Hz) contains 2 objects of type line. These objects represent PSD of x, PSD of y.

입력 인수

모두 축소

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

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

데이터형: double | single

입력 신호로, 실수 벡터 또는 복소수 벡터, 행렬 또는 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채널 신호입니다.

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

2차섹션형(SOS) 계수로, 행렬로 지정됩니다. 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]는 0.5π rad/sample의 정규화된 3dB 주파수를 갖는 3차 버터워스 필터를 지정합니다.

데이터형: double | single

스케일 값으로, 실수 값 스칼라 또는 L + 1개의 요소를 가진 실수 값 벡터로 지정됩니다. 여기서 L은 CTF 섹션의 개수입니다. 스케일 값은 종속 연결 필터 표현의 섹션에 걸친 필터 이득의 분포를 나타냅니다.

filtfilt 함수는 g를 지정하는 방법에 따라 scaleFilterSections 함수를 사용하여 필터 섹션에 이득을 적용합니다.

  • 스칼라 — 함수는 모든 필터 섹션에 걸쳐 이득을 균일하게 분배합니다.

  • 벡터 — 함수는 처음 L개의 이득 값을 해당 필터 섹션에 적용하고 마지막 이득 값을 모든 필터 섹션에 균일하게 분배합니다.

데이터형: double | single

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

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

종속 연결 전달 함수(CTF) 계수로, 스칼라, 벡터 또는 행렬로 지정됩니다. BA는 각각 종속 연결 전달 함수의 분자 및 분모 계수를 나열합니다.

B의 크기는 L×(m + 1)이어야 하고 A의 크기는 L×(n + 1)이어야 합니다. 여기서,

  • L은 필터 섹션의 개수를 나타냅니다.

  • m은 필터 분자의 차수를 나타냅니다.

  • n은 필터 분모의 차수를 나타냅니다.

종속 연결 전달 함수 형식과 계수 행렬에 대한 자세한 내용은 CTF 형식으로 디지털 필터 지정하기 항목을 참조하십시오.

참고

A(:,1)의 요소 중 하나라도 1과 같지 않으면 filtfilt 함수는 필터 계수를 A(:,1)로 정규화합니다. 이 경우 A(:,1)은 0이 아니어야 합니다.

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

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

이름-값 인수

모두 축소

선택적 인수 쌍을 Name1=Value1,...,NameN=ValueN으로 지정합니다. 여기서 Name은 인수 이름이고 Value는 대응값입니다. 이름-값 인수는 다른 인수 뒤에 와야 하지만, 인수 쌍의 순서는 상관없습니다.

예: y = filtfilt(d,x,InitialStatesMethod="gustafsson")은 디지털 객체 d를 사용하여 입력 신호 x에 영위상 필터링을 수행하고 Gustafsson의 순방향-역방향 최소제곱 기법을 적용하여 최적의 초기 상태를 계산합니다.

R2026a 이후

필터 상태의 초기 조건(초기 상태)을 추정하는 방법으로, 다음 중 하나로 지정됩니다.

  • "const"filtfilt 함수는 필터 계수로부터 도출된 선형 시스템의 해를 구해 초기 상태를 추정합니다.

    • 이 방법에서는 입력 신호가 상수이고 시스템이 정상 상태(steady state)에서 동작한다고 가정합니다. 따라서 필터링된 신호는 상수 입력 신호에 대응하는 정상 상태 값에서 시작됩니다.

    • x가 상수가 아닌 경우, 이 방법을 사용하기 위해 함수는 첫 번째 샘플을 상수 입력 신호로 가정합니다.

  • "gustafsson"filtfilt 함수는 Gustafsson의 순방향-역방향 최소제곱 기법[1]을 사용하여 초기 상태를 추정합니다. 이 방법은 순방향-역방향 필터링 출력과 역방향-순방향 필터링 출력 간 차이의 에너지를 최소화하여 대칭성을 확보하고 양쪽 끝에서 경계 아티팩트를 줄입니다.

  • "zero"filtfilt 함수는 모든 초기 상태를 0으로 설정합니다. 이 방법은 계산 복잡도가 가장 낮고 입력 신호나 필터 응답과 독립적입니다.

R2026a 이후

과도 응답의 길이(과도 길이)로, "filtord", "stepzlen" 또는 length(x)보다 작거나 같은 음이 아닌 정수로 지정됩니다.

과도 길이는 filtfilt 함수가 필터링된 신호의 시작과 끝에서 과도 응답을 모델링하고 억제하는 데 사용하는 샘플 개수를 나타냅니다.

  • "filtord"filtfilt 함수는 필터 차수의 3배에 해당하는 과도 길이를 사용합니다.

  • "stepzlen"filtfilt 함수는 필터의 계단 응답의 정착 시간을 기준으로 한 과도 길이를 사용합니다.

    계단 응답이 s[k]고 정상 상태 값이 sfinal인 필터에 대해, 함수는 |s[k] – sfinal| < 0.02×max(|s[k] – sfinal|)을 만족하는 가장 작은 인덱스 k를 과도 길이로 결정합니다.

    k가 신호 길이보다 크면, 함수는 신호 길이 length(x)를 과도 길이로 사용합니다.

  • length(x)보다 작거나 같은 음이 아닌 정수 — filtfilt 함수는 지정된 과도 길이를 사용합니다.

PaddingPatern"none"으로 지정하면, filtfilt 함수는 TransientLength에 지정한 값을 무시하고, 필터링된 신호에서 모델링하거나 억제해야 할 과도가 없다고 가정합니다.

R2026a 이후

필터링 전에 입력 신호를 채우는 패턴으로, "linear", "reflect" 또는 "none"으로 지정됩니다.

이 함수는 TransientLength에 지정한 값을 사용하여 연산 차원을 따라 입력 신호 x를 채울 샘플의 개수를 결정합니다. 함수는 채워진 샘플을 사용하여 모델링하고, 필터링된 신호의 양쪽 끝에서 모델링된 과도 응답을 억제한 후 y를 반환합니다.

다음 표에는 패턴 이름과 설명, 그리고 각 패턴이 입력 데이터 x = [a b c d ... j k l m]을 채우는 방법에 대한 예시가 나와 있습니다.

채우기 패턴설명채워진 데이터
"linear"

함수가 경계에서 기울기의 연속성이 유지되도록 입력 신호의 양쪽 끝을 채웁니다.

이 채우기 패턴은 신호가 천이 영역으로 부드럽게 연속되도록 하며, 경계 과도를 억제하는 데 도움이 됩니다.

"reflect"함수가 양쪽 끝의 샘플을 대칭 복사하여 입력 신호를 채웁니다. 이때 끝점은 중복되지 않습니다.

"none"

함수가 입력 신호를 채우지 않습니다.

이 경우 filtfilt 함수는 TransientLength에 지정된 값도 무시합니다.

출력 인수

모두 축소

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

  • filtfilt 함수는 x와 동일한 크기의 y를 반환합니다.

  • 입력 인수를 single형으로 지정하면 filtfilt 함수는 단정밀도 연산방식을 사용하여 필터링 연산을 수행하고 ysingle형으로 반환합니다. 그렇지 않으면 filtfilt 함수는 ydouble형으로 반환합니다.

세부 정보

모두 축소

스케일링 이득을 포함한 CTF 형식의 필터를 구할 수 있습니다. butter, cheby1, cheby2, ellip와 같은 디지털 IIR 필터 설계 함수의 출력값을 사용하십시오. 이들 함수에서 "ctf" 필터 유형 인수를 지정하고 B, A, g를 반환하도록 지정하여 스케일 값을 구합니다. (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 이전에 개발됨

모두 확장