haizhilan 发表于 2007-11-6 23:18:52

谈谈在“AD数据采集”的时候大家采用什么方式的“数字滤波”!!---收集的部分“软件滤波程

10种软件滤波方法的示例程序


1、限副滤波
/* A值可根据实际情况调整
value为有效值,new_value为当前采样值
滤波程序返回有效的实际值 */
#define A 10

char value;

char filter()
{
char new_value;
new_value = get_ad();
if ( ( new_value - value > A ) || ( value - new_value > A )
return value;
return new_value;

}

2、中位值滤波法
/* N值可根据实际情况调整
排序采用冒泡法*/
#define N 11

char filter()
{
char value_buf;
char count,i,j,temp;
for ( count=0;count<N;count++)
{
value_buf = get_ad();
delay();
}
for (j=0;j<N-1;j++)
{
for (i=0;i<N-j;i++)
{
if ( value_buf>value_buf )
{
temp = value_buf;
value_buf = value_buf;
value_buf = temp;
}
}
}
return value_buf[(N-1)/2];
}

3、算术平均滤波法
/*
*/

#define N 12

char filter()
{
int sum = 0;
for ( count=0;count<N;count++)
{
sum + = get_ad();
delay();
}
return (char)(sum/N);
}

4、递推平均滤波法(又称滑动平均滤波法)
/*
*/
#define N 12

char value_buf;
char i=0;

char filter()
{
char count;
int sum=0;
value_buf = get_ad();
if ( i == N ) i = 0;
for ( count=0;count<N,count++)
sum = value_buf;
return (char)(sum/N);
}

5、中位值平均滤波法(又称防脉冲干扰平均滤波法)
/*
*/
#define N 12

char filter()
{
char count,i,j;
char value_buf;
int sum=0;
for (count=0;count<N;count++)
{
value_buf = get_ad();
delay();
}
for (j=0;j<N-1;j++)
{
for (i=0;i<N-j;i++)
{
if ( value_buf>value_buf )
{
temp = value_buf;
value_buf = value_buf;
value_buf = temp;
}
}
}
for(count=1;count<N-1;count++)
sum += value;
return (char)(sum/(N-2));
}

6、限幅平均滤波法
/*
*/
略 参考子程序1、3

7、一阶滞后滤波法
/* 为加快程序处理速度假定基数为100,a=0~100 */

#define a 50

char value;

char filter()
{
char new_value;
new_value = get_ad();
return (100-a)*value + a*new_value;
}

8、加权递推平均滤波法
/* coe数组为加权系数表,存在程序存储区。*/

#define N 12

char code coe = {1,2,3,4,5,6,7,8,9,10,11,12};
char code sum_coe = 1+2+3+4+5+6+7+8+9+10+11+12;

char filter()
{
char count;
char value_buf;
int sum=0;
for (count=0,count<N;count++)
{
value_buf = get_ad();
delay();
}
for (count=0,count<N;count++)
sum += value_buf*coe;
return (char)(sum/sum_coe);
}

9、消抖滤波法

#define N 12

char filter()
{
char count=0;
char new_value;
new_value = get_ad();
while (value !=new_value);
{
count++;
if (count>=N) return new_value;
delay();
new_value = get_ad();
}
return value;
}

10、限幅消抖滤波法
/*
*/
略 参考子程序1、9




1、限幅滤波法(又称程序判断滤波法)
A、方法:
根据经验判断,确定两次采样允许的最大偏差值(设为A)
每次检测到新值时判断:
如果本次值与上次值之差<=A,则本次值有效
如果本次值与上次值之差>A,则本次值无效,放弃本次值,用上次值代替本次值
B、优点:
能有效克服因偶然因素引起的脉冲干扰
C、缺点
无法抑制那种周期性的干扰
平滑度差

2、中位值滤波法
A、方法:
连续采样N次(N取奇数)
把N次采样值按大小排列
取中间值为本次有效值
B、优点:
能有效克服因偶然因素引起的波动干扰
对温度、液位的变化缓慢的被测参数有良好的滤波效果
C、缺点:
对流量、速度等快速变化的参数不宜

3、算术平均滤波法
A、方法:
连续取N个采样值进行算术平均运算
N值较大时:信号平滑度较高,但灵敏度较低
N值较小时:信号平滑度较低,但灵敏度较高
N值的选取:一般流量,N=12;压力:N=4
B、优点:
适用于对一般具有随机干扰的信号进行滤波
这样信号的特点是有一个平均值,信号在某一数值范围附近上下波动
C、缺点:
对于测量速度较慢或要求数据计算速度较快的实时控制不适用
比较浪费RAM

4、递推平均滤波法(又称滑动平均滤波法)
A、方法:
把连续取N个采样值看成一个队列
队列的长度固定为N
每次采样到一个新数据放入队尾,并扔掉原来队首的一次数据.(先进先出原则)
把队列中的N个数据进行算术平均运算,就可获得新的滤波结果
N值的选取:流量,N=12;压力:N=4;液面,N=4~12;温度,N=1~4
B、优点:
对周期性干扰有良好的抑制作用,平滑度高
适用于高频振荡的系统
C、缺点:
灵敏度低
对偶然出现的脉冲性干扰的抑制作用较差
不易消除由于脉冲干扰所引起的采样值偏差
不适用于脉冲干扰比较严重的场合
比较浪费RAM

5、中位值平均滤波法(又称防脉冲干扰平均滤波法)
A、方法:
相当于“中位值滤波法”+“算术平均滤波法”
连续采样N个数据,去掉一个最大值和一个最小值
然后计算N-2个数据的算术平均值
N值的选取:3~14
B、优点:
融合了两种滤波法的优点
对于偶然出现的脉冲性干扰,可消除由于脉冲干扰所引起的采样值偏差
C、缺点:
测量速度较慢,和算术平均滤波法一样
比较浪费RAM


6、限幅平均滤波法
A、方法:
相当于“限幅滤波法”+“递推平均滤波法”
每次采样到的新数据先进行限幅处理,
再送入队列进行递推平均滤波处理
B、优点:
融合了两种滤波法的优点
对于偶然出现的脉冲性干扰,可消除由于脉冲干扰所引起的采样值偏差
C、缺点:
比较浪费RAM

7、一阶滞后滤波法
A、方法:
取a=0~1
本次滤波结果=(1-a)*本次采样值+a*上次滤波结果
B、优点:
对周期性干扰具有良好的抑制作用
适用于波动频率较高的场合
C、缺点:
相位滞后,灵敏度低
滞后程度取决于a值大小
不能消除滤波频率高于采样频率的1/2的干扰信号

8、加权递推平均滤波法
A、方法:
是对递推平均滤波法的改进,即不同时刻的数据加以不同的权
通常是,越接近现时刻的数据,权取得越大。
给予新采样值的权系数越大,则灵敏度越高,但信号平滑度越低
B、优点:
适用于有较大纯滞后时间常数的对象
和采样周期较短的系统
C、缺点:
对于纯滞后时间常数较小,采样周期较长,变化缓慢的信号
不能迅速反应系统当前所受干扰的严重程度,滤波效果差

9、消抖滤波法
A、方法:
设置一个滤波计数器
将每次采样值与当前有效值比较:
如果采样值=当前有效值,则计数器清零
如果采样值<>当前有效值,则计数器+1,并判断计数器是否>=上限N(溢出)
如果计数器溢出,则将本次值替换当前有效值,并清计数器
B、优点:
对于变化缓慢的被测参数有较好的滤波效果,
可避免在临界值附近控制器的反复开/关跳动或显示器上数值抖动
C、缺点:
对于快速变化的参数不宜
如果在计数器溢出的那一次采样到的值恰好是干扰值,则会将干扰值当作有效值导
入系统

10、限幅消抖滤波法
A、方法:
相当于“限幅滤波法”+“消抖滤波法”
先限幅,后消抖
B、优点:
继承了“限幅”和“消抖”的优点
改进了“消抖滤波法”中的某些缺陷,避免将干扰值导入系统
C、缺点:
对于快速变化的参数不宜

zhanjay 发表于 2007-11-7 00:39:03

收藏

221008 发表于 2007-11-7 08:06:39

顶!

glen_cao 发表于 2007-11-7 14:48:43

太好了,顶

SingleCPU 发表于 2007-11-9 23:08:31

顶起来啊,好资料,收下了

zzh9902 发表于 2007-11-9 23:33:08

好资料!下了。

hhrfjz 发表于 2008-3-20 15:09:46

记号

my2jia 发表于 2008-3-20 17:15:28

Mark

zldiy 发表于 2008-3-30 10:45:44

谢谢,正好用到这样资料

bjj9217 发表于 2008-3-30 14:50:51

记号

wxws 发表于 2008-3-30 15:14:40

++

loves123 发表于 2008-4-2 22:08:14

这个是个好东西啊.呵呵

sunny99 发表于 2008-5-6 15:15:43

正好用到,谢谢LZ了,^_^

bb88bb 发表于 2008-5-7 02:15:51

哦,是老帖子。一翻,居然是07年的拉。但最近正好用得上,这正是我要找的资料,多谢楼主,也多谢站长阿莫。

spy2008 发表于 2008-5-7 09:04:19

mark

qjghj 发表于 2008-5-7 11:25:28

收到!

suncq 发表于 2008-5-7 11:50:52

收下!谢谢

ddcour 发表于 2008-5-7 19:46:19

在这碰熟人了,哈哈!

xj_1232005 发表于 2008-5-7 19:56:05

好,

zc3909 发表于 2008-5-7 21:40:17

很好,顶了

bigflower 发表于 2008-7-8 10:19:39

注意网上所有关于10种软件滤波的例子中关于冒泡法都有问题!
源程序如下:

/*2、中位值滤波法
N值可根据实际情况调整
排序采用冒泡法*/

#define N 11
char filter()
{
        char value_buf;
        char count,i,j,temp;
        for ( count=0;count<N;count++)
        {
                value_buf = get_ad();
                delay();
        }
        for (j=0;j<N-1;j++)
        {
                for (i=0;i<N-j;i++)
                {
                        if ( value_buf>value_buf )
                        {
                                temp = value_buf;
                                value_buf = value_buf;
                                value_buf = temp;
                        }
                }
        }
return value_buf[(N-1)/2];
}


假设N=10,初始j=0,则第一次循环i=0到N-j-1即0-9,但是程序中有value_buf = temp;
当i=9时value_buf就是value_buf,数组的下标超出范围(0-9)了,会冲到其他的RAM数据,很容易出错的。

bigflower 发表于 2008-7-8 10:26:02

刚才作了试验
把for (i=0;i<N-j;i++) 改为for (i=0;i<N-j-1;i++) 就可以了

duqinglin 发表于 2008-7-8 12:34:11

谢谢!!!

devahb 发表于 2008-7-8 12:45:41

收藏了

fuqiang4343 发表于 2008-7-9 13:07:14

mark

friendljy 发表于 2008-7-9 13:26:00

mark

jofe 发表于 2008-7-9 13:32:43

记号

ywl0409 发表于 2008-7-9 13:56:36

//冒泡法排序
for(int i=0; i<d.Length; i++)
{
   for(int j=i+1; j<d.Length; j++)
    if(d<d)
    {
   temp = d;
   d=d;
   d=temp;
    }
   }

mfm123 发表于 2008-7-9 15:02:00

收藏

gerbee 发表于 2008-7-9 17:33:46

很有用的东西啊

hangba 发表于 2008-7-10 15:26:44

MARK

kebaojun305 发表于 2008-7-10 17:55:16

这个确实很有用。收藏

tdmi 发表于 2008-7-11 06:53:26

谢谢!

ahfong2006 发表于 2008-7-11 08:11:52

mark.

avrgcc 发表于 2008-7-13 11:58:03

感谢分享

zhao_123456 发表于 2008-7-13 15:25:34

第五个少变量吧!

liujinlin109 发表于 2008-7-15 20:32:43

好帖子   
本人喜欢加权滤波

meilicaihong 发表于 2008-7-16 10:32:33

记号,谢谢lz

chhaich 发表于 2008-7-16 22:32:53

好贴子

indi 发表于 2008-9-9 09:49:08

good

lcxzhwn 发表于 2008-9-22 20:45:02

好东西&nbsp;&nbsp;谢谢啊

zb2008 发表于 2008-9-22 21:54:58

收下,谢谢
.

ylei12 发表于 2008-9-22 22:31:05

收藏

12F675 发表于 2008-9-22 22:58:43

MARK

knight_avr 发表于 2008-9-23 08:20:25

滑移+加权+去峰值&nbsp;滤波在AD采集时&nbsp;效果最好
我一直是这样用的&nbsp;反映够快(应为有加权&nbsp;而不是&nbsp;求平均值)&nbsp;而且稳定(应为有滑移和去峰值)

haizhilan 发表于 2008-9-23 15:13:05

楼上的朋友给个例子看看!

yaogang 发表于 2008-9-23 15:24:27

学习

ctstc 发表于 2008-9-23 15:46:52

帖子虽好,单还要灵活应用。

ylei12 发表于 2008-10-17 23:08:41

好帖啊,宝贵资料

liujinlin109 发表于 2008-10-17 23:28:57

good

alongy 发表于 2008-10-18 12:00:51

我正好也在做这个方面,谢谢楼主了

12F675 发表于 2008-10-18 22:23:35

MARK

jemmy 发表于 2008-10-20 16:28:25

虽然是老帖,但很有用,save&nbsp;as&nbsp;收藏。

SkyCode 发表于 2008-10-20 17:48:05

学习了&nbsp;

thomasdu 发表于 2008-10-20 18:10:12

高速才是王道,有空改成汇编........

phil 发表于 2008-10-28 11:31:16

学习一下。。谢谢了

indi 发表于 2008-10-28 16:18:47

vere&nbsp;excellent

zhl19831028 发表于 2008-12-18 10:23:29

解我所急,谢谢啦

wxdx8320 发表于 2009-1-5 17:28:35

Mark&nbsp;

xiaog0219 发表于 2009-1-5 18:36:53

mark

a105 发表于 2009-2-18 22:22:35

mark

anson 发表于 2009-2-19 00:59:04

留名

ddaitt999 发表于 2009-2-19 21:10:45

强帖,支持

lk546 发表于 2009-2-19 21:26:18

mark,支持ing

ndust 发表于 2009-2-19 21:45:39

jh

sunmy 发表于 2009-2-21 10:41:17

学习!

shamork 发表于 2009-3-5 18:42:50

mark

bbi3014 发表于 2009-3-5 19:26:54

mark

hanbao0371 发表于 2009-3-5 20:38:15

好东西啊,不顶不行啊,谢谢楼主分享啊

12F675 发表于 2009-3-6 20:33:27

MARK

nicksean 发表于 2009-3-6 21:50:57

mark

346675655 发表于 2009-3-7 09:43:36

顶起来!!!!

livanfield 发表于 2009-3-7 17:00:43

很好!
本来以为滤波是一种高深的数学问题(用到微积分)
没想到普通的数学也能得到这么好的应用!
要是能够举几个具体的应用例子就更好了!

sino_design 发表于 2009-3-9 00:00:50

学习了

edaworld 发表于 2009-3-9 07:43:10

mark!

dszx 发表于 2009-3-9 07:51:48

我顶顶顶。。。

deepin 发表于 2009-3-9 09:10:39

学习了
MARK

C.Ronaldo 发表于 2009-3-11 00:41:20

好东西

cuhon 发表于 2009-5-15 19:40:57

mark

lileistone 发表于 2009-5-15 20:28:24

怎么这么眼熟……貌似是匠人的帖子转过来了~~

cowboy 发表于 2009-5-16 01:06:36

学习了,MARK.

lijie1116 发表于 2009-5-16 06:09:21

不错,谢谢了

382383706 发表于 2009-5-16 19:34:32

收藏

fandipeng412 发表于 2009-5-16 20:07:02

好东西啊,呵呵

homemyc 发表于 2009-5-16 20:59:15

好东西

wkxu 发表于 2009-5-18 20:39:43

顶!

wkxu 发表于 2009-5-18 20:41:07

mark!

hc235280 发表于 2009-5-31 09:38:50

留名学习,

avr-arm 发表于 2009-5-31 09:41:00

收藏   很好!!!

plantniu 发表于 2009-5-31 09:49:06

mark

kelos3000 发表于 2009-5-31 10:44:59

biao qi

xyz2008 发表于 2009-5-31 10:53:16

mark

ba1731 发表于 2009-5-31 11:11:58

mark过没有。忘了。。那就mark一下

ztom 发表于 2009-5-31 13:03:50

马克

ag_wang 发表于 2009-7-13 14:52:39

记号

qilin3 发表于 2009-11-1 17:16:23

很好

2nd090215 发表于 2009-11-1 18:52:17

标记

ndust 发表于 2009-11-1 20:28:10

jh

rayingpx 发表于 2009-11-1 22:52:56

在匠人的书中看到过,谢谢共享!

laolu 发表于 2009-11-1 23:19:14

看不懂也要先收下
页: [1] 2 3 4
查看完整版本: 谈谈在“AD数据采集”的时候大家采用什么方式的“数字滤波”!!---收集的部分“软件滤波程