/// <summary>
/// 移动平均,曲线平滑
/// </summary>
/// <param name="rawData">原曲线数组</param>
/// <param name="step">步长</param>
/// <returns></returns>
public double[] Smoothing(double[] rawData, int step = 3)
{
double[] smooth = new double[rawData.Length];
fixed (double* o = smooth, r = rawData)
{
for (int i = step; i < rawData.Length; i++)
{
double total = 0;
int s = step * 2 + 1;
for (int j = i - step; j < i + step + 1; j++)
{
if (j < rawData.Length)
{
total += r[j];
}
else
{
break;
}
}
o[i] = total / s;
}
//Head fill
for (int i = 0; i < step; i++)
{
o[i] = o[step];
}
//Tail fill
int tail = rawData.Length - (rawData.Length % (step + 1)) - 1;
for (int j = tail; j < rawData.Length; j++)
{
o[j] = o[tail - 1];
}
}
return smooth;
}
/// <summary>
/// 中值滤波,去毛刺
/// </summary>
/// <param name="rawData"></param>
/// <param name="step"></param>
/// <returns></returns>
public double[] MedianFilter(double[] rawData, int step = 3)
{
int length = step * 2 + 1;
double[] smooth = new double[rawData.Length];
double[] median = new double[length];
fixed (double* o = smooth, r = rawData, m = median)
{
for (int i = step; i < rawData.Length; i++)
{
int s = i - step;
int k = 0;
for (int j = i - step; j < i + step + 1; j++)
{
if (j < rawData.Length)
{
m[k] = r[j];
}
else
{
break;
}
k++;
}
o[i] = SortBubbleAscendingOrder(median)[step];//排序取中间值,在我的上一篇博客有源码
}
//Head fill
for (int i = 0; i < step; i++)
{
o[i] = o[step];
}
//Tail fill
int tail = rawData.Length - (rawData.Length % (step + 1)) - 1;
for (int j = tail; j < rawData.Length; j++)
{
o[j] = o[tail - 1];
}
}
return smooth;
}