이동 평균 필터는 단순하게 동일한 Mask 영역에 데이터를 평균내어 노이즈 성분을 줄이는 간단한 필터입니다.

 

moving averge filter 수식

 

Mask의 크기가 6이라고 하면 연속하는 6개의 데이터를 평균내는 것을 말합니다.

 

이동 평균 필터

 

위 그림처럼 Raw Array에 데이터를 쌓고 Mask를 이동시켜 Raw Array의 값을 평균내서 새로운 배열에 값을 넣습니다.

 

아래 이동 평균 필터를 예시로 작성해 보았습니다.

 

#define MASK_LENGTH 	(3)

uint16_t raw_array[MASK_LENGTH] = {0,};
uint16_t raw_array_index = 0;

/* Mask 크기만큼 데이터를 평균낸다. */
float movingAverageFilter()
{
    int i = 0;
    uint16_t sum = 0;

    for (i = 0; i < MASK_LENGTH; i++) {
    	sum += raw_array[i];
    }
    return ((float)sum / MASK_LENGTH);
}

/* 새로운 데이터를 array에 넣는다. */
void insertIntoRawArray(uint16_t value)
{
    raw_array[raw_array_index] = value;

    raw_array_index++;

    if (raw_array_index >= MASK_LENGTH) {
    	raw_array_index = 0;
    }
}

int main()
{
	insertIntoRawArray(4034);
	insertIntoRawArray(4036);
	insertIntoRawArray(4031);
	insertIntoRawArray(4035);
	insertIntoRawArray(4034);
	insertIntoRawArray(4032);
	printf("%f\r\n", movingAverageFilter());

	insertIntoRawArray(4033);
	printf("%f\r\n", movingAverageFilter());

	insertIntoRawArray(4032);
	printf("%f\r\n", movingAverageFilter());

	insertIntoRawArray(4036);
	printf("%f\r\n", movingAverageFilter());

	insertIntoRawArray(4034);
	printf("%f\r\n", movingAverageFilter());
}

결과

 

Mask길이에 따른 필터링 결과 비교

 

* Mask 길이: 3

Mask길이 3일 때 Raw데이터와 필터 결과 비교

 

* Mask 길이: 10

Mask길이 10일 때 Raw데이터와 필터 결과 비교

 

* Mask 길이: 30

Mask길이 30일 때 Raw데이터와 필터 결과 비교

 

* Mask 길이: 100

Mask길이 100일 때 Raw데이터와 필터 결과 비교

 

 

Mask 길이가 길면 길 수록 평균내는 값이 많아져 노이즈가 줄어드는 효과를 주지만,

그만큼 연산량이 증가하고, Mask길이만큼 데이터를 가지고 있어야하기 때문에 메모리를 많이 차지한다라는 단점이 있습니다.

반응형

+ Recent posts