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