1. 程式人生 > >Java實現波峰統計

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實現波峰統計

如何統計一段離散訊號中波峰的個數呢?來看下面一段波形: 可以非常容易數出波峰的個數3,我們都知道波峰是一段波中的區域性最高點,那麼此時我們只要找到這樣一個點滿足: High(x1)>High(x1-1) High(x1)>High(x1+1) 即此時x

Java實現資料統計的常用演算法

求和、平均值、眾數、中位數、中列數、四分位數、極差、四分位數、截斷均值、方差、絕對平均差(AAD)、中位數絕對偏差、標準差 的數學方法 package cn.javacodes.utils; import java.util.Arrays; import java.util.HashMap;

基於Java實現Spark統計身高的例項

a. 案例描述 本案例假設我們需要對某個省的人口 (10萬) 性別還有身高進行統計,需要計算出男女人數,男性中的最高和最低身高,以及女性中的最高和最低身高。本案例中用到的原始檔有以下格式, 三列分別是 ID,性別,身高 (cm),格式如下: b.人口

JAVA實現EXCEL公式專題(七)——統計函數

length trace trac 復雜 manage 排列 public ram script 統計函數主要實現的是較為復雜的統計函數如countif、sumif、frequency,也是,直接上代碼/** * 項目名稱: * 文件說明: * 主要特點

java 實現各種資料統計

import java.awt.BasicStroke; import java.awt.Color; import java.awt.Font; import java.awt.RenderingHints; import java.awt.geom.Ellipse2D; import ja

【OS大作業】用多執行緒統計txt檔案中字元個數(Java實現

問題描述 給定一個txt檔案,利用不同個數的執行緒查詢檔案中某字元的個數,探究執行緒個數與查詢時間的關係。 本作業程式碼使用JAVA實現,版本為10.0.2,使用的IDE為Eclipse4.9.0. 結果測試所用的txt檔案內容為英文,編碼格式為UTF-8。 原始碼 第一版程式碼:(

報表統計——java實現查詢某年某月每天資料,沒資料補0

一般圖表繪製例如echarts等,返回資料格式都大同小異。重點是利用sql或者java實現資料格式的轉型,接下來是關鍵部分: 1.前提1:提供的工具方法——獲取某月有多少天 //通過年份和月份確定該月的最後一天 public static int getMaxDay(int year,in

java實現二叉樹查詢,統計結點個數,統計樹的深度及判斷兩棵樹是否相等

二叉樹的建立在前面已經實現,現在只寫子函式 public bitreeNode searchNode(bitreeNode t,Object x){ if(t!=null){ if(t.getdata().equals(x)) //對根節點進行判斷 retur

Java實現中文詞頻統計

昨日有個中文詞頻統計的需求, 百度一番後, 發現一大堆標題黨文章, 講的與內容嚴重不符, 這裡就簡單記錄下自己實現的流程吧! 與英文單詞的詞頻統計不同, 中文的難點在於如何分詞, 不過好在有許多優秀的現成庫供呼叫,這裡就使用了 ansj_seg 外掛. 首先新增依賴: 下載jar 訪問

Java程式設計中JFreeChart圖表繪製類庫巧妙利用JSP實現頁面統計

1 開發環境: 1、eclipse(可替換)2、jfreechart-1.0.19 2 說明: (1) source目錄:為 jfreechart的原始碼目錄;不會的主要看這裡。因為他的文件是收費的。(2) lib目錄:為包目錄,我們需要關注的包為 jfreechart-1.0.10.ja

java實現百度統計api呼叫

**公司需要呼叫百度統計的api,昨天搞了一天,先看了百度統計的官方文件 emmmmmmm 是真的沒怎麼看懂,然後在網上搜了各位大牛的實現,最後自己嘗試了一下訪問成功!** 首先是訪問https的類(網上找大牛copy的): 類名 HttpsU

Java 實現網站當前線上使用者統計

     通過SessionListenr可以監聽session的建立和銷燬,所以首先要寫一個類MySessionListener,實現javax.servlet.http.HttpSessi

Java實現統計一篇文章中每個單詞出現的次數

import java.io.File; import java.io.FileReader; import java.util.HashMap; import java.util.Iterator; import java.util.Map; import java.util.Set; import jav

java實現輸入一行字元,分別統計出其中英文字母、空格、數字和其它字元的個數。

package excise;  /*輸入一行字元,分別統計出其中英文字母   、空格、數字的個數*/import  java.util.Scanner;  publicclass T007 {   

java實現小說閱讀器(功能:檢視全文、統計總行數/總頁碼數、查詢指定行、指定頁碼、實現翻頁)

1.任務要求: 在DOS視窗下,實現檢視全文、統計總行數/總頁碼數、查詢指定行、指定頁碼、翻頁 2.閱讀器實現方式 輸入1(檢視全文、統計總行數/總頁碼數、) 輸入2(讀取指定行,查詢其上下行) 輸入+顯示下一行,輸入-顯示上一行,輸入bye返回上一級

Java實現:月,日,年,周,訪問量統計

一:工程截圖: 二:執行效果圖: 三:CountObjectInfo.java: package cn.csrc.base.count; import java.util.Date; public class CountObjectInfo { // 總訪問量

使用Java實現在單機上統計單詞的數目

準備 首先在IDE(eclipse或者IntelliJ IDEA)上面建立一個Java專案。匯入F:\spark\spark-1.6.0-bin-hadoop2.6\lib\spark-assembly-1.6.0-hadoop2.6.0.jar這個jar包。

Java實現統計福彩雙色球出現次數(毫無技術可言)

今天早上閒來無事,恰好在看微博的時候看到的雙色球的開獎視訊,沒出現一個號,主持人就會報出現了多少次,於是自己就無聊的寫了一下統計每期的號碼出現的次數程式。 彩票號碼資料來自網上: 程式碼如下Money.java: package com.heynine.money;

java實現學生資訊統計系統

學生資訊查詢 功能: 1.通過id修改學生資訊 2.獲取指定學生的成績 3.獲取指定學號的成績 4.根據姓名修改指定學科的成績 5.刪除指定學生及其成績 6.統計所有成績相等的人數 7.獲取到所有學生某一科的成績 程式碼塊 pac

多執行緒中的全域性資訊統計的一種簡單實現方式(java實現)

如果你學過作業系統,我想你肯定對原子操作不會陌生,著名的哲學家就餐問題大家估計也不會陌生。如果現在有一個多執行緒的程式,有一個公共的訪問變數,那麼想正確的控制這個公共變數的值,每個學過計算機的人的處理方式肯定是使用一些互斥量,或者鎖機制,或者訊號量的方法保證對公共變數的訪問