Main Content

filter

1차원 디지털 필터

설명

예제

y = filter(b,a,x)는 분자 및 분모 계수인 ba로 정의되는 유리 전달 함수(Rational Transfer Function)를 사용하여 입력 데이터 x를 필터링합니다.

a(1)1과 일치하지 않으면 filtera(1)로 필터 계수를 정규화합니다. 따라서 a(1)은 0이 아니어야 합니다.

  • 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);
rng default  %initialize random number generator
x = sin(t) + 0.25*rand(size(t));

이동평균 필터는 데이터를 따라 길이가 windowSize인 윈도우만큼 이동하며 각 윈도우에 포함된 데이터의 평균을 계산합니다. 다음 차분 방정식은 벡터 x의 이동평균 필터를 정의합니다.

y(n)=1windowSize(x(n)+x(n-1)+...+x(n-(windowSize-1))).

간격 크기 5에 대해, 유리 전달 함수의 분자 및 분모 계수를 계산합니다.

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

데이터의 이동평균을 구한 다음 원래 데이터와 함께 플로팅합니다.

y = filter(b,a,x);

plot(t,x)
hold on
plot(t,y)
legend('Input Data','Filtered Data')

이 예제에서는 다음 유리 전달 함수를 사용하여 데이터 행렬을 필터링합니다.

H(z)=b(1)a(1)+a(2)z-1=11-0.2z-1

임의의 입력 데이터로 구성된 2×15 행렬을 만듭니다.

rng default  %initialize random number generator
x = rand(2,15);

유리 전달 함수에 대해 분자 및 분모 계수를 정의합니다.

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

x의 두 번째 차원을 따라 전달 함수를 적용하고 각 행의 1차원 디지털 필터를 반환합니다. 원래 데이터의 첫 번째 행과 필터링된 데이터를 함께 플로팅합니다.

y = filter(b,a,x,[],2);

t = 0:length(x)-1;  %index vector

plot(t,x(1,:))
hold on
plot(t,y(1,:))
legend('Input Data','Filtered Data')
title('First Row')

입력 데이터의 두 번째 행과 필터링된 데이터를 함께 플로팅합니다.

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

윈도우 크기가 3인 이동평균 필터를 정의합니다.

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

데이터로 구성된 1×6 행 벡터의 3점 이동평균을 구합니다.

x = [2 1 6 2 4 3];
y = filter(b,a,x)
y = 1×6

    0.6667    1.0000    3.0000    3.0000    4.0000    3.0000

기본적으로 filter 함수는 과거의 입력값과 출력값이 모두 0이라고 가정하여 필터 지연을 0으로 초기화합니다. 이 경우 y의 처음 두 개 요소는 각각 x의 첫 번째 요소와 처음 두 개 요소의 3점 이동평균입니다. 즉, 첫 번째 요소 0.6667은 2의 3점 평균이고, 두 번째 요소 1은 2와 1의 3점 평균입니다.

데이터에 과거의 입력값과 출력값을 추가로 포함하려면 초기 조건을 필터 지연으로 지정하십시오. 현재 입력값의 이러한 초기 조건은 과거 입력값(및 과거 출력값)에 동일한 전달 함수를 적용하여 얻은 최종 조건입니다. 예를 들어, 과거 입력값 [1 3]을 포함시켜 보겠습니다. 필터 지연이 없는 경우 과거 출력값은 (0+0+1)/3 및 (0+1+3)/3입니다.

x_past = [1 3];
y_past = filter(b,a,x_past)
y_past = 1×2

    0.3333    1.3333

그러나 이러한 과거 입력값의 꼬리가 0이라고 가정하면 동일한 전달 함수를 계속 적용하여 0이 아닌 출력값을 추가로 생성할 수 있습니다. 이러한 추가 출력값은 (1+3+0)/3 및 (3+0+0)/3이며, 이는 과거 입력값에서 얻은 최종 조건을 나타냅니다. 이러한 최종 조건을 계산하려면 filter 함수의 두 번째 출력 인수를 지정하십시오.

