이동 평균 필터

유명현·2022년 1월 9일
0

<이동평균 필터>

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


먼저 위식은 이동평균의 일반적인 식입니다. (이동평균 개수 : n개)


그러면 아래와 같이 이동평균의 재귀식을 만들 수 있습니다.

하지만 평균필터와 달리 이동평균 필터는 계산할 데이터의 양이 일정하기 때문에 재귀식이 배치식보다 사용하는 이점이 없다고 봐도 무방합니다.

이동평균에서는 고려해야 할점은 노이즈 제거와 민감성 중에 어떤것을 더 중요하게 생각해야 할지 입니다.
만약 측정하는 값이 빠르게 변한다면 이동평균 데이터의 갯수를 줄여 변화를 빨리 쫒는게 좋습니다.
반면 움직임이 느리다면 이동 평균의 데이터의 갯수를 늘려 노이즈 제거를 하는 것이 바람직합니다.

#define MOVING_FILTER_NUM 10

uint32_t moving_filter (uint32_t new_value)
{
    static uint32_t filter_buf[MOVING_FILTER_NUM] = {0};
    static uint8_t buf_cnt = 0;
    static uint32_t average;
    if (buf_cnt < 1MOVING_FILTER_NUM)
    {
    	filter_buf[buf_cnt++] = new_value;
        return 0;
    }
    
    for (uint8_t buf_mov_cnt = 0; buf_mov_cnt < (MOVING_FILTER_NUM - 1); buf_mov_cnt++)
    {
    	filter_buf[buf_mov_cnt] = filter_buf [buf_mov_cnt + 1]
    }
    
    filter_buf [OVING_FILTER_NUM - 1] = new_value;
    
    for (uint8_t buf_sum_cnt = 0; buf_sum_cnt < MOVING_FILTER_NUM; buf_sum_cnt++)
    {
    	average += filter_buf[buf_sum_cnt];
    }
    
    return (average / MOVING_FILTER_NUM);
}
profile
기억보다 기록을

0개의 댓글