如何基于前序值与阈值实现传感器数据滤波(Jupyter Notebook环境)
传感器数据滤波器实现(Jupyter Notebook)
需求说明
现有每秒采集的传感器读数数组SenorData,需实现以下滤波逻辑:
- 初始化空数组
FilterData,依次将SenorData的元素存入其中 - 当
FilterData包含至少两个元素时,检查最后一个元素是否大于阈值500 - 若超过阈值,用
FilterData的倒数第二个元素更新SenorData中对应的当前元素 - 循环执行上述逻辑完成数据滤波
代码实现
首先定义原始传感器数据:
SenorData= [110.3244118, 110.3244118, 110.3244118, 110.3244118, 110.3244118, 110.3244118, 110.3244118, 170.7510605, 170.7510605, 2180.280465, 2417.867061, 2793.702506, 2883.198035, 2822.542497, 2822.542497, 2862.483596, 2862.483596, 2723.776971, 2694.70809, 2812.700278, 2812.700278, 2812.700278, 2596.400342, 2269.66155, 1902.867214, 833.9564196, 457.4343089, 160.3366192, 131.0388501, 131.0388501, 91.09775079, 91.09775079, 91.09775079, 91.09775079, 91.09775079, 91.09775079, 91.09775079, 91.09775079, 91.09775079, 91.09775079]
基础滤波实现(单次遍历)
FilterData = [] threshold = 500 # 遍历传感器数据进行滤波 for idx, value in enumerate(SenorData): FilterData.append(value) # 当FilterData至少有两个元素时触发检查 if len(FilterData) >= 2: if FilterData[-1] > threshold: # 用前一个有效值替换当前超阈值数据 SenorData[idx] = FilterData[-2] # 更新FilterData,保证后续处理一致性 FilterData[-1] = FilterData[-2] # 打印滤波结果 print("滤波后的传感器数据:") for num in SenorData: print(num)
循环校验实现(确保无遗漏)
如果需要应对极端场景(比如替换后仍出现超阈值的连锁情况),可以循环遍历直到无超阈值元素:
FilterData = [] threshold = 500 has_over_threshold = True # 循环校验直到没有超阈值元素 while has_over_threshold: has_over_threshold = False FilterData = [] for idx, value in enumerate(SenorData): FilterData.append(value) if len(FilterData) >= 2: if FilterData[-1] > threshold: SenorData[idx] = FilterData[-2] FilterData[-1] = FilterData[-2] has_over_threshold = True # 打印最终滤波结果 print("最终滤波后的传感器数据:") for num in SenorData: print(num)
逻辑说明
- 通过
FilterData维护相邻两个传感器读数,实现实时的前后值对比 - 超阈值数据直接被前一个有效值覆盖,快速过滤异常波动
- 单次遍历适用于常规场景,循环校验可应对特殊的连锁异常情况
内容的提问来源于stack exchange,提问作者Jason
相关产品推荐
相关产品推荐

