Data Smoothing #2 (Savitzky Golay) C++

Mathematics Algorithm|2023. 3. 30. 09:46
반응형

데이타 스무징 기법 중에 하나인 Savitzky Golay 필터 입니다. 제가 수학 출신이 아니라서 수학적 이론은 잘 모릅니다. 

그래서 모르는 내용을 어딘가에서 주워 담아 쓸수도 있겠지만 그런 내용은 더 잘 설명해놓은 분들이 있을테니 저는 그냥 제가 사용하는 코드만 올려 놓습니다. 

 

1. Savitzky Golay 를 적용한 결과 그래프 입니다. 

  * 파란색원 원본 데이타

  * 붉은색이 Savitzky Golay 데이타 입니다.

Savitzky Golay
Savitzky Golay

2. 구현을 위한 코드는 아래와 같습니다. 

void Savitzky_Golay_smoothing(double* y_series, double* destY, int point_number)
{
//        int A[] = { -2, 3, 6, 7, 6, 3, -2 };
//        int A[] = { -21,14,39,54,59,54,39,14,-21};
	int A[] = {-36,9,44,69,84,89,84,69,44,9,-36};
//        int A[] = {-1,9,44,69,84,89,84,69,44,9,-1};

	int n = 5;
	int k = 0;

	for(k = 0; k < n; k++)
	{
		destY[k] = y_series[k] ;
	}

	for(k = n; k < point_number-n; k++)
	{
		int i = 0;
		double nominator = 0;
		double denominator = 0;

		for(i = -n; i <= n; i++)
		{
			nominator += (A[n+i]*y_series[k+i]);
			denominator += A[n+i];
		}
		double y = nominator / denominator;

		if(destY != NULL)  destY[k] = y ;
	}

	for(k = point_number-n ; k < point_number ; k++)
	{
		destY[k] = y_series[k] ;
	}
}
반응형

댓글()