Java实现波峰统计
如何统计一段离散信号中波峰的个数呢?来看下面一段波形:
可以非常容易数出波峰的个数3,我们都知道波峰是一段波中的局部最高点,那么此时我们只要找到这样一个点满足:
High(x1)>High(x1-1)
High(x1)>High(x1+1)
即此时x1的值大于其左右两边的值,就可以确定一个波峰了。代码实现一下:
public static int getPeakNum1(float[] data){int peak=0;for (int i=0;i<data.length-1;i++){if (data[i]>data[i-1]&&data[i]>data[i+1]){peak++;i++;}}return peak;
}
看起来好像没问题,接着看下面这两幅图:
这两张图看似扭曲,实际上也是一个波峰,但是用上面说的方法便行不通了。
对于此类情况的数据,我们首先要进行筛选,一段连续相等的数据,只需保留一个数据,其余都滤掉即可。看代码:
public static int getPeakNum2(float[] data){int peak=0;//需要三个不同的值进行比较,取lo,mid,hi分别为三值for (int lo=0,mid=1,hi=2;hi<data.length;hi++){//先令data[lo]不等于data[mid]while (mid<data.length&&data[mid]==data[lo]){mid++;}hi=mid+1;//令data[hi]不等于data[mid]while (hi<data.length&&data[hi]==data[mid]){hi++;}if (hi>=data.length){break;}//检测是否为峰值 if (data[mid]>data[lo]&&data[mid]>data[hi]){peak++;}lo=mid;mid=hi;}return peak;
}
—————————————————————————————————————————————————————————
文章到这儿其实可以结束了,但是在实际运用中还会有各种情况,就比如我遇到的这种:
可以看到有两个波峰,但是从整体看其实只有一个波峰,多出来的波峰我称其为伪峰。这个时候可以利用平滑滤波器来对波形进行平滑,但是却不能完全保证能够把多余的伪峰值滤除。因此需要设计一种算法来辅助。由于实际应用中会有千奇百怪的波形,我这里只是针对我自己的情况设计的算法,可以作为一种借鉴。
我们知道,两个波峰之间必然有一个波谷,而两个波谷之间也必然有一个波峰,如:
波峰/波谷/波峰/波谷/波峰/。。。
结合这个规律提供我的算法思路:
(1)先找到所有波峰和波谷
(2)对信号求均值
(3)滤掉所有大于均值的波谷和小于均值的波峰
(4)合并剩下的波峰波谷中相邻的波峰,相邻的波谷,使其满足波峰/波谷的规律
(5)统计剩下的波峰
来看看代码:
public static int getPeakNum3(float[] data){int peak=0;float[] PeakAndTrough=new float[data.length];//需要三个不同的值进行比较,取lo,mid,hi分别为三值for (int lo=0,mid=1,hi=2;hi<data.length;hi++){//先令data[lo]不等于data[mid]while (mid<data.length&&data[mid]==data[lo]){mid++;}hi=mid+1;//令data[hi]不等于data[mid]while (hi<data.length&&data[hi]==data[mid]){hi++;}if (hi>=data.length){break;}//检测是否为峰值if (data[mid]>data[lo]&&data[mid]>data[hi]){PeakAndTrough[mid]=1; //1代表波峰}else if(data[mid]<data[lo]&&data[mid]<data[hi]){PeakAndTrough[mid]=-1; //-1代表波谷}lo=mid;mid=hi;}//计算均值float ave=0;for (int i=0;i<data.length;i++){ave+=data[i];}ave/=data.length;//排除大于均值的波谷和小于均值的波峰for (int i=0;i<PeakAndTrough.length;i++){if ((PeakAndTrough[i]>0&&data[i]<ave)||(PeakAndTrough[i]<0&&data[i]>ave)){PeakAndTrough[i]=0;}}//统计波峰数量for (int i=0;i<PeakAndTrough.length;){while (i<PeakAndTrough.length&&PeakAndTrough[i]<=0){i++;}if (i>=PeakAndTrough.length){break;}peak++;while (i<PeakAndTrough.length&&PeakAndTrough[i]>=0){i++;}}return peak;}
Java实现波峰统计相关推荐
- MapReduce Java API实例-统计出现过的单词
场景 MapReduce Java API实例-统计单词出现频率: https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/11941016 ...
- 【Java方法】统计数组内不同元素个数及每个元素的数量
[Java方法]统计数组内元素的种类数及每种元素的数量 1.统计数组内元素的种类数 2.统计数组内每种元素的数量 我们假定一个一维数组 a={1,2,3,2,2,3,1,3,2,1,2,3,1,2,1 ...
- java mysql数据库统计报表系统
背景 用户想要自定义表达式,实现SPSS统计和Microsoft Office Access统计软件一样. 用户退一步一说,他们想要定制化表达式,自定义的变量,这个倒是好弄. 解决方案 做一个批处理定 ...
- java 网络流量统计_【Java】人流量统计-动态版之摄像头识别显示
[Java]人流量统计-动态版之视频转图识别请访问 http://ai.baidu.com/forum/topic/show/940413 本文是基于上一篇进行迭代的.本文主要是以摄像头画面进行人流量 ...
- java字符数统计_【JAVA300例】51、统计输入的字符串中各种字符的字符数
char类型需要单引号. import java.util.Scanner; public class Test054{ public static void main(String[] args){ ...
- java8 stream_使用Java Stream摘要统计
java8 stream 基本类型的流( IntStream等)提供了summaryStatistics( )方法,该方法可用于获取流的多个统计属性(最小值,平均值等). 假设我们有一个人的名单. 我 ...
- java游戏输赢统计_java利用多线程和Socket实现猜拳游戏
本文实例为大家分享了利用多线程和Socket实现猜拳游戏的具体代码,供大家参考,具体内容如下 实例:猜拳游戏 猜拳游戏是指小时候玩的石头.剪刀.布的游戏.客户端与服务器的"较量", ...
- Java的TreeMap统计单词数量
使用TreeMap统计单词个数,并输出单词和书目,单词按升序排列 TreeMap的特点是无重复元素,且元素的key值既可以按默认的Comparable接口排序也可以按Comparator比较器排序,为 ...
- MapReduce Java API实例-统计单词出现频率
场景 Windows下使用Java API操作HDFS的常用方法: https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/11938210 ...
最新文章
- 华为云大数据存储的冗余方式是三副本_大数据入门:HDFS数据副本存放策略
- 核磁共振影像数据处理-3-DTI基础、Li‘s have a solution and plan.
- aws python sdk send sns_AWS:boto3订阅SNS时的空SQS队列
- 用Spring Web Flow和Terracotta搭建Web应用
- Scrapy基本用法
- 如何更改java源码_java – 如何在Android中更改ImageView源码
- 在IT的世界里,分享是一种快乐.
- Miner3D Enterprise 企业版
- java竖线分割_Java String类的Split以竖线作为分隔符
- 江淮汽车涉嫌排放造假 罚款1.7亿
- 程序员必备的基本算法:递归详解
- 一个maven错误:org/apache/maven/shared/filtering/MavenFilteringException
- 66. Landing Page
- python去重命令_关于python去重操作的实例与算法原理演示 2020-12-05
- 图像算法常用图片Lena
- 单片机74LS164C语言例子,51单片机控制74LS164芯片输出64位的数组
- Tecplot自定义变量
- Astronauts UVALive - 3713(2-SAT)
- xctf攻防世界 REVERSE 高手进阶区 re2-cpp-is-awesome
- Xenu简单使用说明