평균 필터 (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)