1、聊一聊
其實每個人在無助的時候都需要一句"Cry On My Shoulder!" 今天跟大家介紹一種波峰波谷的檢測方法,不是很難,不過能夠凸顯數學在編程算法中的重要作用。
2、正文部分
波峰波谷用處
對于信號波峰波谷識別在嵌入式領域應該是非常廣泛的,因為大部分的信號都處于一種時變的狀態,信號在時域上處于一種類似于正弦波的波動狀態。
比如計步軟件就是通過IMU模塊所采集的變化的波形狀態來識別波峰波谷,最終估算你所走過步數;
上圖顯示了一個典型的x-, y-和z-測量模式,對應于一個跑步者的垂直,向前和側面加速度。無論如何佩戴計步器,至少有一個軸會有相對較大的周期性加速度變化,因此通過檢測其波峰波谷等算法即可對于檢測步行或跑步的單位周期至關重要。
還有在電力系統中的交流電壓電流,我們需要通過檢測波峰波谷來確定電壓電流在交流周期中的最大最小值,從而動態調節系統參數來達到自適應的目的,所以波峰波谷的檢測是非常有用的。
比較法識別
常規的設計辦法為比較法 : 其中x表示當前采樣點
波峰:f(x) > f(x?1) 且 f(x) > f(x+1)
波谷:f(x) < f(x?1) 且 f(x) < f(x+1) ?
然而這樣識別對于沒有什么噪聲,且每個采樣點為不同的信號來說還是合適的,但在嚴苛的環境中還需要構造更多的判斷條件來進行一些錯誤判斷的規避,終究還是麻煩了一些,并且容易遺漏。
差分識別
在學生階段我們就學習了導數的概念,如果一個函數一階導數左右異號,那分別就是波峰或者波谷。而對于數字信號的處理通過采樣都會變成離散信號,信號對時間的微分在離散域內即為差分。 在進行波形識別之前數據采集是必不可少的,其中最重要的是采樣速率和精度,以便從采樣信號中不失真的恢復原連續信號。(香農采樣) 采樣的過程中由于電子器件的雜訊等,數據難免會引入噪聲,為了簡化識別算法一般都會進行濾波處理,比如一些平滑處理等,然后才開始波峰波谷識別。
A、識別算法過程
1、獲得采樣點序列
2、進行差分處理
3、由于不在乎具體的差分幅值,把所有數據歸一到-1,0,1
4、差分值為0的點即為相同點,如果使用比較法則峰值檢測可能失效,便需要更多的條件,而這里我們直接把相同點0置為前一個非0即可規避該問題。
5、最終Diff再次進行差分,-2/+2即為波峰/波谷。
B、參考代碼
1#include2#include 3#defineSAMPLE_MAX20 4#definePV_MAX10 5 6floatSample[SAMPLE_MAX]={1,2,3,4,4,4,5,2,1,0,0,5,1,0,0,1,2,3,4,0}; 7floatSampleDiff[SAMPLE_MAX]={0}; 8 9typedefstruct_tag_FindPV 10{ 11intPos_Peak[PV_MAX];//波峰位置存儲 12intPos_Valley[PV_MAX];//波谷位置存儲 13intPcnt;//所識別的波峰計數 14intVcnt;//所識別的波谷計數 15}SFindPV; 16 17SFindPVstFindPV; 18 19/******************************************** 20*Fuction:initialFindPV 21*Note:初始化相關數據 22*******************************************/ 23voidinitialFindPV(void) 24{ 25intIndex=0; 26 27for(Index=0;Index0) 54SampleDiff[i]=1; 55elseif(Sample[i+1]-Sample[i]0) 56????????????SampleDiff[i]?=?-1; 57????????else 58????????????SampleDiff[i]?=?0; 59????} 60 61????//step?2?:對相鄰相等的點進行領邊坡度處理 62????for(i=?0;?i?=0) 69SampleDiff[i]=1; 70else 71SampleDiff[i]=-1; 72} 73else 74{ 75if(SampleDiff[i+1]>=0) 76SampleDiff[i]=1; 77else 78SampleDiff[i]=-1; 79} 80 81} 82} 83 84//step3:對相鄰相等的點進行領邊坡度處理 85for(i=0;iPos_Peak[pFindPV->Pcnt]=i+1; 90pFindPV->Pcnt++; 91} 92elseif(SampleDiff[i+1]-SampleDiff[i]==2)//波谷識別 93{ 94pFindPV->Pos_Valley[pFindPV->Vcnt]=i+1; 95pFindPV->Vcnt++; 96} 97} 98} 99 100/******************************************** 101*Fuction:main 102*Note:模擬查找波峰波谷 103*******************************************/ 104intmain(intargc,char*argv[]){ 105 106inti=0; 107 108initialFindPV(); 109 110FindPV(&stFindPV,Sample); 111 112printf("Peak "); 113for(i=0;i
2、最后
當然在實際的項目中為了更加穩定的識別波峰波谷可能會對波峰波谷的出現特點進行限制,從而進一步減少誤識別,也有許多人使用數據擬合的辦法來識別波峰波谷,那么識別的準確度就與所擬合的函數有關,通過數學方法對所擬合函數進行波峰波谷的求解,最終得到信號的波峰波谷,不過這樣的擬合過程對平臺的處理能力提出了一定的要求。
審核編輯:劉清
-
嵌入式
+關注
關注
5086文章
19143瀏覽量
306093 -
正弦波
+關注
關注
11文章
645瀏覽量
55459 -
計步器
+關注
關注
4文章
76瀏覽量
19942
原文標題:信號波峰波谷二階差分識別算法
文章出處:【微信號:zhuyandz,微信公眾號:FPGA之家】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
評論