평균 필터


 데이터를 모두 모아서 한 번에 연산하는 과정을 배치식 (batch expression)이라고 한다. 데이터의 총합을 데이터 개수로 나눠주는 단순한 계산. 하지만 배치식은 앞서 계산했던 평균값은 전혀 이용하지 못하게 되어 불필요하게 시간 또는 자원(메모리)을 낭비하게 된다. 



평균필터 재귀식 설명

배치식과 달리 재귀식은 앞선 결과 값을 이용한다는 점에서 게산의 효율과 메모리의 효과적인 사용에 매우 좋다. 평균 필터의 재귀식은 아래와 같이 표현된다. (식이란 재귀함수로 코딩했다는 것이 아니다. 재귀함수와 재귀식은 다른 것. 재귀함수로 작성하게 되면 더 비효율적인 메모리와 시간 낭비가 발생한다.)



재귀식의 유도과정



식을 자세히 보면, 새로운 평균값은 이전 평균값에 (k - 1)/k 의 가중치[각주:1]가 곱해졌고 새로운 값은 1/k의 가중치가 곱해져 더해진 값으로 구성되었다. 예를 들어 이전에 값이 [4 6 8 6]이고 새로 얻은 값이 10이라고 하면 앞선 4개의 값의 평균인 6에 가중치 4/5를 곱하고 새로 얻은 값인 10에 가중치 1/5를 곱해 더하면 5개의 평균값이 나온다. (24 + 10) / 5 = 6.8이 평균이다. 5로 나눈 이유는 총 개수가 5개이므로 5로 나눈것. 앞서 구한 평균값에 데이터 개수 4개를 다시 곱해 다시 나눈다는 의미와 같다. 

이렇게 복잡하지만 재귀식을 사용하는 이유는 시간낭비를 줄이고 데이터 저장 공간을 효율적으로 사용하기 위함이다.




실제로 한번 해보았다.



잘된다.





개발 환경 : Codevision (Version : 2.05.0 Evaluation)


-------------------------------------- average_recursion.h ------------------------------------


#ifndef __AVERAGE_RECURSION_H__

#define __AVERAGE_RECURSION_H__


#define FILTERDATA 10



int average_recursion (int x);


#endif //__AVERAGE_RECURSION_H__


--------------------------------------------------------------------------------------------



---------------------------------------- average_recursion.c ------------------------------------

#include "my_header.h"




int average_recursion (int x)

{

    static int average = 0;

    

    average = (((FILTERDATA-1)*average)/FILTERDATA) + (x/FILTERDATA); 

    

    return average;

}


-------------------------------------------------------------------------------------------


  1. 비중을 서로 달리하는 여러 품목에 대한 하나의 평균치를 산출할 때, 단순한 산술평균만으로는 합리적인 수치를 뽑을 수가 없으므로 비중에 따라 각 개별품목에 알맞은 중요도를 결정하고 이를 적용시켜 평균치를 얻게 된다. 중요도를 결정하는 표준은 종합평균(지수)의 성질에 따라서 다르다. [본문으로]
Posted by 나무길 :