我有一个numpy数组,它基本上是excel工作表中的数据列。该数据是通过低通10 Hz滤波器DAS获取的,但是由于某些歧义,它包含类似方波的伪像。现在必须在0.4 Hz高通巴特沃斯滤波器上对数据进行滤波,我通过scipy.signal对其进行滤波。但是,在应用高通滤波器之后,像伪像的方波会变成尖峰。将scipy.median应用于它时,我无法成功过滤峰值。我该怎么办?
下图显示了原始数据。
下面的图片显示了施加了0.4 Hz的高通滤波器,然后是3阶中值滤波器
51阶中值过滤器也没有用。
答案 0 :(得分:0)
如果始终希望您的输入有明显的异常值,我建议您使用迭代过滤方法。
以下是您的数据以及平均值,1-sigma,2-sigma和3-sigma线的绘制图:
我将从均值中除去2σ上下的所有内容开始。由于这样可以使分布更紧密,因此我建议一遍又一遍地进行迭代,直到未修剪的数据的大小保持不变为止。我建议以几何方式增加阈值,以避免修剪“好”数据。最后,您可以用剩余的平均值或类似的东西来填充缺失的点。
这是一个示例实现,未尝试进行任何优化:
data = np.loadtxt('data.txt', skiprows=1)
x = np.arange(data.size)
loop_data = data
prev_size = 0
nsigma = 2
while prev_size != loop_data.size:
mean = loop_data.mean()
std = loop_data.std()
mask = (loop_data < mean + nsigma * std) & (loop_data > mean - nsigma * std)
prev_size = loop_data.size
loop_data = loop_data[mask]
x = x[mask]
# Constantly expanding sigma guarantees fast loop termination
nsigma *= 2
# Reconstruct the mask
mask = np.zeros_like(data, dtype=np.bool)
mask[x] = True
# This destroys the original data somewhat
data[~mask] = data[mask].mean()
这种方法可能并非在所有情况下都是最优的,但我发现大多数时候它是相当可靠的。有很多可调整的参数。您可能希望将增加因子从2更改,甚至采用线性而不是几何增加(尽管我尝试了后者,但实际上效果不佳)。您还可以使用IQR而不是sigma,因为它对异常值更健壮。
这是结果数据集的图像(删除的部分为红色,原始虚线为:)
另一个有趣的工件:这是数据的曲线图,显示了修整进度及其对截止点的影响。图表显示了数据,其中切割部分为红色,其余部分为n-sigma线。标题显示sigma缩小了多少: