Main Content

필터 구현

컨벌루션과 필터링

필터링의 수학적 기반은 컨벌루션입니다. 유한 임펄스 응답(FIR) 필터에서, 필터링 연산의 출력 y(k)는 입력 신호 x(k)와 임펄스 응답 h(k)의 컨벌루션입니다.

y(k)=l=h(l)x(kl).

입력 신호의 길이도 유한한 경우 MATLAB® conv 함수를 사용하여 필터링 연산을 구현할 수 있습니다. 예를 들어, 3차 평균 필터를 사용하여 5개 샘플로 구성된 확률 벡터를 필터링하기 위해 x(k)를 벡터 x로 저장하고 h(k)를 벡터 h로 저장한 후 이 두 벡터를 컨벌루션할 수 있습니다.

x = randn(5,1);
h = [1 1 1 1]/4;   % A third-order filter has length 4
y = conv(h,x)
y =
   -0.3375
    0.4213
    0.6026
    0.5868
    1.1030
    0.3443
    0.1629
    0.1787
y의 길이는 x의 길이와 h의 길이의 합보다 하나가 작습니다.

필터와 전달 함수

필터의 전달 함수는 필터 임펄스 응답에 대한 Z 변환입니다. FIR 필터에서, 출력값 y에 대한 Z 변환 Y(z)는 입력값 x에 대한 Z 변환 X(z)와 전달 함수의 곱입니다.

Y(z)=H(z)X(z)=(h(1)+h(2)z1++h(n+1)zn)X(z).

다항식 계수 h(1), h(2), …, h(n + 1)은 n차 필터의 임펄스 응답의 계수에 대응됩니다.

참고

필터 계수의 인덱스는 0부터 n까지가 아니라 1부터 (n + 1)까지입니다. 이는 MATLAB 벡터에 사용된 표준 인덱싱 방식을 따르는 것입니다.

FIR 필터는 전영점 필터, 비재귀적 필터 또는 이동평균(MA) 필터라고도 합니다.

무한 임펄스 응답(IIR) 필터에서, 전달 함수는 다항식이 아니라 유리 함수입니다. 입력 신호와 출력 신호의 Z 변환은 다음과 같은 관계식을 가집니다.

Y(z)=H(z)X(z)=b(1)+b(2)z1+...+b(n+1)zna(1)+a(2)z1+...+a(m+1)zmX(z),

여기서 b(i)와 a(i)는 필터 계수입니다. 이 경우 필터의 차수는 n과 m 중 최댓값입니다. n = 0인 IIR 필터는 전극점 필터, 재귀적 필터 또는 자기회귀(AR) 필터라고도 합니다. n과 m이 모두 0보다 큰 IIR 필터는 극점-영점 필터, 재귀적 필터 또는 자기회귀 이동평균(ARMA) 필터라고도 합니다. 머리글자어 AR, MA, ARMA는 대개 필터링된 확률 과정(Stochastic Process)과 연관된 필터에 적용됩니다.

filter 함수로 필터링하기

IIR 필터의 필터링 연산은 간단한 컨벌루션 대신 전달 함수 관계식에서 구하는 차분 방정식으로 기술됩니다. a(1) = 1이라 가정하고, 분모를 좌변으로 이동하고 Z 역변환을 수행하여 다음과 같은 식을 얻습니다.

y(k)+a(2)y(k1)++a(m+1)y(km)=b(1)x(k)+b(2)x(k1)++b(n+1)x(kn).

y(k)를 현재 입력값과 이전 입력값, 그리고 이전 출력값으로 표현하면 다음과 같습니다.

y(k)=b(1)x(k)+b(2)x(k1)++b(n+1)x(kn)a(2)y(k1)a(m+1)y(km),

이는 디지털 필터를 표준적인 시간 영역으로 표현한 것입니다. y(1)부터 시작하고 초기 조건이 0인 인과 시스템(causal system)이라고 가정하면, 이 표현식은 다음과 동일합니다.

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

이 필터링 연산을 구현하려면 MATLAB filter 함수를 사용할 수 있습니다. filter는 계수를 2개 행 벡터에 저장하는데, 한 벡터에는 분자를 저장하고 다른 한 벡터에는 분모를 저장합니다. 예를 들어, 다음과 같은 차분 방정식을 풀려면

y(n)0.9y(n1)=x(n)Y(z)=110.9z1X(z)=H(z)X(z),

다음을 사용할 수 있습니다.

b = 1;
a = [1 -0.9];
y = filter(b,a,x);
filter는 입력 샘플 개수만큼의 출력 샘플을 제공합니다. 즉, y의 길이가 x의 길이와 같습니다. a의 첫 번째 요소가 1이 아니면 filter는 차분 방정식을 구현하기 전에 모든 계수를 a(1)로 나눕니다.

참고 항목

함수