首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在Python中删除信号中的尖峰

在Python中删除信号中的尖峰
EN

Stack Overflow用户
提问于 2016-06-01 06:12:45
回答 4查看 16.2K关注 0票数 4

例如,我从呼吸记录中得到了一个信号,由于打哈欠而产生了许多尖峰。我试着用熊猫的滚动均值函数把它去掉,但是没有用。此图上的绿色空间是使用滚动平均值的结果。

代码语言:javascript
运行
复制
import pandas as pd

RESP=pd.DataFrame(RESP)
RESP_AV=pd.rolling_mean(RESP,50)

我对过滤数据知之甚少,在pandas中也找不到任何其他方法来消除这种尖峰,所以我的问题是到哪里去寻找答案。RESP.head()的结果是:

代码语言:javascript
运行
复制
 0 -2562.863389
1 -2035.020403
2 -2425.538355
3 -2554.280563
4 -2242.438367
6.7636961937

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2018-03-29 22:00:49

以下函数将从数组yi中删除最高尖峰,并用抛物线替换尖峰区域:

代码语言:javascript
运行
复制
import numpy as np
def despike(yi, th=1.e-8):
'''Remove spike from array yi, the spike area is where the difference between 
  the neigboring points is higher than th.'''
  y = np.copy(yi) # use y = y1 if it is OK to modify input array
  n = len(y)
  x = np.arange(n)
  c = np.argmax(y)
  d = abs(np.diff(y))
  try:
    l = c - 1 - np.where(d[c-1::-1]<th)[0][0]
    r = c + np.where(d[c:]<th)[0][0] + 1
  except: # no spike, return unaltered array
    return y
  # for fit, use area twice wider then the spike
  if (r-l) <= 3:
    l -= 1
    r += 1
  s = int(round((r-l)/2.))
  lx = l - s
  rx = r + s
  # make a gap at spike area
  xgapped = np.concatenate((x[lx:l],x[r:rx]))
  ygapped = np.concatenate((y[lx:l],y[r:rx]))
  # quadratic fit of the gapped array
  z = np.polyfit(xgapped,ygapped,2)
  p = np.poly1d(z)
  y[l:r] = p(x[l:r])
  return y

要移除许多尖峰:找到最高尖峰的位置,将此函数应用于尖峰周围的狭窄区域,重复此操作。

票数 1
EN

Stack Overflow用户

发布于 2016-06-01 06:52:19

我知道有两种方法可以解决这个问题:

设计更好的过滤器:

1)确定您的信号频段:

比较信号的频谱图和时间信号,比较非尖峰段和尖峰段,以确定最大有用频率(截止频率)和最小尖峰显示频率(停止频率)。

2)设计一个LowPass过滤器:如果你有matlab,使用fdatool,如果你想使用python,使用remez

3)使用自定义LowPass滤波器而不是滚动平均,

如果你不喜欢结果,重新设计滤波器(带权重和窗口大小)

检测+替换:

1)去除信号的均值。

2)使用微分滤波器和阈值来检测峰值。

3)从信号中剔除所有的峰值(用0替换它们)

4)可选滤除截断段中的峰值(参见上述方法)

5)对于每个被剪切的峰值,找出被剪切的片段与没有峰值的信号之间的最大互相关系数,替换该片段,并进行淡入/淡出效果,以平滑粘贴。

票数 1
EN

Stack Overflow用户

发布于 2022-01-27 17:26:53

对于数据中的尖峰,我也遇到了同样的问题,因为您使用了Dataframe Quantile,一种解决方案是使用Pandas Series between过滤掉所需分位数/范围Dataframe Quantile之外的点。在我的示例中,我只采用98%分位数内的值,它保留了大多数所需的值;您可以尝试使用最高分位数,看看哪个效果更好。

代码语言:javascript
运行
复制
x=raw_data    
x_r = x[x.between(x.quantile(.000), x.quantile(0.98))]

您可以做的一件事是绘制散点,这样您就可以准确地看到哪些点是异常值,因为显然matplotlib line plot在缺省情况下会将相邻的点连接在一起,即使它们之间没有数据。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37556487

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档