# 2.1.22.4.5 ocmath_smooth

## Description

smoothing. have 3 methods: median filter, Savitzky-Golay smoothing and adjacent averaging smoothing.

## Syntax

int ocmath_smooth( int nSize, const double * pY, double * pSmooth, int nLeftpts, int nMethod = SMOOTH_SG, int nBoundary = EDGEPAD_NONE, int nRightpts = -1, int nPolydeg = 2, int nDervOrder = 0, double dPercent = 50, bool bWeight = false, bool bAveraging = false )

## Parameters

nSize
[input] vector size of both pY and pSmooth
pY
[input] pointer to Y vector data.
pSmooth
[output] pointer to smoothed data, or derivatives, depending on nDervOrder(only for Savitzky-Golay smoothing).
nLeftpts
[input] if do Savitzky-Golay smoothing,number of data points to the left to be used in filter convolution,
if do median filter, Number of surrounding points to left and right. Thus the number of points considered in each segment is (2*nPts + 1).
if do adjacent averaging smoothing, is the window's size.
nMethod
[input] smoothing method.
SMOOTH_SG Savitzky-Golay smoothing
SMOOTH_MEDIAN_FILTER median filter
nBoundary
[input] data are padded on both ends. Possible values are
EDGEPAD_REFLECT pad reflect, end points are repeated such that on the left, [-1] = [0], [-2] = [1], [-3] = [2] and etc
EDGEPAD_REPEAT pad with [0] values the left and with [nSize-1] on the right
EDGEPAD_EXTRAPOLATE linear extrapolation using nLeft points on the left and nRight points on the right
EDGEPAD_PERIODIC pad periodic, [-1] = [nSize -1], [-2] = [nSize - 2]
nRightpts
[input] for Savitzky-Golay smoothing. number of data points to the right to be used in filter convolution, default (-1) will assume nLeft.
Total number of points used in the polynomial fits are (nLeft + nRight + 1) and it must be odd, namely nLeft + nRight must be even.
nPolydeg
[input] for Savitzky-Golay smoothing.The polynomial order. Higher order will preserve sharper features. nPolyDeg must be less then (nLeft + nRight + 1).
nDervOrder
[input] for Savitzky-Golay smoothing. order of derivative desired (0 = smoothing). To generate a fourth derivative, a minimum quartic (order 4) smoothing must be used.
For a third derivative, a minimum cubic (order 3) smoothing is needed. Similarly, a second derivative requires a minimum quadratic (order 2) smoothing.
dPercent
[input] for median filter.The percent for computing median.
bWeight
[input] for adjacent averaging smoothing. weight smooth or not. default is not(FALSE)
bAveraging
[input] for median filter.If true, the function will average the most nearest neighbors if there is no match to the given percent.

## Return

OE_NOERROR for success

## Examples

EX1

//Assume in the current graph, curve's XY data is in the first data plot. This piece
//of code get the XY data of the curve from the first data plot and smooth on it.
//The result is output in a new worksheet and the smoothing curve will plot in the
//original data plot with color red.
void ocmath_smooth_ex1()
{
GraphLayer gl = Project.ActiveLayer();
if (!gl)
{
out_str("Active layer is not a graph.");
return;
}

//get XY data from the first dataplot
DataPlot dp = gl.DataPlots(0);
DataRange dr;
vector vx, vy;
if(dp.GetDataRange(dr))
{
DWORD dwPlotID;
if(dr.GetData(DRR_GET_DEPENDENT | DRR_NO_FACTORS, 0, &dwPlotID, NULL, &vy, &vx) < 0)
{
printf("get data failed GetData");
return;
}
}
vector vSmooth;
vSmooth.SetSize(vy.GetSize());

int nRet = ocmath_smooth(vy.GetSize(), vy, vSmooth, 3,SMOOTH_SG, EDGEPAD_NONE, 3, 2);

//new a worksheet to put the result
Worksheet wks;
wks.Create("Smooth");
wks.SetSize(-1, 2);
wks.SetColDesignations("XY");

DataRange drOut;
drOut.Add("X", wks, 0, 0, -1, 0);
drOut.Add("Y", wks, 0, 1, -1, 1);
drOut.SetData(&vSmooth, &vx);

//plot the curve after smoothing
}