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开始)