提问人:Aravinth 提问时间:10/29/2023 最后编辑:James ZAravinth 更新时间:10/30/2023 访问量:78
如何使用嵌入式C来阻止传感器中偶尔出现的突然尖峰值
how to arrest sudden spike value occurs occasionally in sensor using embedded c
问:
我正在使用带放大器的传感器。我可以看到传感器突然产生了非常高的价值,这影响了功能。我正在寻找一些可以消除突然峰值值的算法。我在这个项目中使用嵌入式 c,请向我推荐一些使用 c 程序消除突然峰值值的算法。
我尝试了以前和当前值的比较方法,但它没有解决我的问题
答:
0赞
Cem Polat
10/29/2023
#1
您可以尝试一个简单的移动平均过滤器,例如
#define N 5
int sensorData[N];
int currentIndex = 0;
int FilterSensorData(int newData) {
sensorData[currentIndex] = newData;
int sum = 0;
for (int i = 0; i < N; i++) {
sum += sensorData[i];
}
int movingAverage = sum / N;
currentIndex = (currentIndex + 1) % N;
return movingAverage;
}
根据需要选择 N。
我不知道你们的传感器数据的详细信息。如果传感器数据为实数,则可以使用浮点类型更改整数。
评论
0赞
Lundin
10/30/2023
通常应使用中值滤波器而不是平均滤波器来消除尖峰。否则,您让尖峰影响输出。
0赞
Martin Brown
11/1/2023
如果尖峰是单个样本,这是一个公平的点,但如果尖峰是影响多个连续样本的某种真实物理过程,则会变得棘手。出于这个原因,通常最好保存未受干扰的原始数据,并将经过清理的数据提供给任何客户,并使用 Boxcar 平均值的输出来替换平均值中的任何加标样本。
1赞
Lundin
10/30/2023
#2
请注意,数字平均滤波器的工作原理与硬件中的RC滤波器完全相同:它不会消除任何东西,只是将其向下舍入。如果尖峰是预期输入的一部分,则可以使用平均滤波器。
但是,如果尖峰是应该被忽略的异常,那么要消除尖峰而不是“调低”它们,您需要使用中值滤波器。通常称为 median-3 或 median-5 等,具体取决于您存储的先前样本数量。采样率需要足够长,以至于峰值仅在 1 个样本期间发生,否则您可以说是在处理浪涌,而不是峰值 - 或者只是采样太快。
如何对它们进行编码取决于您读取的是数字输入还是模拟输入。
数字输入就像按出现顺序存储 1 或 0 序列一样简单。假设 0 是预期值,那么您可以对 进行表查找,其“中位数 3”值为 0。001
对于模拟输入,您必须在输入值时对它们进行排序。可以在这里找到一些示例: https://embeddedgurus.com/stack-overflow/2010/10/median-filtering/ 有一些方法可以进一步优化该代码,但它应该是一个很好的介绍。
评论
savg
x
if (abs(x-savg(x))>_some_threshold) /* here spike is detected */ ;
svg(x(t)) = ( x(t-n)+ ... +x(t-2)+x(t-1)+x(t)+x(t+1)+x(t+2)+ ... +x(t+n) )/(n+n+1);
2n+1
x
2n+1
/