理论可以看我下面推荐的博客,我直接上代码
private double[] oneDiff(double[] data)//一阶差分
{
double[] result = new double[data.Length - 1];
for (int i = 0; i < result.Length; i++)
{
result[i] = data[i + 1] - data[i];
}
return result;
}
private int[] trendSign(double[] data)
{
int[] sign = new int[data.Length];
for (int i = 0; i < sign.Length; i++)
{
if (data[i] > 0)
sign[i] = 1;
else if (data[i] == 0)
sign[i] = 0;
else
sign[i] = -1;
}
for (int i = sign.Length - 1; i >= 0; i--)
{
if (sign[i] == 0 && i == sign.Length - 1)
{
sign[i] = 1;
}
else if (sign[i] == 0)
{
if (sign[i + 1] >= 0)
{
sign[i] = 1;
}
else
{
sign[i] = -1;
}
}
}
return sign;
}
private int[] getPeaksIndex(int[] diff)
{
List<int> data = new List<int>();
for (int i = 0; i != diff.Length - 1; i++)
{
if (diff[i + 1] - diff[i] == -2)
{
data.Add(i + 1);
}
}
int[] result = new int[data.Count];
for (int i = 0; i < result.Length; i++)
{
result[i] = data[i];
}
return result;//相当于原数组的下标
}
private void Form1_Load(object sender, EventArgs e)
{
Matrix<double> m = MatlabReader.Read<double>(@"E:\RamanSpectrum_graduation\PeakSearching\PeakSearching\bin\Debug\yuanshuju.mat");//读取MATLAB中的数据,
Array testArray = m.ToArray();
double[] data = new double[testArray.Length];
int j = 0;
foreach(double GG in testArray)
{
data[j] = GG;
j++;
}
int[] index = getPeaksIndex(trendSign(oneDiff(data)));
double[] data2 = new double[index.Length];
for(int i=0;i< index.Length;i++)
{
data2[i] = data[index[i]];//峰值点放在这里
}
}
测试数据可以在这里下载https://download.csdn.net/download/weixin_42974146/12503942
最后实现的效果可以看博客在zedGraph曲线上显示数据,显示波峰,寻峰算法的实现
上述算法思想转载至波峰波谷算法,感谢博主分享,同时参考了其它博主的分享
参考博客C# 使用Math.NET读取mat格式文件内容
参考博客C# 实现寻峰算法的简单优化(包含边峰,最小峰值,峰距)