[y_past,zf] = filter(b,a,x_past)
y_past = 1×2

    0.3333    1.3333

zf = 2×1

    1.3333
    1.0000

현재 데이터에 과거 입력값을 포함하려면 filter 함수의 네 번째 입력 인수를 사용하여 필터 지연을 지정합니다. 과거 데이터의 최종 조건을 현재 데이터의 초기 조건으로 사용합니다.

y = filter(b,a,x,zf)
y = 1×6

    2.0000    2.0000    3.0000    3.0000    4.0000    3.0000

이 경우 y의 첫 번째 요소는 1, 3, 2의 3점 이동평균인 2가 되고, y의 두 번째 요소는 3, 2, 1의 이동평균인 2가 됩니다.

특히 메모리 제한을 고려해야 한다면, 필터 지연에 대한 초기 및 최종 조건을 사용하여 섹션의 데이터를 필터링합니다.

큰 랜덤 데이터 시퀀스를 생성하여 2개의 세그먼트 x1x2로 분할합니다.

x = randn(10000,1);

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

전체 시퀀스 xx1x2의 세로 결합입니다.

유리 전달 함수에 대해 분자 및 분모 계수를 정의합니다.

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

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

부분 시퀀스 x1x2를 한 번에 하나씩 필터링합니다. x1 필터링에서 최종 조건을 출력하여 필터의 내부 상태를 첫 번째 세그먼트의 끝에 저장합니다.

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

x1 필터링의 최종 조건을 초기 조건으로 사용하여 두 번째 세그먼트 x2를 필터링합니다.

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

y1x1에서 필터링된 데이터이고 y2x2에서 필터링된 데이터입니다. 필터링된 전체 시퀀스는 y1y2의 세로 결합입니다.

비교를 위해 전체 시퀀스를 동시에 필터링합니다.

y = filter(b,a,x);

isequal(y,[y1;y2])
ans = logical
   1

입력 인수

모두 축소

유리 전달 함수의 분자 계수로, 벡터로 지정됩니다.

데이터형: 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×4×5 배열 x의 두 번째 차원(dim = 2)에 대해 filter를 사용한다고 가정합니다. 배열 zi의 크기는 [max(length(a),length(b))-1]×3×5여야 합니다.

[]로 지정되는 디폴트 값은 모든 필터 지연을 0으로 초기화합니다.

데이터형: double | single | int8 | int16 | int32 | int64 | uint8 | uint16 | uint32 | uint64 | logical
복소수 지원 여부:

연산을 수행할 차원으로, 양의 정수 스칼라로 지정됩니다. 차원을 지정하지 않을 경우 디폴트 값은 크기가 1보다 큰 첫 번째 배열 차원이 됩니다.

2차원 입력 배열 x가 있다고 가정하겠습니다.

  • dim = 1인 경우 filter(b,a,x,zi,1)x의 열을 따라 연산을 수행하고 각 행에 적용된 필터를 반환합니다.

    filter(b,a,x,zi,1) column-wise operation

  • dim = 2인 경우 filter(b,a,x,zi,2)x의 행을 따라 연산을 수행하고 각 행에 적용된 필터를 반환합니다.

    filter(b,a,x,zi,2) row-wise operation

dimndims(x)보다 큰 경우 filterxdim개까지의 차원이 추가적으로 있는 것으로 간주합니다. 추가적인 차원은 크기가 1입니다. 예를 들어, x는 크기가 2×3인 행렬이고 dim = 3인 경우 filter는 2×3×1 크기의 행렬인 것처럼 x의 세 번째 차원을 따라 연산을 수행합니다.

데이터형: double | single | int8 | int16 | int32 | int64 | uint8 | uint16 | uint32 | uint64 | logical

출력 인수

모두 축소

필터링된 데이터로, 입력 데이터 x와 크기가 같은 벡터, 행렬, 다차원 배열 중 하나로 반환됩니다.

xsingle형인 경우 filter는 기본적으로 단정밀도로 계산되며 y 또한 single형이 됩니다. 그렇지 않으면, ydouble형으로 반환됩니다.

데이터형: double | single

