본문 바로가기
Research/Machine Learning

딥러닝과 FIR, IIR, LPF, HPF, BPF

by IMCOMKING 2014. 7. 1.

Impulse response

Impulse response(IR), 혹은 impulse response function(IRF)라고 불리운다. 좀 더 직관적인 의미는 후자가 더 와닿는다. 이는 쉽게 말하면 어떠한 신호를 처리하는 system이 있을 때, input signal을 받아서 어떻게 output signal로 변형시키는지에 대한 함수(시간에 대한 함수)를 가리키는 말이다. 

만약 우리가 어떤 공연장의 IR 데이터를 갖고 있으면, 어떠한 소리든지 그 공연장에서 나오는 소리처럼 변형시킬 수 있게 된다.


# 용어
- Impulse: input signal을 의미함
- response: output signal을 의미함

Impulse(unit impulse)


Impulse(=unit impulse)는 원래 충격이라는 의미인데, 여기서는 길이가 x=0 지점에서, 1인 dirac delta function을 의미한다. 근데 이 unit impulse에 대해 FFT를 해보면 신기하게 모든 주파수를 균일하게 갖고 있음이 밝혀졌다. 그래서 이 값이 어떤 system에 input으로 들어갔을 때, 그에 해당하는 output은 시스템이 어떤 주파수 영역을 어떻게 변화시키는지에 대한 모든 정보가 담겨있음을 의미한다. 그래서 이것을 impulse에 대한 response, 즉 IR이라고 부르며 임의의 system이 동작하는 시간에 대한 함수를 의미하게 된 것이다.



LTI system(Linear Time-Invariant system)

LTI 시스템이란, llinear 한 속성과 time-invariant한 속성을 동시에 만족하는 시스템을 의미한다. 즉 선형적인 연산이 가능하고, 시간에 대해 일관성을 가져야한다.


- Linear: f(ax1 + bx2) = af(x1) + bf(x2)

- Time-invariant: sequential 신호나 continuous-time 신호에 대해서 x(m) 입력이 주어졌을 때 출력이 y(m)이면, x(m-n)이 주어졌을 때 출력이 y(m-n)이 되는 것.

https://brilliant.org/wiki/linear-time-invariant-systems/


# Convolution
LTI 시스템에서 impulse response를 계산하기 위한 연산. Convolution에서 filter는 t의 부호가 음수로 정의되어 있는데, 그 이유는 두 함수 f와 g에 대해 교환법칙을 적용할 때 t의 부호를 똑같이 유지할 수 있기 때문이다. 만약 t의 부호가 양수라면, 교환법칙할 때마다 -t로 바꿔주어야한다.

https://math.stackexchange.com/questions/714507/definition-of-convolution


# Filter
Filter 는 Analog filter(=소자로 구현된 필터) 와 Digital filter(=numerical filter, 코드로 구현된 필터) 두 종류가 있다.(아날로그 필터는 회로로 설계되어, 필터링을 하는 것이고, 디지털 필터는 알고리즘적 계산을 통해 필터링 하는 것이다. 그러므로 프로그래밍의 관점에서 필요한 것은 디지털 필터이다.)

https://www.analogictips.com/using-analog-filters-vs-digital-filters/


# Analog filter(Continuous time, real-valued)
물리적인 속성을 가진 아날로그 신호에 대해 순수히 물리적, 전기적 특성을 이용해서 구현된 filter. 전기신호를 그대로 다루므로 inductors, capacitors and resistors 와 같은 component(소자)를 이용한다. 이러한 소자들은 물리적/전기적 법칙에 의해 구현된 것이기 때문에 각 컴포넌트의 성능, 내구도 등에 의해 출력 결과물에 오차가 생길 수 있다. 즉, 아주 아주 정교한 기능구현이 힘들다. 이러한 문제가 아날로그 필터보다 디지털 필터를 선호하는 이유이다. (컨트롤 불가능한 오차가 계속해서 다음으로 전파되기 때문) 대신 analog의 장점은 구현이 단순하고 쉽다는 것이다.

Inductor는 고주파가 잘 통과하지 못하는 물리적 특성을 가지고 있고, capacitor는 반대로 고주파일수록 잘 통과하는 물리적 특성이 있다. 이 두가지를 조합하면 다양한 filter를 구현할 수 있다. 또한 이를 반복해서 사용하여 차수를 올릴 수도 있다.

http://www.rfdh.com/bas_rf/begin/filter.php3


