반응형
실시간 또는 일정 시간 동안 데이터를 받아서 데이터를 처리할 때 노이즈의 영향으로 비정상적인 데이터를 받는 경우가 있습니다.
이때 사용할 필터로 실시간으로 처리 및 후 처리도 가능한 이동 평균 필터를 설명하고자 합니다.
필터를 처리 방식
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축은 카운터(순번)로 대체하였습니다.
필터 처리 결과
아래 그래프에서의 색상은 각각 회색 (원본), 녹색(2) , 빨강(3), 파랑(5), 노랑(10)으로 하였습니다.
결과에서도 볼 수 있듯이 강도가 커짐에 따라 파형이 둔해지는 것을 알 수 있었습니다.
필터의 강도가 강해짐에 따라 위치 값이 뒤로 밀려나는 현상이 있을 수 있고 너무 강한 필터 강도에서는 형상이 수평에 가까운 데이터로 변화될 수 있으므로 필터 사용 시 주의를 기울여야 할 것입니다.
참고 사이트
반응형
'프로그래밍 > C Sharp' 카테고리의 다른 글
[ C# ] 엑셀파일 읽기 (0) | 2021.11.09 |
---|---|
[ C# ] 허니웰 스케너 시리얼 통신으로 On/Off 하기 (1) | 2021.11.08 |
[ C# ] 오므론 RFID V608S TCP 통신 하기 (0) | 2021.11.08 |
[ C# ] 배열 생성시 초기값 넣기 (0) | 2021.11.08 |
[ C# ] 스택(Stack) 과 큐(Queue) (0) | 2021.11.02 |
댓글