앞서 본 1. 평균 필터
에서는 평균을 취하면 측정 데이터에서 잡음을 제거할 수 있다는 것을 확인했다.
➡️ 하지만 측정하려는 물리량이 시간에 따라 변하는 경우, 평균을 취하는 건 적절하지 않다!
➡️ 잡음을 없애는 동시에 시스템의 동적인 변화를 제대로 반영하는 방법? 이동평균!!
이동평균에서 사용하는 데이터 개수는 n개로 항상 일정하다!!
이동평균은 평균 필터와 달리 재귀식을 사용하는 이점이 별로 없다.
재귀식으로 이동평균을 계산하려면, 직전 이동평균과 가장 오래된 데이터(x_k-n)이 필요하다.
결국 재귀식이지만 메모리 저장공간이 절양되는 이점도 없는 셈
위와 같은 이유로 이 절에서는 배치식(MovAvgFilter2
)과 재귀식(MovAvgFilter
) 두 가지를 모두 구현해보자!
MovAvgFilter(x), MovAvgFilter2(x)
이동평균을 계산하려면 측정 데이터가 적어도 평균을 내는 데이터 개수(n)만큼 있어야 하는데, 프로그램이 처음 시작될 때는 측정 데이터가 없다.
➡️ 프로그램 구동 초기엔 이동평균 함수의 계산값을 버리고, 측정 데이터가 충분히 쌓인 다음부터 그 계산값을 사용하는 게 안전
측정 데이터가 없는 프로그램 실행 초기에는 내부 버퍼(xbuf)의 초깃값이 이동평균 계산에 사용된다.
헬기에 초음파 거리계를 장착하고 지면까지의 거리를 측정하는 비행 시험을 실시했다.
측정값은 0.02초 간격으로 저장했다. 그런데 측정 데이터에 잡음이 심했다.
이동 평균 필터로 이 잡음을 제거해보자.
위는 측정 거리와 이동평균 필터 출력값을 비교한 그래프이다.
이동평균 필터로 처리한 결과를 보면 측정 데이터의 잡음이 효과적으로 제거되고, 고도 변화 추이도 잘 따라간다.
그런데 이동평균으로 필터링된 고도에 약간씩 시간 지연이 보인다. 실제 고도의 변화가 바로 반영되지 않고 조금씩 늦게 따라가는 것!
이처럼 이동평균 필터를 설계할 때에는 평균 계산에 동원하는 데이터 개수(n)
를 잘 선정해야 한다.
이 값이 잡음 제거와 변화 민감성이라는 상충된 요구를 절충하는 역할을 한다.
참고)
이동평균 그림 출처