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
}