필터 지연의 최종 조건으로, 벡터, 행렬, 다차원 배열 중 하나로 반환됩니다.

  • x가 벡터인 경우 zfmax(length(a),length(b))-1 길이의 열 벡터입니다.

  • x가 행렬이거나 다차원 배열인 경우 zfmax(length(a),length(b))-1 길이의 열 벡터로 구성된 배열이며, zf의 열 개수는 x의 열 개수와 같습니다. 예를 들어, 3×4×5 배열 x의 두 번째 차원(dim = 2)에 대해 filter를 사용한다고 가정합니다. 배열 zf의 크기는 [max(length(a),length(b))-1]×3×5입니다.

데이터형: double | single

세부 정보

모두 축소

유리 전달 함수

Z 변환 도메인의 벡터에서 filter 연산의 입력-출력 설명은 유리 전달 함수입니다. 유리 전달 함수는 다음 형식을 사용합니다.

Y(z)=b(1)+b(2)z1+...+b(nb+1)znb1+a(2)z1+...+a(na+1)znaX(z),

여기서 유한 임펄스 응답(FIR) 및 무한 임펄스 응답(IIR) 필터가 모두 처리됩니다[1]. 여기서 X(z)는 입력 신호 x의 Z 변환이고 Y(z)는 출력 신호 y의 Z 변환이며 na는 피드백 필터의 차수이고 nb는 피드포워드 필터의 차수입니다. 정규화로 인해 a(1) = 1로 간주됩니다.

L 요소를 가진 이산 신호의 경우 유리 전달 함수를 다음의 차분 방정식으로 표현할 수도 있습니다.

a(1)y(L)=b(1)x(L)+b(2)x(L1)+...+b(nb+1)x(Lnb)a(2)y(L1)...a(na+1)y(Lna).

또한 IIR 디지털 필터의 다음 도식에서와 같이 DFIIt(Direct Form II Transposed) 구현 방식을 사용하여 유리 전달 함수를 표현할 수 있습니다. 도식에서 na = nb = n–1입니다. 피드백과 피드포워드 필터의 차수가 다른 경우 또는 na ≠ nb인 경우 더 높은 차수의 항을 0으로 처리할 수 있습니다. 예를 들어, a = [1,2]이고 b = [2,3,2,4]인 필터의 경우 a = [1,2,0,0]이라고 가정할 수 있습니다.

Block diagram that illustrates the direct-form II transposed implementation of an IIR digital filter with order n-1

샘플 점 m에서 filter의 연산은 다음과 같은 시간 영역 차분 방정식으로 주어집니다.

y(m)=b(1)x(m)+w1(m1)w1(m)=b(2)x(m)+w2(m1)a(2)y(m)       =                 wn2(m)=b(n1)x(m)+wn1(m1)a(n1)y(m)wn1(m)=b(n)x(m)a(n)y(m).

기본적으로 filter 함수는 필터 지연을 0으로 초기화합니다. 여기서 wk(0) = 0입니다. 이 초기화에서는 과거의 입력값과 출력값이 모두 0이라고 가정합니다. 현재 데이터에 0이 아닌 과거 입력값을 포함하려면 현재 데이터의 초기 조건을 필터 지연으로 지정하십시오. 필터 지연은 과거 입력값(및 과거 출력값)에 동일한 전달 함수를 적용하여 얻은 최종 조건이라고 생각할 수 있습니다. filter를 사용하여 필터 지연을 설정할 때 네 번째 입력 인수 zi를 지정할 수 있습니다. 여기서 wk(0) = zi(k)입니다. filter를 사용하여 최종 조건에 액세스할 때 두 번째 출력 인수 zf를 지정할 수도 있습니다. 여기서 wk(L) = zf(k)입니다.

  • filter 함수를 FIR 필터의 b 계수와 함께 사용하려면 y = filter(b,1,x)를 사용하십시오.

  • Signal Processing Toolbox™가 있는 경우, y = filter(d,x)를 사용하여 digitalFilter (Signal Processing Toolbox) 객체 d로 입력 신호 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 이전에 개발됨

참고 항목

|