投票的形式筛选数据
在做一个测某东西速度的产品时,由于测速的原理是检测某东西连续经过2次的时间间隔,用1分钟去除于时间间隔来计算速度。在测试过程中发现有漏检现象,出现的数据如下{ 50, 53, 55, 103, 56,59, 48, 106, 57, 58… },其中103和106明显是其他数据的2倍左右,说明中间漏检了,因为所有数据都有是实时变化的,所以用投票的方式来选择更合理的数据。
思路是这样:将要筛选的数据拿去投票,投票时都把票投给自己,最后结果就是有一堆数据投票很集中,就拿前面这组数据{ 50, 53, 55, 103, 56,59, 48, 106, 57, 58… }来分析,其中53,55,56,57比较扎堆,数据大小都与55相差2以内,我们判定55是这组数据中比较可靠的数据。
- 废话不多说,直接看投票筛选数据的代码
#include <stdio.h>
#define NUM_INTERVALS 10 // 参与投票的数据量
#define THRESHOLD 2 // 允许数据之间的误差阈值
int intervals[NUM_INTERVALS] = { 50, 53, 55, 103, 56, 60, 40, 106, 57, 58 }; // 输入参与投票的数据
int voteCounts[NUM_INTERVALS] = { 0 }; // 投票计数数组
void setup() {
Serial.begin(115200);
}
void loop() {
// 进行投票统计
for (int i = 0; i < NUM_INTERVALS; i++) {
int weight = 10; // 默认投票权重为10%
for (int j = 0; j < NUM_INTERVALS; j++) {
// 检查数据之间的差值是不是在2以内,是的话投票给同一个数据
if (abs(intervals[i] - intervals[j]) <= THRESHOLD) {
voteCounts[i] += weight;
}
}
}
int maxVotes = 0; // 最大投票数量
int index = 0; // 最大投票数量对应数据
// 找到获得最多投票的数据
for (int i = 0; i < NUM_INTERVALS; i++) {
if (voteCounts[i] > maxVotes) {
maxVotes = voteCounts[i];
index = i;
}
}
int accurateInterval = intervals[index]; // 获得最多投票的数据
Serial.print("accurateInterval=");
Serial.println(accurateInterval);
delay(100);
}
- 运行结果