평균 필터 (Average Filter)

✔ 실시간으로 데이터가 계속 증가하는 경우 평균을 구하기 위해서 매번 모든 데이터를 더하고, 전체 개수만큼 나누어 주는것은 비효율적

✔ 재귀식(resursive)을 통해 이전 평균값을 활용해 빠르고 효율적으로 현재 평균값을 구하자


재귀식(recursive expression)

  • 평균을 구하는 것처럼 데이터를 모두 모아서 한꺼번에 계산하는 식을 배치식(batch expression) 이라함
  • 이는 데이터가 추가되면 모든 데이터를 다시 더한 후 총 개수 만큼 나눠야 하므로 비효율적
  • 재귀식은 직전 결과를 사용하므로 계산 효율과 메모리 저장공간 측면에서 유리함
  • 재귀함수(코딩)와 재귀식은 다른 것

평균 필터 재귀식의 유도

  • 평균 배치식
  • 양변에 을 곱하면
  • 을 이용하기위해 만 분리하여 두개의 항으로 나눔
  • 양변에 를 곱하면

따라서, 현재 평균값()을 구하기 위해서 이전 평균값()과 데이터의 개수(), 새로 추가된 데이터()만 있으면 됨

이때, 이전 평균값에는 (이전데이터수/데이터수)가 곱해지고 현재 데이터에는 (1/데이터수)가 곱해지는데 이는 가중치(weight)의 개념과 같다


평균 필터 코드

int num_of_sample;
double prev_average;
 
double AvgFilter(double x){
 
    double average, alpha;
 
    // 이전 샘플 수 +1 (+1 the number of sample)
    num_of_sample += 1;
 
    // 평균 필터의 alpha 값 (alpha of average filter)
    alpha = (num_of_sample - 1) / (num_of_sample + 0.0);
 
    // 평균 필터의 재귀식 (recursive expression of average filter)
    average = alpha * prev_average + (1 - alpha) * x;
 
    // 평균 필터의 이전 상태값 업데이트 (update previous state value of average filter)
    prev_average = average;
 
    return average;
}

정리

  • 재귀식인 평균 필터를 사용하면 직전 평균값과 데이터 개수만 알아도 쉽게 평균을 구할 수 있다
  • 데이터를 실시간으로 처리해야 한다면 재귀식 형태의 필터가 필수
  • 평균을 취하여 노이즈를 제거할 때에도 사용

참고


의문점

Q1. 어차피 누적되는 덧셈인데 이전 덧셈값을 계속 활용하면 되지 않을까 Loop( (이전값 + 현재값) / 데이터개수 이전값 = 이전값 + 현재값 … )

A1. 실시간으로 데이터를 누적하여 더한 수에 총 개수를 나누면 않겠느냐 생각했지만, 큰 단위의 데이터가 대량으로 누적하여 더해질 경우 기하급수적으로 늘어나기 때문에 적용하기 어려울듯


Next: 2. 이동 평균 필터(Moving Average Filter)


평균필터상태추정