10种常用滤波算法特点及例程 | 您所在的位置:网站首页 › 简述滑动平均法的基本原理 › 10种常用滤波算法特点及例程 |
文章目录
1. 限幅滤波法(1)原理(2)特点(3)例程
2. 中位值滤波法(1)原理(2)特点(3)例程
3. 算术平均滤波法(1)原理(2)说明(3)特点(4)例程
4. 递推平均滤波法(1)原理(2)特点(3)例程
5. 中位值平均滤波法(1)原理(2)特点(3)例程
6. 限幅平均滤波法(1)原理(2)特点(3)例程
7. 加权递推平均滤波法(1)原理(2)特点(3)例程
8. 消抖滤波法(1)原理(2)特点(3)例程
9. 限幅消抖滤波法(1)原理(2)特点(3)例程
10. 一阶滞后滤波法(1)原理(2)特点(3)例程
1. 限幅滤波法
(1)原理
通过给定的最大偏差值A来实现,如果本次值与上次差值 int filter_buf[FILTER_N]; int i, j; int filter_temp; for(i = 0; i for(i = 0; i filter_temp = filter_buf[i]; filter_buf[i] = filter_buf[i + 1]; filter_buf[i + 1] = filter_temp; } } } return filter_buf[(FILTER_N - 1) / 2]; } 3. 算术平均滤波法 (1)原理 连续采用N个值进行算数平均运算 (2)说明N值较大时:信号平滑度较高,但灵敏度较低; N值较小时:信号平滑度较低,但灵敏度较高; N值的选取:一般流量,N=12;压力:N=4 (3)特点 优点:适合对一般具有随机干扰的信号(即信号在某一数据范围附近上下波动)进行滤波缺点:不适合待测量变换较快或要求数据计算速度较快的实时控制,较浪费RAM (4)例程 int Filter_Value; // 算术平均滤波法 #define FILTER_N 12 int Filter() { int i; int filter_sum = 0; for(i = 0; i char count = 0; int sum = 0; value_buf[i++] = get_ad(); if(i == N) { i = 0; //先进先出 } for(count = 0; count char i = 0, j = 0, temp = 0; char value_buf[N]; int sum = 0; for(i = 0; i for(i = 0; i temp = value_buf[i]; value_buf[i] = value_buf[i + 1]; value_buf[i + 1] = temp; } } } for(i = 1; i 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12}; char sum_coe = 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 + 11 + 12; char filter(void) { char i = 0; char value_buf[N]; int sum = 0; for(i = 0; i sum += value_buf[i] * coe[i]; } return (char)(sum / sum_coe); } 8. 消抖滤波法 (1)原理 设置一个滤波计数器,将每次采样值与当前有效值比较;如果采样值=当前有效值,计数器清零;如果不相等,则计数器+1,并判断计数器是否溢出;如果计数器溢出,则将本次值替换当前有效值,并清零计数器; (2)特点 优点:对待测量缓慢变化的参数有较好滤波效果,可避免在临界值附近控制器的反复开关跳动或者显示器上数字抖动;缺点:不适于快速变化的参数测量,如果计数器溢出的采样恰好是干扰值,则会将干扰值当做有效值引入系统; (3)例程 #define N 12 char filter(void) { char i = 0; char new_value = 0, value = 0; new_value = get_ad(); while(value != new_value) { i++; if(i > N) { return new_value; } delay(); new_value = get_ad(); } return value; } 9. 限幅消抖滤波法 (1)原理相当于“限幅滤波法”+“消抖滤波法”; 先限幅,后消抖。 (2)特点 优点:继承了“限幅”和“消抖”的优点,改进了“消抖滤波法”中的某些缺陷,避免将干扰值导入系统;缺点:不适合待测量变换快速的场合 (3)例程 int Filter_Value; int Value; // 限幅消抖滤波法 #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; } 10. 一阶滞后滤波法 (1)原理取 α = ( 0 , 1 ) α=(0,1) α=(0,1), f i l t e r d a t a = ( 1 − α ) 本 次 采 样 值 + α 上 次 滤 波 结 果 filter_{data} = (1-\alpha)本次采样值+\alpha 上次滤波结果 filterdata=(1−α)本次采样值+α上次滤波结果 (2)特点 优点:对周期性干扰具有良好的抑制作用,适合波动频率较高的场合;缺点:有相位滞后,灵敏度低,滞后程度取决于α的值,不能消除滤波频率高于采样频率1/2的干扰信号 (3)例程 int Filter_Value; int Value; // 一阶滞后滤波法 #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; }本文转自临远科技-熊冰乎文五大滤波算法原理、场景及实践及嵌入式基地乎文常见的滤波算法(C语言),侵权请联系 |
CopyRight 2018-2019 实验室设备网 版权所有 |