swift实现python中的spicy.signal.find_peaks

swift中无寻找信号峰值函数,自己写了一个,可以检测固定阈值和距离间隔的峰值索引。

    func findPeaks(velocity_data:Array<Double>, height:Double, distance:Double) -> Array<Int>{
        
        //筛选所有大于height的点
        var indexList1:Array<Int> = []
        for index in 0..<velocity_data.count{
            if velocity_data[index] >= height{
                indexList1.append(index)
            }
        }
        
        //筛选连续索引中的最大值点
        let indexSet = IndexSet(indexList1)
        let rangeView = indexSet.rangeView
        let rangeViewArray = rangeView.map { Array($0.indices) }
        var indexList2:Array<Int> = []
        for range in rangeViewArray{
            var maxData = height
            var index = 0
            for data in range{
                if velocity_data[data] >= maxData{
                    maxData = velocity_data[data]
                    index = data
                }
            }
            indexList2.append(index)
        }
        
        //筛选满足最小距离的点
        var keep:Array<Int> = Array(repeating: 1, count: indexList2.count)
        let priority = indexList2.map{velocity_data[$0]}
        let priorityToPosition = priority.enumerated().sorted(by: {$0.element < $1.element
        }).map{$0.offset}
        for i in stride(from: indexList2.count-1, through: 0, by: -1){
            let j:Int = priorityToPosition[i]
            if keep[j] == 0{
                continue
            }
            
            var k:Int = j-1
            while 0<=k && indexList2[j] - indexList2[k] < Int(distance){
                keep[k] = 0
                k -= 1
            }
            k = j+1
            while k<indexList2.count && indexList2[k] - indexList2[j] < Int(distance){
                keep[k] = 0
                k += 1
            }
        }
        var indexList3:Array<Int> = []
        for i in 0..<keep.count{
            if keep[i] != 0{
                indexList3.append(indexList2[i])
            }
        }
        return indexList3
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值