我正在处理一组来自仪器的数据(x={time},y={measure})
,但有时源会导致数据出现峰值,导致绘图不正确,并可能导致计算max和min等功能时出错。
所以我需要从我的数据中删除这些尖峰,例如图像中红色圆圈包围的尖峰:
我发现this example用于去尖峰但我不知道如何反转信号(如果它在非对称信号上是正确的)我认为它是&#39 ; s仅用于检测尖峰,我需要通过拟合等操作将其移除...
我需要帮助才能知道是否有更好的方法来完成我的任务,或者我是否只是根据我的情况调整上述示例(在这种情况下我需要帮助,因为我不知道如何去做)。
答案 0 :(得分:5)
以下是一组您可以遵循的估算峰值位置的步骤:
平滑数据。可以使用任意数量的过滤器。一个很好的起点是scipy cookbook中描述的smooth
函数。您可以选择适当的参数,如窗口大小:
baseline = smooth(data, ...)
将平滑后的数据视为基线,在没有已知拟合函数的情况下,类似于最佳拟合线。从数据中减去基线:
noise = data - baseline
结果基本上是对伪拟合噪声的粗略估计。设置噪声过大的部分的阈值和斩波:
threshold = 3.0 * np.std(noise)
mask = np.abs(noise) > threshold
这里有很多配置选项:平滑过滤器类型和窗口大小,阈值因子甚至公制。例如,您可以使用IQR或完全不同的标准偏差。你对掩盖点的处理也完全取决于你。常见选项是完全丢弃或替换基线值。
答案 1 :(得分:1)
您要删除异常值,并且有很多方法可以执行此操作。主要目标是检测它们,并进一步根据相邻样本用估计值替换它们。
最简单且可以说是最有效的方法是找到连续样本的运行差异,并将它们与某个预定阈值进行比较。在这里,您必须小心确定阈值的大小,因为这将决定算法的灵敏度和准确性。
第二个解决方案可能只是使用低通滤波器,但我建议使用线性相位滤波器scipy.signal.filtfilt。
可以使用另一种过滤器,中值过滤器可能是最好的选择:scipy.signal.medfilt。
我希望这能回答你的问题,并且你将能够为你的案例找到过滤系数。