我正在进行一个项目,在这个项目中,我必须读取安装在储罐中的液位传感器的数据,该传感器测量液位,并以毫伏发送输出。该装置具有预定义的电压范围,以决定从电压中的液位。油箱也可以安装在移动车辆上。我必须用图表来表示这些数据。
现在,问题是,一些设备发送的数据波动很大,您可以在下面的屏幕截图中看到。

为了显示平滑的直线,我用线性回归方法,创建了30分钟的数据束,并将其应用于每一串。结果如下。

正如你所看到的,线性回归很好的工作,给了我平滑的线,但是,问题是填充事件被延迟了几个小时。
那么,我的问题是,我可以使用哪些可能的方法来显示实际时间的平滑线和填充事件呢?
发布于 2020-08-07 05:21:18
正如@amon已经指出的,领域知识可能有助于找到合适的功能。
对于车辆油箱,你需要考虑两种类型的价值变化:缓慢的燃料消耗和快速填充。至少有两种类型的测量误差来源:运动引起的快速波动(类似噪音)和由于车辆停在一个角度而产生的中长像差。您可以在数据中看到这两种效果。温度也可能有影响,但要补偿它,就需要测量和计算其贡献,这可能是过分的。
一个相对简单的算法是计算一个低通滤波器和一个覆盖,当变化超过一个阈值时(这取决于预期的波动幅度)。
每一步都是这样的:
filtered_value = (measured_value > filtered_value + THRESHOLD)
? measured_value
: (1 - FACTOR) * filtered_value + FACTOR * measured_value当FACTOR是低通平滑因子时,必须在0到1之间,较小的值会产生较强的平滑效果,而THRESHOLD则是充罐阈值。两者的数值都需要通过实验来确定,没有单一的“正确”选择。
请注意,这还没有处理停车角度测量误差,但这可能还不够重要,不足以成为一个问题。
发布于 2020-08-13 22:59:47
指数平滑(汉斯-马丁以上)是一个很好的方法。
SmoothedValue =(1-α) * currentReading) + (α* PreviousSmoothedValue)
其中α是平滑系数。任何尖峰(规则模式的变化,可能是测量时液体运动引起的)都会影响这个序列,但是它的值在接下来的几个值中会被平滑(取决于α)值。要得到一个合适的系数,你需要确定你的坦克传感器的采样率。从你的图表上看,它似乎比每10秒一次更频繁,也许每2秒一次。接下来,选择一段时间进行平滑。你认为你使用的30分钟是不可接受的长,也许30秒是可以接受的,只要在间隔中至少有5次测量。在这段时间之后,所有的尖峰都会被完全平滑掉。然后将(1 -α)设置为这个时间间隔内测量次数的倒数.
在12:30下午12:30的储罐重新填充似乎在一个测量间隔内发生相当快.如果你准备接受一条狭窄的"S“型曲线(而不是垂直台阶),那么你就不需要门槛测试了。
要在时间0启动进程,只需将previousSmoothedValue设置为currentReading即可。
https://softwareengineering.stackexchange.com/questions/414548
复制相似问题