使用C中的直方图过滤数据

时间:2014-06-09 22:43:06

标签: c arduino range sensor

我有一个介于0和40之间的传感器的25个值。

大多数值都是真正的实际值,但有些值可能很远。

如何根据值获得可靠的衡量标准?

平均值不会起作用,因为较低或较高的值会使平均值爆炸。

假设我们有这些值:

10, 13, 22, 21, 19, 18, 20, 21, 22, 21, 19, 30, 30, 21, 20, 21, 22, 19, 18, 20, 22, 21, 10, 18, 19 

我认为最好的方法是使用直方图。定义手动范围将失败,因为我们可以拒绝范围界限旁边的一些好的值。 根据输入数据计算的自动范围不起作用,因为它们可以相互重叠。

我正在对Arduino进行编码,因此内存分配不是最好的主意。

4 个答案:

答案 0 :(得分:0)

可能是移动平均线将是一个不错的选择,定义长度为d然后在任何时刻您的过滤值将是先前d传感器值的平均值。

如果您真的关注删除某些strange值,除了移动平均线之外,您可以设置threshold,但我不推荐它,我猜您必须观察您的传感器正在遵循的真实模式。

P.S:我的回答可能是基于意见的,但这是我处理传感器的方式[在我的工作中],这对公司来说至今都是完美的。

答案 1 :(得分:0)

也许计算这些值的Trimmed Mean可以帮助你,或者只是 中位数。

How to calculate the truncated or trimmed mean?

答案 2 :(得分:0)

我结束使用的过滤器是多重均值。 我处理所有值的均值,然后从第一个均值中删除超过阈值的那些值,然后我计算左值的平均值。

答案 3 :(得分:0)

如果您实际上是在平均值之后,这对您不起作用,但此方法不需要额外的内存来管理样本缓冲区:

void loop() {
  static float mean = analogRead(A0);
  int newInput = analogRead(A0);
  mean = (mean * 0.95) + (newInput * 0.05);
  Serial.println(mean);
}

您可以将常数(0.95和0.05)调整为您喜欢的任何值,只要它们加起来为1. mean的乘数越小,mean越快将跟踪新值。

如果你不喜欢浮点数学的开销,那么同样的想法在定点上也能很好地发挥作用。