消除非周期性信号

时间:2018-02-12 17:35:35

标签: python plot signal-processing

我正在处理一组来自仪器的数据(x={time},y={measure}),但有时源会导致数据出现峰值,导致绘图不正确,并可能导致计算max和min等功能时出错。

所以我需要从我的数据中删除这些尖峰,例如图像中红色圆圈包围的尖峰:

image link

我发现this example用于去尖峰但我不知道如何反转信号(如果它在非对称信号上是正确的)我认为它是&#39 ; s仅用于检测尖峰,我需要通过拟合等操作将其移除...

我需要帮助才能知道是否有更好的方法来完成我的任务,或者我是否只是根据我的情况调整上述示例(在这种情况下我需要帮助,因为我不知道如何去做)。

2 个答案:

答案 0 :(得分:5)

以下是一组您可以遵循的估算峰值位置的步骤:

  1. 平滑数据。可以使用任意数量的过滤器。一个很好的起点是scipy cookbook中描述的smooth函数。您可以选择适当的参数,如窗口大小:

    baseline = smooth(data, ...)
    
  2. 将平滑后的数据视为基线,在没有已知拟合函数的情况下,类似于最佳拟合线。从数据中减去基线:

    noise = data - baseline
    
  3. 结果基本上是对伪拟合噪声的粗略估计。设置噪声过大的部分的阈值和斩波:

    threshold = 3.0 * np.std(noise)
    mask = np.abs(noise) > threshold
    
  4. 这里有很多配置选项:平滑过滤器类型和窗口大小,阈值因子甚至公制。例如,您可以使用IQR或完全不同的标准偏差。你对掩盖点的处理也完全取决于你。常见选项是完全丢弃或替换基线值。

答案 1 :(得分:1)

您要删除异常值,并且有很多方法可以执行此操作。主要目标是检测它们,并进一步根据相邻样本用估计值替换它们。

最简单且可以说是最有效的方法是找到连续样本的运行差异,并将它们与某个预定阈值进行比较。在这里,您必须小心确定阈值的大小,因为这将决定算法的灵敏度和准确性。

第二个解决方案可能只是使用低通滤波器,但我建议使用线性相位滤波器scipy.signal.filtfilt。

可以使用另一种过滤器,中值过滤器可能是最好的选择:scipy.signal.medfilt。

我希望这能回答你的问题,并且你将能够为你的案例找到过滤系数。