// 一阶滞后滤波法 #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; }