Smoothing에 해당하는 글 2

Data Smoothing #1 알고리즘 C++

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

예전 어느 일본업체에서 사용하는 스무징 알고리즘을 구하게 되어서 제가 사용하고 있습니다. 

상당히 스무징이 깨끗하게 잘 됩니다. 그러다 보니 사용하는 데이타의 종류에 따라 스무징 알고리즘을 다르게 사용해야 합니다. 

 

아래 스무징도 아무 데이타에 사용은 못하고 제가 꼭 필요로 하는 데이타의 스무징 종류에 따라 구분해 사용합니다. 

 

smoothing
Smoothing 결과

void Smoothing(double fltData[], short siMaxMeasCount, short siSCount, short siSStep)
{
    double	fltSmooth[1000*2];

	int	iLstep,iRstep;
	int	iStart_p,iEnd_p;
	int	iCnt;
	double	fltSum;

	if(siSStep < 2)	return;

	if(!(siSStep % 2))	siSStep++;
	iLstep = siSStep / 2;
	iRstep = iLstep;

	for (int i = 0; i < siSCount; i++)
	{
		memcpy(fltSmooth,fltData,sizeof(double) * siMaxMeasCount);

		for(int j = 1; j < siMaxMeasCount; j++)
		{
			iStart_p = j - iLstep;
			iEnd_p = j + iRstep;
			if(iStart_p < 0)
			{
				iStart_p = 0;
				iEnd_p = j + j;
			}
			else if(iEnd_p >=  siMaxMeasCount)
			{
				iStart_p = j - (siMaxMeasCount - j - 1);
				iEnd_p = siMaxMeasCount-1;
			}

			if(iEnd_p > siMaxMeasCount) break;
			iCnt = 0;
			fltSum = 0.0f;
			for(int k = iStart_p; k <= iEnd_p;k++)
			{
				fltSum += fltSmooth[k];
				iCnt++;
			}
			if(iCnt <= 1)
			{
				fltData[j] = fltSmooth[j];
			}
			else
			{
				fltData[j] = fltSum / (float)iCnt;
			}
		}
	}
}
반응형

댓글()

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] ;
	}
}
반응형

댓글()