이동 평균 필터는 단순하게 동일한 Mask 영역에 데이터를 평균내어 노이즈 성분을 줄이는 간단한 필터입니다.
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 길이: 10
* Mask 길이: 30
* Mask 길이: 100
Mask 길이가 길면 길 수록 평균내는 값이 많아져 노이즈가 줄어드는 효과를 주지만,
그만큼 연산량이 증가하고, Mask길이만큼 데이터를 가지고 있어야하기 때문에 메모리를 많이 차지한다라는 단점이 있습니다.
반응형