# Digital filter(Discrete time, quantized valued)
Analog signal에 sampling을 하여 digital화 된 신호에 대해 알고리즘 형태로 구현하는 filter. 알고리즘 혹 프로그래밍으로써 구현 되므로, 결과물을 신뢰할 수 있다. Analog signal을 digital로 변환하는 converter가 반드시 필요하다.(analog-to-digital signal converter (ADC)라고 한다.)

Signal을 너무 낮은 sampling rate로 변환할 경우, aliasing이란 효과가 일어나서 제대로 된 정보를 capture 할 수 없게 된다. 따라서 oversampling을 하는 것이 보통이다. Sampling rate만 충분히 크다면, 사람은 절대로 digital과 analog signal을 구분할 수 없다.(ex 과거 형광등의 깜빡임은 1초에 120번이다. https://marriott.tistory.com/54)

Image result for aliased signal
http://www.ni.com/ko-kr/innovations/white-papers/09/using-a-digitizer-for-time-domain-measurements.html



FIR(Finite impulse response)

어떤 system의 impulse response function이 유한한 길이로 제한되는 filter를 의미한다.(즉, 어떤 시점의 T를 넘어가면 IR이 0이 된다.)


이를 딥러닝에 비유하자면, activation function이 직선인, filter 1개 짜리 convolutional layer라고 볼 수 있다.

High frequency의 noisy signal 값들을 안정적으로 처리하기 위한 방법으로 일종의 weighted moving average라고 이해하면 된다. Fixed length window(=필터 차수, N)를 정의하고, 각 step마다 서로 다른 weight(필터 계수)를 정의하여 weighted sum을 한다. 이 때 weight는 자유롭게 정의할 수 있는 것 같고, LMS으로 학습할 수도 있다. 만약 최근 값에 좀 더 민감하게 반응하길 원한다면 exponential dacaying하는 wegiht를 사용할 수도 있을 것이다. (아마도 이 weight는 합쳐서 1이 되는 것이 자연스러운 것 같다.) 

FIR을 통과한 signal은 high frequency 영역이 smoothing(=filtering)되기 때문에, Low pass filter라고도 부른다.(low frequency만 pass하는 filter)

그런데 FIR에서 재미있는 점은 몇개의 값(신호)를 평균 낼지를 사람이 정한다는 것이다. 예를 들어 sampling rate 16000Hz짜리 신호에서 window size = 4로(=필터 차수, order) 평균내겠다라고 하면, 1/4000초 짜리의 fixed length sliding window로 moving average를 구하겠다는 의미이다. 그렇게 되면 4000Hz보다 높은 주파수 성분들이 smoothing(=filtering)이 된다. (그리고 이 4000Hz를 cut-off frequency라고 부른다.)왜냐하면 4000Hz보다 낮은 주파수 성분들은 평균을 내더라도 단순히 shifting 정도만 일어나지, 값을 손실하진 않는다. 그러나 16000Hz짜리 sin형태로 된 주파수 성분이 있다면, 이녀석은 정확히 cancel되어 사라질 것이다. 



IIR(Infinite impulse response)

사전적으로 어떤 system의 impluse response function이 무한한 길이를 가지는 filter를 의미한다. (즉, 아무리 많은 T가 흘러도, IR이 0이되지 않는다.)

IIR은 FIR filter output에다가, 이전 step에서 계산했던 previous y[t0~t-1]들을 weighted sum해서 새로운 y_t를 계산하는 것이다. 즉 2개의 weight가 존재하는데, 하나는 input signal X에 대해 적용하고, 다른 하나는 과거에 계산했던 Y들에 대해 적용하여, 이것들의 weigthed sum을 해서 최종적으로 새로운 y를 구하는 방식이다. 계산상 무조건 1-step씩 밖에 계산 할수가 없다.


이를 딥러닝에 비유하자면, activation function이 직선인, filter 1개짜리 convolutional layer위에다가 N'th-order recurrent layer를 쌓은 것이다. (만약 order=1이라면, 그냥 일반적인 RNN과 동치이다. 여기서 N'th-order는 과거의 hidden state를 N개만큼 고려해서 새로운 hidden을 계산하는 N차 markov assumption을 의미한다.)

