티스토리 뷰

CS/Signal

IIR &Butterworth filter Theory

Lazyer 2018. 12. 26. 18:32

IIR & Butterworth filter - Scipy.signal

@(Summary)[python, scipy, signal, filter, 티스토리]

Scipy.signal 을 다루기 위한 개념 정리


1. IRR

물리적 채널에 대한 제한적 채널 모델에서 가장 일반적인 것이 선형 시불변 (LTI, Linear Time-Invariant) 채널이다. 시불변성을 띄는 signal 은 noise가 없는 signal을 의미하며 통상 아래와 같이 표현된다.

 

 

임펄스 응답은 이렇게 과거의 입력 값들이 현재의 출력 값에 기여하는 정도를 나타내고, 초기 조건이 0일 때 LTI 시스템의 해석을 편리하게 해주는데, 임펄스 응답이란 특정 순간에서 임펄스 함수가 인가되어 나온 응답이다. 첫 번째 식에서 가 임펄스 응답이 된다.

LTI 시스템에서 임펄스 응답은 시간영역에서 푸리에 변환을 통한 주파수 응답, 시간영역에서 라플라스 변환을 통한 전달함수 등으로 여러 변환이 가능하며, 시간 / 주파수 / 복소주파수 영역에서 선형불변 시스템의 입출력 성질을 보여준다. LTI 모델은 일반적으로 다음과 같이 표현도 가능하다.

 

 

이는 IIR 필터의 차분방정식과 동일한 형태이다. IIR 필터는 현재의 출력을 계산할 때 입력 신호와 함께 과거에 출력된 신호를 사용하는 특징이 있다. IRR 필터는 이전 출력값을 통하여 계산되기 때문에, 초기 조건이 매우 중요하며 x[n]이 0이 되더라도 이전 출력 값이 존재하면 출력값은 0이 되지 않는다. 위의 식은 아래와 같이도 표현이 가능하다.

 

를 다항식으로 표현하면 아래와 같으며,

 

 

따라서 는 다음과 같이 정리된다.

 

시스템 함수 또는 리펄스 함수의 역할은 원하는 정보를 증폭시키고 유지시키며, 원치 않는 정보를 감쇄 또는 제거하는 것인데 일반적인 아날로그 필터의 역할과 동일하다. 따라서 아날로그 필터(IRR)는 시스템 함수(리펄스 함수)와 같이 아래의 모양을 띈다고 할 수 있다.

 

 

IRR 필터는 Scipy.signal.lfilter로 구현 가능하다.

scipy.signal.lfilter(b, a, x, axis=-1, zi=None)

  • b : 분자 다항식 차수
  • a : 분모 다항식 차수
  • x : Signal
  • zi : 초기조건 으로 구현 가능하며, 초기 조건은 lfilter_zi(b, a)를 통하여 구할 수 있다.

GITHUB - Scipy.signal.lfilter example

2. Butterworth Filter

일반적인 IRR 필터의 식에서 계수를 적절하게 조절해 주면 원하는 필터로써의 기능을 수행할 수 있다. IRR 필터에서 가장 많이 쓰이는 것으로 Butterworth, Chebyshev 두 개가 있다. Butterworth 필터는 아래와 같다.

 

 

IRR 필터에서 분자의 항을 'zero' 라고 하는데 입력 신호는 'zero'를 지나며 filter되어 감쇄, 제거된다. 분모의 항을 'poll' 이라고 하는데 입력 신호는 'poll'을 지나며 filter되어 유지되거나 증폭된다. Butterworth filter는 'zero' 가 없기 떄문에 All-poll filter라고 한다. 'zero'가 없기는 하지만 all-pole 필터에도 zero가 존재하며, 'zero'인 s는 모두 ∞로 가버리기 때문에 Ω→∞인 주파수를 가지는 input signal은 모두 없어지게 된다. Butterworth filter의 계수를 조절함에 따라 원하는 주파수를 모두 없앨 수 있기 떄문에, Low pass filter 의 구현을 쉽게 도와준다.

 

 

AMPLITUDE의 값이 낮을 수록 Signal을 STOP 시킨다. transition 기울기가 수직이 되면, PASSBAND와 STOPBAND의 경계가 확실한 이상적인 filter가 되지만 이러한 filter을 푸리에변환 하게되면 완벽한 sin Signal로 변환되어 실제로는 존재할 수 없는 Signal이다.

 

 

위의 Butterworth filter의 필터 모양, 사용방법을 살펴보자. 먼저 위 식을 Ω→∞0 일 때, 그리고 Ω→∞를 미분해보면 모두 0으로 수렴한다. Ω→∞ d일 때를 살펴보면

 

 

이 되는데, N이 커질 수록 분모의 크기가 빨리 증가하여 필터의 기울기가 급격히 커지고, 이상적인 filter에 가까워지게 된다.

 

 

위의 식을 계산하면 실제로 계수를 조정하는 방법, Ωc 를 구하는 방법까지 풀이가 가능하지만, Scipy.signal을 사용하는데에는 여기까지만 이해하여도 충분하다고 생각된다.

Butterworth Filter는 Scipy.signal.butter로 구현 가능하다.

scipy.signal.butter(N, Wn, btype='low', analog=False, output='ba', fs=None)

  • N : 차수 (클 수록 기울기게 급해진다)
  • Wn : Band Hz
  • btype : {‘lowpass’, ‘highpass’, ‘bandpass’, ‘bandstop’}
  • fs : Sampling frequency

GITHUB - Scipy.signal.butter example

 


 

 

[Reference]

http://www.ktword.co.kr/abbr_view.php?m_temp1=3722 https://wikidocs.net/4066 http://contents.kocw.or.kr/KOCW/document/2014/Hallym/parkseophyeong/6.pdf

 

[참고하면 좋은 사이트] https://pinkwink.kr/931 https://pinkwink.kr/933 https://pinkwink.kr/934

 

댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/11   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
글 보관함