본문 바로가기
프로그래밍/C Sharp

[ C# ] 그래프 필터링 하기 : 이동 평균 필터(Move Average Filter)

by jeong-f 2021. 11. 4.
반응형

실시간 또는 일정 시간 동안 데이터를 받아서 데이터를 처리할 때 노이즈의 영향으로 비정상적인 데이터를 받는 경우가 있습니다.
이때 사용할 필터로 실시간으로 처리 및 후 처리도 가능한 이동 평균 필터를 설명하고자 합니다.

필터를 처리 방식

1~12의 데이터 입력받았고 필터 강도가 5인 경우 앞에서부터 데이터를 누적, 이동하면서 새로운 데이터 값을 생성하여 배열에 입력합니다,

예시)  새로운 값이 6인 경우 배열의 1~4의 값과 새로운 값을 함한 평균을 구합니다,

(3+3+3+3+3+6) / 6 = 3.6

기존의 배열에서 첫 번째 값을 제거하고 마지막에 구한 평균을 입력하고 다음 데이터의 연산도 반복적으로 수행합니다.

이동 평균 처리 함수

 public double[] MovAvg_Filter(double[] sample, int nFilterSize) 
        { 
            List<double> lst = new List<double>(); // 결과로 반환할 데이터 배열 
            double[] arrNumbers = new double[nCount]; // 필터 배열 
            int pos = 0; //필터시작위치 
            double newAvg = 0; // 평균 
            double sum = 0; // 합계 
            int len = arrNumbers.Length; // 필터 크기 
            int count = sample.Length; // 입력받은 데이터 크기 

            for (int i = 0; i < count; i++) // 입력받은 데이터 만큼 반복 
            { 
                sum = sum - arrNumbers[pos] + sample[i]; // 필터 내의 데이터와 현재 데이터의 합계를 구한다.
                arrNumbers[pos] = sample[i]; // 필터에 추가 
                newAvg = sum / len; // 평균 구하기 pos++;

                // 필터 증가 
                if (pos >= len) 
                {
                    pos = 0; // 필터 처음부터 
                } 

                // 필터가 커지면서 데이터가 뒤로 밀리는 것을 방지하기 위해 
                // 필터링 이전 값은 최초 필터링 된 평균값으로 대체합니다.

                if (i == nFilterSize) 
                { 
                    for (int j = 0; j < lst.Count;j++)
                    { 
                        lst[j] = newAvg; 
                    }
                }

                // 결과에 추가
                lst.Add(newAvg);
            }
            
            return lst.ToArray(); // 결과 반환 
        }

사용 데이터

Y축의 값으로만 그래프를 그렸으며, X축은 카운터(순번)로 대체하였습니다.

샘플텍스트.txt
0.00MB

필터 처리 결과

아래 그래프에서의 색상은 각각 회색 (원본), 녹색(2) , 빨강(3)파랑(5)노랑(10)으로 하였습니다.

결과에서도 볼 수 있듯이 강도가 커짐에 따라 파형이 둔해지는 것을 알 수 있었습니다.

필터의 강도가 강해짐에 따라 위치 값이 뒤로 밀려나는 현상이 있을 수 있고 너무 강한 필터 강도에서는 형상이 수평에 가까운 데이터로 변화될 수 있으므로 필터 사용 시 주의를 기울여야 할 것입니다.

참고 사이트

 

Moving average example in C

Moving average example in C. GitHub Gist: instantly share code, notes, and snippets.

gist.github.com

반응형

댓글