FIR에서 보다 낮은 cut-off frequency를 원하는 경우, 즉 보다 더 많은 high frequency를 filter out시키고 싶을 수록, 계산에 필요한 window 사이즈(=필터 차수, order, N)가 정비례하게 증가해서 계산량 상당히 증가하는 문제를 해결하기 위해 고안된 방법이 IIR이다. 방법은 매우 간단한데, 개념적으로 FIR을 재귀적으로 호출하는 것이다. 즉 우선 FIR을 한번 돌리면 1차 moving average가 된 signal(=y)이 나올텐데, 이 y들을 계속해서 저장해둔다. 그리고 이 저장된 y(방금 moving average로 filtering output)와 input x를 concatenate한다. 그러면 IIR filter의 order(N)이 10이라면, concatenate하고 난 항은 총 20개가 되는 것이다. 그러면 이 20개에 대해서 다시 weighted moving average를 취하게 되면 바로 IIR이 된다. 이 방법은 무한히 재귀적인데, time step이 반복될수록 내가 더 많이 빡세게 filtering한 y를 한 번 더 filtering해서 새로운 y'이 생성되기 때문이다. 

아래 그림에서 보다시피 FIR의 경우 order를 10, 15, 25까지 늘려감에 따라 점점 cut-off frequency가 낮아지는 걸 볼 수 있는데, IIF filter는 한방에 매우 smooth한 그래프를 생성하게 된다.

[출처: https://dsp.stackexchange.com/questions/35826/is-there-a-way-to-derive-an-fir-filter-using-an-iir-filter]

참고: https://yeominc.tistory.com/19



# Sinc function
다른 이름으로는 sampling function이라고도 한다. bandpass filter가 magnitude frequency domain에서는 사각형인 rect 함수로 표현되지만, 이를 time domain(IFT를 사용)으로 변환할 경우, sinc으로 표현된다.

[출처: https://www.researchgate.net/figure/Fourier-transform-of-a-rectangle-function-a-and-a-sinc-function-b_fig3_321716019]

왜냐하면, 0~F까지의 frequency를 가진 cos를 적분하면 sinc function이 되기 때문에...??




# 공부 사이트
http://www.rfdh.com/bas_rf/beginer.htm





임의의 Low-pass filter만 있으면 high-pass filter/band-pass filter/notch filter는 쉽게 정의할 수 있다.

Low-pass filter를 아래와 같이 정의해보자

y(n) = y(n - 1) + (x(n) - y(n - 1)) / alpha

High-pass filter는 단순히 원래의 신호 x에서 lpf y를 빼주면 된다.

z(n) = x(n) - y(n)
https://dsp.stackexchange.com/questions/20171/how-to-produce-a-high-pass-filter-from-a-low-pass-one



Band-pass filter도 마찬가지로 lpf를 두번 빼면 구할 수 있다.

먼저 큰 cut-off를 가진 LPF를 통과시킨 시그널에다가 작은 cut-off의 LPF를 통과시킨을 빼버림으로써, 가운데 영역만 남기는 방식으로 구현한다.

쉽게 얘기해보자면 전체 시그널이 1~100에서 1~70만 남긴 시그널을 구하고, 그 다음 1~30만 남긴 시그널을 구한다. 그리고 [1~70] - [1~30]을 수행해서 30~70만 남기는 원리이다.





IIR Filter

앞서 살펴보았듯이 LPF하나만 잘 만들 수 있으면, 원하는 모든 방식의 filter를 만들어낼 수 있다. 근데 문제는 좋은 LPF를 만드는 것이 어렵다는 것이다.

이상적인 LPF는 sinc function을 푸리에해서 만든 것이 될 것이다. 그러나 이는 impluse response가 무한하기 때문에 실제로는 존재하지 않는다. 그래서 transition의 기울기가 수직에 가까워 쓸만한 필터를 적당히 만들어내야한다.


* 출처: https://angeloyeo.github.io/2020/09/25/Butterworth.html


Butterworth Filter

공학적으로 가장 많이 쓰이는 대표적인 IIR 필터는 버터워스 필터와 체비세프 필터 두가지이다.
버터워스 필터에서 order는 수식상에서 지수 승을 의미한다.
order(차수)가 높아질수록, 연산에 필요한 항의 개수가 증가하여 속도가 느려질 수 있다.







디지털 필터에서 LPF, BPF, HPF 들의 원리는 결국 유사하다. FFT한 다음 특정 임계영역을 기준으로 데이터를 나누고 다시 역 FFT를 처리하는 것


----------

선형 위상 필터(Linear Phase Filter) 에서

FIR filter는 다음의 4가지 케이스에대해 나뉠 수 있다


M이 홀수/짝수

Even Symmetry (선대칭) / Odd Symmetry (점대칭)


http://blog.naver.com/elephant21/20029931070




LPF, BPF, HPF 개념 : http://www.rfdh.com/bas_rf/begin/filter.php3


안드로이드 필터 소스코드 : http://www.ledin.com/android-fir-filter-designer/

댓글