嵌入式开发10种常见数字滤波算法(3)

// 一阶滞后滤波法 #define FILTER_A 0.01 int Filter() { int NewValue; NewValue = Get_AD(); Value = (int)((float)NewValue * FILTER_A + (1.0 - FILTER_A) * (float)Value); return Value; }

八、加权递推平均滤波法

A、方法:

是对递推平均滤波法的改进,即不同时刻的数据加以不同的权

通常是,越接近现时刻的数据,权取得越大。

给予新采样值的权系数越大,则灵敏度越高,但信号平滑度越低

B、优点:

适用于有较大纯滞后时间常数的对象

和采样周期较短的系统

C、缺点:

对于纯滞后时间常数较小,采样周期较长,变化缓慢的信号

不能迅速反应系统当前所受干扰的严重程度,滤波效果差

// 加权递推平均滤波法 #define FILTER_N 12 int coe[FILTER_N] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12}; // 加权系数表 int sum_coe = 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 + 11 + 12; // 加权系数和 int filter_buf[FILTER_N + 1]; int Filter() { int i; int filter_sum = 0; filter_buf[FILTER_N] = Get_AD(); for(i = 0; i < FILTER_N; i++) { filter_buf[i] = filter_buf[i + 1]; // 所有数据左移,低位仍掉 filter_sum += filter_buf[i] * coe[i]; } filter_sum /= sum_coe; return filter_sum; }

九、消抖滤波法

A、方法:

设置一个滤波计数器

将每次采样值与当前有效值比较:

如果采样值=当前有效值,则计数器清零

如果采样值<>当前有效值,则计数器+1,并判断计数器是否>=上限N(溢出)

如果计数器溢出,则将本次值替换当前有效值,并清计数器

B、优点:

对于变化缓慢的被测参数有较好的滤波效果,

可避免在临界值附近控制器的反复开/关跳动或显示器上数值抖动

C、缺点:

对于快速变化的参数不宜

如果在计数器溢出的那一次采样到的值恰好是干扰值,则会将干扰值当作有效值导入系统

// 消抖滤波法 #define FILTER_N 12 int i = 0; int Filter() { int new_value; new_value = Get_AD(); if(Value != new_value) { i++; if(i > FILTER_N) { i = 0; Value = new_value; } } else i = 0; return Value; }

十、限幅消抖滤波法

A、方法:

相当于“限幅滤波法”+“消抖滤波法”

先限幅,后消抖

B、优点:

继承了“限幅”和“消抖”的优点

改进了“消抖滤波法”中的某些缺陷,避免将干扰值导入系统

C、缺点:

对于快速变化的参数不宜

// 限幅消抖滤波法 #define FILTER_A 1 #define FILTER_N 5 int i = 0; int Filter() { int NewValue; int new_value; NewValue = Get_AD(); if(((NewValue - Value) > FILTER_A) || ((Value - NewValue) > FILTER_A)) new_value = Value; else new_value = NewValue; if(Value != new_value) { i++; if(i > FILTER_N) { i = 0; Value = new_value; } } else i = 0; return Value; }

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/3e86f5c0e45883975d0c60aae677cb32.html