我有一个来自呼吸记录的信号,例如因打哈欠而导致很多尖峰。我试图使用熊猫的滚动平均功能删除它,但它没有帮助。此图表上的绿色空间是使用滚动平均值的结果。
import pandas as pd
RESP=pd.DataFrame(RESP)
RESP_AV=pd.rolling_mean(RESP,50)
我对过滤数据知之甚少,而且我无法在大熊猫中找到任何其他方法来消除此峰值,所以我的问题是在哪里寻找答案。 RESP.head()的结果是:
0 -2562.863389
1 -2035.020403
2 -2425.538355
3 -2554.280563
4 -2242.438367
6.7636961937
答案 0 :(得分:1)
我知道有两种方法可以解决这个问题:
设计更好的过滤器:
1)确定您的信号频段:
将信号的频谱图与时间信号进行比较,将非尖峰片段与尖峰片段进行比较,以确定最大有效频率(截止频率)和最小尖峰表现(停止频率)
2)设计LowPass过滤器: 如果你有matlab,请使用fdatool,如果你想使用python,请使用remez
3)使用该自定义LowPass过滤器而不是滚动平均值
如果您不喜欢结果,请重新设计滤镜(带子重量和窗口尺寸)
检测+替代:
1)删除信号的平均值。
2)使用微分滤波器和阈值来检测峰值。
3)切断信号中的所有峰值(用0'替换它们)
4)可选过滤切割段的峰值(参见上述方法)
5)对于每个切割峰,找到切割段与没有峰值的信号之间的最大互相关系数,替换该段并产生淡入/淡出效果以平滑粘贴。
答案 1 :(得分:1)
以下函数将从数组yi中删除最高尖峰,并用抛物线替换尖峰区域:
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
要移除许多尖峰:找到最高尖峰的位置,将此功能应用于尖峰周围的狭窄区域,重复。