如何统计一段离散信号中波峰的个数呢?来看下面一段波形:

可以非常容易数出波峰的个数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实现波峰统计相关推荐

  1. MapReduce Java API实例-统计出现过的单词

    场景 MapReduce Java API实例-统计单词出现频率: https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/11941016 ...

  2. 【Java方法】统计数组内不同元素个数及每个元素的数量

    [Java方法]统计数组内元素的种类数及每种元素的数量 1.统计数组内元素的种类数 2.统计数组内每种元素的数量 我们假定一个一维数组 a={1,2,3,2,2,3,1,3,2,1,2,3,1,2,1 ...

  3. java mysql数据库统计报表系统

    背景 用户想要自定义表达式,实现SPSS统计和Microsoft Office Access统计软件一样. 用户退一步一说,他们想要定制化表达式,自定义的变量,这个倒是好弄. 解决方案 做一个批处理定 ...

  4. java 网络流量统计_【Java】人流量统计-动态版之摄像头识别显示

    [Java]人流量统计-动态版之视频转图识别请访问 http://ai.baidu.com/forum/topic/show/940413 本文是基于上一篇进行迭代的.本文主要是以摄像头画面进行人流量 ...

  5. java字符数统计_【JAVA300例】51、统计输入的字符串中各种字符的字符数

    char类型需要单引号. import java.util.Scanner; public class Test054{ public static void main(String[] args){ ...

  6. java8 stream_使用Java Stream摘要统计

    java8 stream 基本类型的流( IntStream等)提供了summaryStatistics( )方法,该方法可用于获取流的多个统计属性(最小值,平均值等). 假设我们有一个人的名单. 我 ...

  7. java游戏输赢统计_java利用多线程和Socket实现猜拳游戏

    本文实例为大家分享了利用多线程和Socket实现猜拳游戏的具体代码,供大家参考,具体内容如下 实例:猜拳游戏 猜拳游戏是指小时候玩的石头.剪刀.布的游戏.客户端与服务器的"较量", ...

  8. Java的TreeMap统计单词数量

    使用TreeMap统计单词个数,并输出单词和书目,单词按升序排列 TreeMap的特点是无重复元素,且元素的key值既可以按默认的Comparable接口排序也可以按Comparator比较器排序,为 ...

  9. MapReduce Java API实例-统计单词出现频率

    场景 Windows下使用Java API操作HDFS的常用方法: https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/11938210 ...

最新文章

  1. 华为云大数据存储的冗余方式是三副本_大数据入门:HDFS数据副本存放策略
  2. 核磁共振影像数据处理-3-DTI基础、Li‘s have a solution and plan.
  3. aws python sdk send sns_AWS:boto3订阅SNS时的空SQS队列
  4. 用Spring Web Flow和Terracotta搭建Web应用
  5. Scrapy基本用法
  6. 如何更改java源码_java – 如何在Android中更改ImageView源码
  7. 在IT的世界里,分享是一种快乐.
  8. Miner3D Enterprise 企业版
  9. java竖线分割_Java String类的Split以竖线作为分隔符
  10. 江淮汽车涉嫌排放造假 罚款1.7亿
  11. 程序员必备的基本算法:递归详解
  12. 一个maven错误:org/apache/maven/shared/filtering/MavenFilteringException
  13. 66. Landing Page
  14. python去重命令_关于python去重操作的实例与算法原理演示 2020-12-05
  15. 图像算法常用图片Lena
  16. 单片机74LS164C语言例子,51单片机控制74LS164芯片输出64位的数组
  17. Tecplot自定义变量
  18. Astronauts UVALive - 3713(2-SAT)
  19. xctf攻防世界 REVERSE 高手进阶区 re2-cpp-is-awesome
  20. Xenu简单使用说明

热门文章

  1. 豆瓣链接 - 历史上最好的100本商业图书
  2. 算法工程师的日常工作些什么?
  3. 微型计算机原理与接口技术哈工程,微型计算机原理与接口技术(第2版)
  4. android安卓手机升级版本,安卓系统怎么更新升级
  5. 中国等高线地形图如何获取?超简单的方法教给你
  6. POS机钱箱的安装与驱动
  7. [春秋云镜]CVE-2020-19960,CVE-2020-19961
  8. Photoshop 2018及其他 所有版本下载安装教程 破解完美版含下载包
  9. JavaFX使用自定义字体
  10. linux《十》——系统安全之弱口令检测与网络端口扫描