7

我正在开发一个车队管理系统,其中一项任务是显示一个代表车辆油耗的图表(基于来自CAN 总线的数据)。

如果数据值介于 0 和 100 之间,则表示百分比。所以,如果我得到一个整数 45,这意味着油箱里的燃料是 45%。

但是,如果车辆在移动,由于船舶的物理特性,可能会出现不一致的数据。例如,一个数据系列可能是:

76,76,75,74,73,73,71,70 <- 这是一个很好的模式,因为它显示了燃料是如何下降的。

76,70,75,76,77,76,74,74,73,72,69,72,73,73,72,71 <- 这不是一个好的模式,因为油箱中的燃油不会跳动一致并且我收到的数据不适合向用户显示。

我想平滑这些值,但是根据我一次选择平均多少个值,结果会有所不同。

关键问题是有时我必须在图表中显示消耗和加油的时刻,并且不能平滑。

我可以使用什么样的算法来分析和表示我的图表以使用户信服?

4

3 回答 3

3

有没有办法确定何时发生加油/排水?如果是这样,那么您可以在这些时间动态更改您的算法。

否则,我建议使用指数平滑。

令 d (0 <= d < 1) 为前一个数字的权重因子。所以显示数字 = prev_data*d + new_data*(1-d)

使用适当的权重因子,似乎“颠簸”会被消除,但同时结果会反映燃料事件。

这不是唯一的选择,更多的是一个示例算法,但我希望你觉得它有用。

小编辑:我没有意识到指数平滑有一个合适的名称。我只是在我创建的游戏中显示帧速率时使用了该技术。所以,谢谢肯珀。

于 2013-06-21T20:53:15.913 回答
1

据我了解,您希望小的变化消失,但保持大的跳跃而不平滑。移动中位数可能是您正在寻找的。它保留了大跳跃而不进行平滑(边缘保留属性)。

我不确定这对你来说是不是最好的方法。我得看看你的数据。

于 2013-06-21T22:00:56.613 回答
1

如果不与排水共享数据,这或多或少只是有根据的猜测......

我会尝试一个滑动平均值(至少有一个凹凸大小的窗口),它可以平滑凹凸,但可能会破坏排水,因为我们不知道这些信号有什么属性。

所以我会尝试这样的事情:

  1. 找到凹凸最大周期

    如果它是具有恒定形状的船舶和储罐,则最大颠簸周期由船舶能够承受的最大波浪尺寸和船舶长度固定,并按储罐形状和尺寸进行缩放。如果您不知道这个周期,您可以通过找到一些随后的局部最小值/最大值(窥视)并获取它们之间的最大距离来动态测量它。

  2. 创建一个检测排水的函数

    怎么做?我不能说,因为我不知道数据的样子,因为你没有分享它。

  3. 处理您的数据(提前足够的样本)

    所以我会构建一个大小等于你的滑动平均窗口的 F​​IFO。首先用起始样本完全填充 FIFO,然后将样本传递给它。但不是存储/显示/绘制输出值,而是使用 FIFO 中所有值的平均值。

    这是 FIFO(窗口)大小 9 样本的滑动平均值之前(黑色)和之后(蓝色)的碰撞信号的输出:

    阴谋

    请注意,数据从原始信号时移(延迟)了 FIFO 的一半大小(我将其移回图上,以便图彼此对应)。

  4. 如果检测到排水并且滑动平均将其破坏

    您需要在排水开始之前暂时禁用滑动平均值(只需使用较小的滑动窗口大小)。您可以在排水之前将大小从原始值线性插入到 1 ......然后在它之后返回,这样信号就不会失去平滑度。但是,滑动平均值可能会完全保留引流信息,而这部分不是必需的。没有相关数据就无法知道。

如果您需要更高级的东西,那么如果您获得更详细的数据,您可以假设凸起的形状具有特定的形状(由于燃料在其中振荡的油箱形状)。因此,您可以对信号进行FFT,去除特定于凹凸的频率,并通过逆 FFT 重建回来。如果你想避免复杂的域,你可以尝试使用DCT来做到这一点。但是,对于此类任务,我们没有足够的测量数据。

于 2020-10-14T07:51:04.260 回答