如何平滑/减少/过滤大量传感器数据?

时间:2016-03-31 08:48:49

标签: javascript c# asp.net-mvc d3.js

我正在为一些工业设备构建可视化,这些工业设备会产生大量基于时间的数据,如温度,电流或电压。所有数据都不断写入SQL Server数据库(无法控制该部分)。

HTML5前端包含我用d3.js制作的交互式缩放图表。可以根据需要将数据系列添加(加载)到图表中,在这种情况下,前端发送ajax请求,ASP.NET MVC和EF6从数据库中获取值并将它们作为Json返回。

每个数据元素只包含一个DateTime和一个值。请注意, not 的值会定期写入(例如每2秒左右),但是会以不规则的间隔写入。这是因为设备不会定期轮询,而是发送特定事件的数据,例如温度上升/下降0.1°C的给定变化。

到目前为止,一切工作都非常顺利,但是大量数据成为问题。例如,当我想显示一个选定时段(例如3个月)的折线图时,每个数据系列都包含appr。 500.000值,因此来自服务器的Json响应也变得越来越大,并且随着时间的增长,请求需要更长的时间。

所以我正在寻找一种方法来减少数据量而不会丢失相关信息,例如温度曲线峰值等,但同时我想平滑信号中的噪声。

以下是一个示例,请注意,这只是几个小时或几天的选定时段,通常用户也希望看到几个月甚至几年的数据: enter image description here

绿线是温度,红色条是数字状态的表示(在这种情况下是加热器,使其中一条温度曲线上升)。

你可以清楚地看到信号中的噪音,这就是我想要摆脱的。与此同时,我希望保持加热器开启后温度强烈上升和下降等特征。

我已经尝试将原始数据切割成给定长度的块,然后聚合其中的数据,这样我就可以获得该间隔的最小值,最大值和平均值。这是有效的,但通过这样做,我的曲线的特征功能会丢失,一切都变得扁平化或平均化。这是与上面相同时期的图片缩小了一点,以便聚合开始: enter image description here

上部系列的平均值显示为绿线,每个印章的范围(最小/最大)由平均线周围的绿色区域表示。

有什么样的花哨算法可以用来过滤/平滑/减少我的数据,当数据从数据库出来并发送到前端之前?这里有什么流行语我需要挖掘?任何特定的库,框架或技术都受到高度赞赏,以及对该主题的一般性评论。我主要对服务器端解决方案感兴趣,但请随意提及客户端Javascript解决方案,以及他们可能会对面临同样问题的其他人感兴趣。

1 个答案:

答案 0 :(得分:0)

“有什么样的花哨算法可以用来过滤/平滑/减少我的数据,当它从数据库出来并发送到前端之前?我需要挖掘什么流行语?后?“

我问过我工作的大学的一位朋友,她说Fourier Transforms可能会被使用......但对我来说这看起来像荷兰人:)

编辑:自己查看一下,因为您的数据是时间采样的,我猜您会对Discrete Time Fourier Transforms感兴趣

进一步搜索这个主题导致我here - 而且,对我的(公认的无可匹敌)眼睛来说,看起来像是有用的东西......

进一步修改:

所以,这个链接让我觉得你应该能够删除(例如)服务器端的每个第二个样本:然后在客户端,你可以使用该链接中描述的插值技术(使用逆傅立叶变换)有效地“恢复”客户端的缺失点:你已经转移了一半的点,但结果图将完全相同,因为在客户端你插入了缺失的样本......那是不是基地? :)