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来实现,如果本次值与上次差值<=A,则本次有效;否则无效,使用上次值代替。

(2)特点

优点:能有效克服偶然因素导致的脉冲干扰缺点:无法抑制周期性干扰,平滑性差

(3)例程

int Filter_Value;

int Value;

// 限幅滤波法(又称程序判断滤波法)

#define FILTER_A 1

int Filter() {

int NewValue;

NewValue = Get_AD();

if(((NewValue - Value) > FILTER_A) || ((Value - NewValue) > FILTER_A))

return Value;

else

return NewValue;

}

2. 中位值滤波法

(1)原理

连续采集N次值(N为奇数),将采样值按大小排列,取中间值为本次有效值

(2)特点

优点:能有效克服偶然因素导致的波动干扰,对温度等变换缓慢的被测参数有良好滤波效果缺点:不适合待测量快速变换的场合,如流量、速度等

(3)例程

int Filter_Value;

// 中位值滤波法

#define FILTER_N 101

int Filter() {

int filter_buf[FILTER_N];

int i, j;

int filter_temp;

for(i = 0; i < FILTER_N; i++) {

filter_buf[i] = Get_AD();

delay(1);

}

// 采样值从小到大排列(冒泡法)

for(j = 0; j < FILTER_N - 1; j++) {

for(i = 0; i < FILTER_N - 1 - j; i++) {

if(filter_buf[i] > filter_buf[i + 1]) {

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 < FILTER_N; i++) {

filter_sum += Get_AD();

delay(1);

}

return (int)(filter_sum / FILTER_N);

}

4. 递推平均滤波法

(1)原理

把连续N个采样值看成一个队列,队列长度固定为N,每次采样把新数据放入队尾,并扔掉队首的一次数据,把队列中的N个数据进行平均计算,即获得新的滤波值

(2)特点

优点:对周期性干扰具有良好的抑制作用,平滑度高,适合高频振荡系统;缺点:对偶然出现的脉冲性干扰的抑制作用较差,不适于脉冲干扰较严重的场合,不适于开关电源电路。

(3)例程

#define N 12

char value_buf[N];

char i = 0;

char filter(void) {

char count = 0;

int sum = 0;

value_buf[i++] = get_ad();

if(i == N) {

i = 0; //先进先出

}

for(count = 0; count < N; count++) {

sum += value_buf[count];

}

return (char)(sum / N);

}

5. 中位值平均滤波法

(1)原理

采一组队列去掉最大值和最小值

(2)特点

优点:融合了两种滤波的优点。对于偶然出现的脉冲性干扰,可消除有其引起的采样值偏差,对周期干扰有良好的抑制作用,平滑度高,适于高频振荡的系统;缺点:测量速度慢;

(3)例程

#define N 12

char filter(void) {

char i = 0, j = 0, temp = 0;

char value_buf[N];

int sum = 0;

for(i = 0; i < N; i++){

value_buf[i] = get_ad();

delay();

}

for(j = 0; j < N - 1; j++) {

for(i = 0; i < N - j; i++) {

if(value_buf[i] > value_buf[i + 1]) {

temp = value_buf[i];

value_buf[i] = value_buf[i + 1];

value_buf[i + 1] = temp;

}

}

}

for(i = 1; i < N - 1; i++) {

sum += value_buf[i];

}

return (char)(sum / (N - 2));

}

6. 限幅平均滤波法

(1)原理

限幅+平均

(2)特点

优点:融合了两种滤波法的优点,对于偶然出现的脉冲性干扰,可消除有其引起的采样值偏差;缺点:较浪费RAM

(3)例程

7. 加权递推平均滤波法

(1)原理

对递推平均滤波法的改进,即不同时刻的数据加以不同权值;通常是越接近现时刻的数据,权值越大,新采样值的权重越大,则灵敏度越高,但信号平滑度越低。

(2)特点

优点:适用于有较大纯滞后时间常数的对象,和采样周期较短的系统;缺点:对于纯滞后时间常数较小、采样周期较长、变化缓慢的信号;不能迅速反应系统当前所受干扰的严重程度,滤波效果差。

(3)例程

/* coe数组为加权系数表 */

#define N 12

char coe[N] = {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 < N; i++) {

value_buf[i] = get_ad();

delay();

}

for(i = 0; i < N; 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语言),侵权请联系

黄金推荐

手机液体镀膜怎么弄掉
365bet亚洲真人网

手机液体镀膜怎么弄掉

🕒 07-05 💰 3610
笔记本怎么连接显示器 笔记本电脑外接显示屏方法【详解】
蒸咸肉的做法
365bet亚洲真人网

蒸咸肉的做法

🕒 07-29 💰 2796