python find_peaks 源码理解

源码地址:https://bitbucket.org/lucashnegri/peakutils/src/master/peakutils/peak.py

参考链接:https://github.com/MonsieurV/py-findpeaks

find_peaks 算法流程:

输入信号为y  = np.array([1,1,1,4,1,3,4,7,6,1,3,2,1,9,0,8,8,8,7,1,1,1,6,2,9,9,9])

峰值检测的阈值为0.3

峰值检测的距离为min_dist=2

峰值检测幅值 thres=thres*(max-min)+min

 

1、获取一阶差分dy,以及差分为0 的下标位置

dy=[ 0,0,3,-3,2,1,3,-1,-5,2,-1,-1,8,-9,8,0,0,-1,-6,0,0,5,-4,7,0,0]

zeros=[ 0,1,15,16,19,20,24,25]

打印上述差分为0的点,可以获得如下图像

 

2、对zeros进行差分,以判断当前波形是否为水平的;并对zeros中的下标进行分组

zeros_diff=[1,14,1,3,1,4,1]

zeros_diff_not_one=[2,4,6] (第2,4,6个元素所在位置为非水平波形的位置)

以zeros_diff_not_one为切割点对zeros进行切割

zeros_plateaus=[[0,1],[15,16],[19,20],[24,25]] 其中每一行代表着一个水平波

3、对每一个水平波进行处理,使得每一个水平波中仅具有一个峰值转向点

在峰值点检测时,处于水平波中的各个点表现相同。故选取水平波中的中值点作为为一的峰值点。故对dy进行修正

若某一水平波处于信号起始位置,则dy在信号起始位置,向前填充;

dy=[ 3,3,3,-3,2,1,3,-1,-5,2,-1,-1,8,-9,8,0,0,-1,-6,0,0,5,-4,7,0,0]

若某一水平波处于信号结束位置,则dy在信号结束位置,向后填充;

dy=[ 3,3,3,-3,2,1,3,-1,-5,2,-1,-1,8,-9,8,0,0,-1,-6,0,0,5,-4,7,7,7]

若某一水平波处于信号中间位置,则dy在分别以中值为界,向前向后填充;

dy=[ 3,3,3,-3,2,1,3,-1,-5,2,-1,-1,8,-9,8,8,-1,-1,-6,-6,-1,5,-4,7,7,7]

4、获得符合峰值检测的峰值点

这一峰值点的判断依据为:dy[i]>0,dy[i+1]<0,y[i]>thres 那么i为信号的峰值点位置

5、使用峰值检测距离,筛除无效的峰值点

对上述峰值点,按照其幅值进行排序(从高到低),逐点提取峰值点。并以其为中心,\pm mindist为区间。将这一区间内的所有点均视为非峰值点。整个筛选流程如下所示:

 

最终能够获得峰值点的指示矩阵。

 

 

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值