python 根据以下要求查找一列信号的峰值:对于某一个峰,取其前5分钟数据的滑动平均值,若峰值与该滑动平均值的差值大于2E4#/cc,且该峰值前20秒数据中的最小值与该滑动平均值的差值小于2E4#/cc,则保留该峰。 若连续两个或以上峰的间隔小于8秒,则只保留这组峰中峰值最大的峰。
时间: 2024-02-15 22:04:10 浏览: 159
以下是一个简单的实现,可以根据要求查找一列信号的峰值:
```python
def find_peaks(signal):
peaks = []
i = 0
while i < len(signal):
# 找到当前峰的位置
j = i + 1
while j < len(signal) and signal[j] >= signal[i]:
i = j
j += 1
# 取峰前5分钟数据的滑动平均值
avg = sum(signal[max(0, i-300):i])/min(i, 300)
# 判断峰值与滑动平均值的差值是否满足条件
if signal[i] - avg > 2E4:
# 判断峰前20秒数据中的最小值与滑动平均值的差值是否满足条件
if min(signal[max(0, i-20):i]) - avg < 2E4:
# 与前一个峰的间隔小于8秒,则只保留峰值最大的峰
if peaks and i - peaks[-1][1] < 8:
if signal[i] > peaks[-1][0]:
peaks[-1] = (signal[i], i)
else:
peaks.append((signal[i], i))
i = j
return [p[1] for p in peaks]
```
这个函数接收一个一维的信号列表,返回所有满足条件的峰值的位置。在函数内部,首先对信号进行遍历,找到所有的峰值。对于每个峰,计算它前5分钟数据的滑动平均值,并判断峰值与该滑动平均值的差值是否大于2E4。如果满足条件,再判断该峰值前20秒数据中的最小值与该滑动平均值的差值是否小于2E4。如果同时满足这两个条件,就将该峰值的位置加入结果列表中。
如果连续两个或以上峰的间隔小于8秒,则只保留这组峰中峰值最大的峰。为了实现这个功能,我们使用了一个列表 `peaks`,记录了当前已找到的所有峰。对于新找到的峰,如果与前一个峰的间隔小于8秒,则判断两个峰的峰值大小,只保留峰值最大的峰。
注意,这只是一个简单的实现,实际应用中可能需要根据具体情况进行调整和优化。
阅读全文