C#实现局部峰值查找,功能对应Matlab中的findpeaks.m(转)

相关算法的原理参考Ronny,地址:图像分析:投影曲线的波峰查找,这里感谢下原作者。

参照C++的代码实现,我用C#翻译了下,其实原理也很简单的,下面放相关实现代码:

 1 private double[] oneDiff(double[] data) 
 2         {
 3             double[] result = new double[data.Length - 1];
 4             for (int i = 0; i < result.Length; i++)
 5             {
 6                 result[i] = data[i + 1] - data[i];
 7             }
 8             return result;
 9         }
10         private int[] trendSign(double[] data)
11         {
12             int[] sign = new int[data.Length];
13             for (int i = 0; i < sign.Length; i++)
14             {
15                 if (data[i] > 0) sign[i] =1;
16                 else if (data[i] == 0) sign[i] = 0;
17                 else sign[i] = -1;
18             }
19             
20             for (int i = sign.Length - 1; i >=0 ; i--)
21             {
22                 if (sign[i] == 0 && i ==sign.Length - 1)
23                 {
24                     sign[i] = 1;
25                 }
26                 else if (sign[i] == 0) 
27                 {
28                     if (sign[i+1] >= 0)
29                     {
30                         sign[i] = 1;
31                     }
32                     else
33                     {
34                         sign[i] = -1;
35                     }
36                 }
37             }
38             return sign;
39         }
40         private int[] getPeaksIndex(int[] diff) 
41         {
42             List<int> data = new List<int>();
43             for (int i = 0; i != diff.Length - 1; i++)
44             {
45                 if (diff[i+1] - diff[i] == -2)
46                 {
47                     data.Add(i + 1);
48                 }
49             }
50             int[] result = new int[data.Count];
51             for (int i = 0; i < result.Length; i++)
52             {
53                 result[i] = data[i];
54             }
55             return result;//相当于原数组的下标
56         }

调用方法:

1 double[] data = {25, 8, 15, 5, 6, 10, 10, 3, 1, 20, 7};
2 int[] index = getPeaksIndex(trendSign(oneDiff(Constant.data)));

返回的int[]数组内容是对应原数组中峰值对应的索引(从0开始)

posted on 2018-10-16 09:43  wj5891  阅读(294)  评论(0编辑  收藏  举报

导航