学习:通用软件滤波算法-限幅滤波法
程序员文章站
2022-04-14 21:06:36
...
一、处理思想
设置前后两次数据可允许的最大偏差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。