一、总体思路介绍:
限幅平均滤波算法由 限幅滤波算法 + 递推平均滤波算法组合而成,同时具备限幅滤波和递推平均滤波算法两种优势,能够对输入波形进行限幅+递推平均滤波运算,抗干扰能力强。
二、限幅滤波算法介绍:
对于连续两次采集到的数据来说:
1、如果第一次的采集数据与第二次的数据差值大于最大偏差值:则认定第二次采集的数据有误,不予记录,并默认第一次采集的数据是第二次的数据。
2、如果第一次采集数据与第二次的数据差值小于最大偏差值:则认定第二次采集的数据有效,对第二次采集的数据进行保存。
三、递推平均滤波算法介绍:
对于采集到的数据来说:将所有采集到的数据存放到一个数组(这里是容量为20的数组),将采集到的20个数据进行平均运算,输出平均值。如果有新的数据产生,则将最新的数据替换掉最旧的数据,是先进先出的一个思路,以此保证数据更新的实时性。
四、限幅平均滤波算法介绍:
先对采集到的数据进行一个限幅滤波处理,将处理结果作为输入数据给到递推平均滤波处理,滤波后的结果就是限幅平均滤波算法的结果。
五、代码实现:
1、限幅滤波
//限幅滤波
struct clipping_filter
{
unsigned char in_data;//输入的数据
unsigned char old_data;//上一次的数据
unsigned char max_deifference_value;//差值
unsigned char out_data;//生效的数据
};
//限幅滤波运算
unsigned char clipping_filter_run(struct clipping_filter *object)
{
if(((object -> in_data - object -> old_data) > object -> max_deifference_value) || ((object -> old_data - object -> in_data) > object -> max_deifference_value))
{
object -> out_data = object -> old_data;//让旧值生效
}
else
{
object -> old_data = object -> in_data;//新值变旧值
object -> out_data = object -> in_data;//让新值生效
}
return(object -> out_data);
}
2、递推平均滤波
//递推平均滤波结构体
struct recursive_average
{
unsigned char in_data;//输入的数据
unsigned char data_num;//替换哪一位的数据
unsigned char data[20];//存放数据,最多放20个
unsigned int sum;//总和
unsigned char out_value;//平均值
};
//递推平均滤波运算
unsigned char recursive_average_run(struct recursive_average *object)
{
object -> data[object -> data_num] = object -> in_data;//将新值覆盖掉数组中的一个数据
if(object -> data_num >= 0 && object -> data_num < 19) object -> data_num++;
else object -> data_num = 0;
//计算平均值
object -> sum = 0;//清空总和
for(unsigned char loop = 0; loop < 20; loop++)
{
object -> sum += object -> data[loop];//计算总和
}
object -> out_value = (object -> sum / 20);//取平均值
return (object -> out_value);
}
3、限幅平均滤波
//限幅平均滤波算法 : 限幅 + 递推平均滤波算法
struct limiting_average
{
unsigned char in_data;//输入的数据
unsigned char max_deifference_value;//限幅差值
unsigned char out_data;//输出的数据
struct clipping_filter cliaverage;//限幅结构体
struct recursive_average average;//递推平均结构体
};
//限幅平均滤波运算
unsigned char limiting_average_run(struct limiting_average *object)
{
object -> cliaverage.max_deifference_value = object -> max_deifference_value;//将限幅最大值给到限幅结构体
object -> cliaverage.in_data = object -> in_data;//将数据读入限幅结构体
object -> average.in_data = clipping_filter_run(&(object -> cliaverage));//启动限幅运算,将运算结果给到递推平均滤波函数
object -> out_data = recursive_average_run(&(object -> average));//读出结果
return(object -> out_data);
}
六、使用示范:
int main()
{
unsigned char num = 0;//采集到的数据
unsigned char adc_value;//运算结果
struct limiting_average adc;//定义一个运算对象
adc.max_deifference_value = 30;//限幅30
while(1)
{
adc.in_data = ++num;//输入读取到的数据
adc_value = limiting_average_run(&adc);//读出运算结果
}
}