Part 1) 재귀 필터 - Ch2. 이동평균 필터

Speedwell🍀·2022년 10월 31일
0
post-thumbnail

2. 이동평균 필터

2-1) 이동평균의 재귀식

앞서 본 1. 평균 필터에서는 평균을 취하면 측정 데이터에서 잡음을 제거할 수 있다는 것을 확인했다.
➡️ 하지만 측정하려는 물리량이 시간에 따라 변하는 경우, 평균을 취하는 건 적절하지 않다!

  • 평균은 데이터의 동적인 변화를 모두 없애기 때문
  • 하지만 우리가 다루는 물리량은 대부분 시간에 따라 변한다!

➡️ 잡음을 없애는 동시에 시스템의 동적인 변화를 제대로 반영하는 방법? 이동평균!!



이동평균

  • 모든 측정 데이터가 아니라, 지정된 개수의 최근 측정값만 가지고 계산한 평균
  • 새로운 데이터가 들어오면 가장 오래된 데이터는 버리는 방식으로 데이터 개수를 일정하게 유지하면서 평균을 구한다.

이동평균 배치식



이동평균 필터 (moving average filter)

이동평균에서 사용하는 데이터 개수는 n개로 항상 일정하다!!



2-2) 이동평균 필터 함수

이동평균은 평균 필터와 달리 재귀식을 사용하는 이점이 별로 없다.

  • 재귀식으로 이동평균을 계산하려면, 직전 이동평균과 가장 오래된 데이터(x_k-n)이 필요하다.

    • 이렇게 새로 데이터가 추가되면 가장 오래된 데이터도 순차적으로 하나씩 이동
      ➡️ 따라서 이동평균 필터를 구현하려면, 최신 데이터(x_k)를 포함해 n개의 최근 데이터(x_k-1, x_k-2, ..., x_k-n)가 모두 보관되어 있어야 하며, 새로운 데이터가 입력될 때마다 갱신 필요
  • 결국 재귀식이지만 메모리 저장공간이 절양되는 이점도 없는 셈


위와 같은 이유로 이 절에서는 배치식(MovAvgFilter2)과 재귀식(MovAvgFilter) 두 가지를 모두 구현해보자!

  • 이동평균의 정의대로 구현한 함수가 더 직관적이고 이해하기 쉽다.
  • 만약 평균 계산에 필요한 데이터의 개수(n)가 매우 많으면 재귀식 함수를 사용하는 게 바람직하지만 흔치 않은 경우다.
    ➡️ 대개는 이해하기 쉬운 코드를 사용하는 편이 더 바람직

MovAvgFilter(x), MovAvgFilter2(x)

  • 이동평균을 계산하려면 측정 데이터가 적어도 평균을 내는 데이터 개수(n)만큼 있어야 하는데, 프로그램이 처음 시작될 때는 측정 데이터가 없다.
    ➡️ 프로그램 구동 초기엔 이동평균 함수의 계산값을 버리고, 측정 데이터가 충분히 쌓인 다음부터 그 계산값을 사용하는 게 안전

  • 측정 데이터가 없는 프로그램 실행 초기에는 내부 버퍼(xbuf)의 초깃값이 이동평균 계산에 사용된다.

    • 보통 내부 버퍼의 초깃값을 0으로 지정하지만, 여기서는 제일 처음 입력된 측정 데이터로 내부 버퍼를 초기화
      ➡️ 내부 버퍼를 모두 0으로 초기화하는 것보다 초기 오차를 줄일 수 있기 때문



2-3) 예제: 초음파 거리계

헬기에 초음파 거리계를 장착하고 지면까지의 거리를 측정하는 비행 시험을 실시했다.
측정값은 0.02초 간격으로 저장했다. 그런데 측정 데이터에 잡음이 심했다.
이동 평균 필터로 이 잡음을 제거해보자.

  • 내장 함수인 load 함수로 SonarAlt 파일을 불어들이면 sonarAlt 변수가 생기는데, 이 변수에 측정 데이터가 들어 있다. (9행)
    • sonarAlt 변수는 persistent로 선언되어 있기 때문에 한 번 값을 저장하면 함수 호출이 끝난 다음에도 계속 값이 유지된다.
      ➡️ 이렇게 하면 SonarAlt.mat 파일을 한 번만 불러 오면 되기 때문에 불러 오면 되기 때문에 프로그램 실행 속도가 향상된다.

  • GetSonar 함수는 초음파 거리계의 측정값을 읽어 온다. (9행)
    • 여기서는 미리 저장해 놓은 측정 데이터를 하나씩 반환하도록 했다.
    • 함수가 반환하는 측정 데이터는 SonarAlt.mat 파일에 저장되어 있다.

위는 측정 거리와 이동평균 필터 출력값을 비교한 그래프이다.

이동평균 필터로 처리한 결과를 보면 측정 데이터의 잡음이 효과적으로 제거되고, 고도 변화 추이도 잘 따라간다.


그런데 이동평균으로 필터링된 고도에 약간씩 시간 지연이 보인다. 실제 고도의 변화가 바로 반영되지 않고 조금씩 늦게 따라가는 것!

  • 만약 시간 지연이 너무 크다면 데이터 개수(n)를 줄여야 한다. 대신 측정 잡음을 제거하는 효과는 떨어지게 된다.
  • 반대로 데이터 개수를 늘리면 잡음 제거 성능은 개선되지만 시간 지연은 커진다. 측정 데이터의 변화가 제대로 반영되지 않는 것

이처럼 이동평균 필터를 설계할 때에는 평균 계산에 동원하는 데이터 개수(n)를 잘 선정해야 한다.
이 값이 잡음 제거와 변화 민감성이라는 상충된 요구를 절충하는 역할을 한다.



참고)
이동평균 그림 출처

0개의 댓글