学习:通用软件滤波算法-限幅滤波法

it2023-07-29  68

一、处理思想

设置前后两次数据可允许的最大偏差VARIATION_RANGE,每当有新数据到来时和上一个数据进行比较,若在允许偏差范围内,则本次数据有效,反之则无效,使用上一次数据值代替本次数据。

 

函数设计

输入参数:上一个数据,当前采集数据

函数输出:当前有效数据

二、C语言实现

/* * 文件名:Filtering_algorithm.c * 作者:JYU_hsy * 描述:前10种为常见滤波算法,较为基础;11为论文<基于无线传感网的弱势群体身体信息监测系统的设计>提到的改进。 程序默认对int类型数据进行滤波,如使用不同类型请修改宏TARGET_tYPE 数据采集函数为get_data(),为方便调试,本代码使用的是随机数/事先安排好数据 * 时间:2019-6-13 */ #include<stdio.h> #include<stdlib.h> #define TARGET_tYPE int int i = 0; //数据采集函数 TARGET_tYPE get_data() { TARGET_tYPE Data[129] = {1,3,4,4,5,7,6,9,9,9,10,11,13,15,15,17,17,18,18,21,22,21,22,24,25,27,28,29,28,24,22,21,21,26,32,32,29,28,30,30,31,31,28,30,27,31,30,32,29,30,27,30,33,30,20,22,22,26,30,33,30,32,27,29,29,30,32,30,29,28,27,30,28,33,32,33,25,24,31,36,32,32,32,36,26,25,32,31,25,31,36,24,29,25,34,32,26,34,27,31,28,26,32,33,26,28,35,26,31,28,26,25,30,26,20,30,28,23,24,19,27,27,27,24,27,27,27,28,22}; i++; return Data[i]; //return ReadTemperature(); } #define VARIATION_RANGE 4 //最大偏差值 TARGET_tYPE Bounds_FILTER(TARGET_tYPE Old_value,TARGET_tYPE Value) { if((Value - Old_value > VARIATION_RANGE)||(Old_value - Value > VARIATION_RANGE)) { return Old_value; } else return Value; } int main(void) { //保存上一次采集的数据 TARGET_tYPE Old_value; TARGET_tYPE Value; //The one data Old_value = get_data(); printf("data = %d\n",Old_value); printf("Bounds_FILTER = %d\n",Old_value); for(int i = 128;i > 0;i--) { Value = get_data(); printf("data = %d\n",Value); Value = Bounds_FILTER(Old_value,Value); printf("Bounds_FILTER = %d\n",Value); Old_value = Value; } system("PAUSE"); return 0; } 三、滤波效果

图1. VARIATION_RANGE = 2

 

图2. VARIATION_RANGE = 4

四、优缺点

优点

能有效克服因偶然因素引起的单次脉冲干扰;参照图1。

缺点

无法抑制那种周期性的干扰。整体平滑度差;参照图2。

最新回复(0)