본문 바로가기
Control system engineering

[제어시스템공학-3] Low Pass Filter(저주파 통과필터)

by 노마드공학자 2021. 1. 25.

[Control Eng-1] Average Filter(평균필터) https://limitsinx.tistory.com/69

[Control Eng-2] Moving Average Filter(이동평균필터) https://limitsinx.tistory.com/70

 

※이 전글에서 정리한 코드/문법은 재설명하지 않으므로, 참고부탁드립니다

※해당 글은 PC에서 보기에 최적화 되어있습니다.


오늘 정리해볼 주제는 LPF(Low Pass Filter)입니다.

 

전자공학을 전공하시면, 신호처리(Signal Processing) 혹은 영상처리(Image Procecssing)교과목에서 주로 다루는 필터인데요,

 

Low Pass Filter, High Pass filter, Medium Filter같은것들은 일반적으로는, 특정 주파수대역의 소리를 Noise로 판단하여 줄여주기위해 사용됩니다.

 

LPF, 출처 : http://www.learningaboutelectronics.com/Articles/Low-pass-filter-calculator.php

Filter들은, 디지털회로라는 교과목에서 H/W적으로 어떻게 설계하는지 배우는데요

 

이부분에 대해서 다루는 글은 아니지만, 짧게 말씀드리면 LPF는 Capacitor(C), HPF는 Inductor(L)로 설계합니다.

 

RLC(Resistor, L,C)의 조합으로 무수히 많은 필터들을 만들어 낼수도있죠

 


각설하고, 오늘은 "제어공학"의 관점에서 Low Pass Filter(이하 LPF)를 알아보도록 하겠습니다.

 

이전글인 Moving Average는 Average Filter대비 탁월한 성능을 보여주는것을 확인했는데요,

 

 

Moving Average

 

 

안타깝게도 Moving Average에도 치명적인 단점이 존재합니다.

 

과거 N개의 데이터와 현재 상태에서 추가되는 새로운값이 "동일한 중요도"를 가지고 계산된다는 점이죠

 

즉, 제가 항상 예로드는 [1,2,3,4,5,6,7]로 말씀드려보겠습니다.

 

[1,2,3,4,5,6]까지의 데이터가 들어왔고 현재 6이 들어와야할 차례라고 생각해보죠

 

Moving Average Filter는 1~5의 평균 + (6-1)/5를 하는 형태로, 새로운값을 갱신할 것입니다.

 

[1,2,3,4,5] -> [2,3,4,5,6] 으로 바뀌면서 나온 결과 5개값의 평균을 구한것이 Moving Average라는 것이죠

 

아주 합리적인것 처럼 보이지만, 실생활에서는 적용되지 않는경우가 많습니다.

 

[2,3,4,5,6]을 자세히보시면, 2는 현재시간 기준 5초전에 들어온 값입니다.

 

3은 4초전에 들어온 값이구요

 

즉, 과거의 오래된 데이터들까지 모두 동일한 비율로 1/N을 해버린다는것을 확인할 수 있습니다.

 

더욱 합리적인 값을 얻고자 한다면, 최근 들어온 값일수록 비율을 크게해서 더해준다면 어떨까요??

 

예를들면, [2,3,4,5,6]의 평균인 4를 결과값으로 보는게 아니라, 6이라는 가장 최근값은 1.5배를 해서 평균을 내보면 어떨까요?? 가장 최신값에 좀더 무게(Weighting)을 주는거죠!

 

그러면, 과거의값들보다 현재값에 조금더 치중한 데이터를 얻을 수 있겠죠

 

(2+3+4+5+6*1.5)/5.5 = 4.1818...

 

그래프로 한번 비교해보겠습니다.

 

 

Moving Average만 적용한 모습

 

Moving Average로 10개 포인트를 따라가는 그림을 그려보았습니다.

 

뭔가 살짝 아쉬운 모습입니다.

 

그러면, 현재 들어오는 값만 1.5배해서, 평균을 구한 값은 어떤지 확인해보겠습니다.

 

Low pass filter

 

적은 샘플수라 오차는 존재하지만, 확연히 눈으로만 봐도 Moving Average에 비해 나아진것을 확인하실 수 있습니다.

 

 

즉, Moving Average는 취하되! 과거의 값들보다 현재에 가까운 값들에 Weighting을 좀 더 두는것이 LPF입니다.

 

 

본질적인 의미는 아니지만, 결과론적으로 얻어지는것은 상기 문장입니다. 수식으로 표현해보자면,

 

 

X_k = (1-a) * (k-1까지 N개의 평균) + (a) * 현재들어온 값

 

 

(1-a)와 a만큼 포션을 나누어 중요도를 조절해주는 것입니다.

 

코드를 정리해보겠습니다.

 

[코드분석-1]

MovAvgFilter.m 외에는 이전 Moving Average Filter에서 작성했던 코드와 모두 동일합니다.

 

유일한 차이점은, avg = preAvg + 1.5*(x-xbuf(1))/n 으로, 1.5배만 해주었다는것 뿐입니다. (현재값에 포션을 좀더둠)

 

 

※ 참고

"칼만필터는 어렵지 않아" (2019,김성필)

댓글