我有一个介于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进行编码,因此内存分配不是最好的主意。
答案 0 :(得分:0)
可能是移动平均线将是一个不错的选择,定义长度为d
然后在任何时刻您的过滤值将是先前d
传感器值的平均值。
如果您真的关注删除某些strange
值,除了移动平均线之外,您可以设置threshold
,但我不推荐它,我猜您必须观察您的传感器正在遵循的真实模式。
答案 1 :(得分:0)
也许计算这些值的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
越快将跟踪新值。
如果你不喜欢浮点数学的开销,那么同样的想法在定点上也能很好地发挥作用。