原创 【转】10种软件滤波方法的示例程序(程序匠人大作)

2007-10-6 01:55 6803 12 12 分类: MCU/ 嵌入式

本帖有“程序匠人”操刀,据说红遍大江南北啊!


 


假定从8位AD中读取数据(如果是更高位的AD可定义数据类型为int),子程序为get_ad();


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


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


#define N 12


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


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


char value_buf[N];
char i="0";


char filter()
{
char count;
int sum="0";
value_buf[i++] = get_ad();
if ( i == N ) i = 0;
for ( count="0";countsum = value_buf[count];
return (char)(sum/N);
}


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


char filter()
{
char count,i,j;
char value_buf[N];
int sum="0";
for (count=0;count{
value_buf[count] = get_ad();
delay();
}
for (j=0;j{
for (i=0;i{
if ( value_buf>value_buf[i+1] )
{
temp = value_buf;
value_buf = value_buf[i+1];
value_buf[i+1] = temp;
}
}
}
for(count=1;countsum += value[count];
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[N] = {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[N];
int sum="0";
for (count=0,count{
value_buf[count] = get_ad();
delay();
}
for (count=0,countsum += value_buf[count]*coe[count];
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

文章评论3条评论)

登录后参与讨论

用户1469942 2011-3-12 21:02

你简直是神啊!

zwj-gg_818035047 2007-10-10 10:14

感谢 程序匠人 吧,是他/她的大作啊,嘿嘿

用户391935 2007-10-8 12:03

非常的感谢...................
相关推荐阅读
zwj-gg_818035047 2015-07-30 17:30
【**记】感受GSAT,挑战Samsung
     虽然两天前把自己卖了,但之前就收到三星的笔试通知,而且是传说中的**的GSAT,还是早早起来去感受一下GSAT!      GSAT的全程叫Glolal Samsung Aptitu...
zwj-gg_818035047 2010-11-15 20:36
LabVIEW2009新特性之一:png图片代码
LabVIEW2009发布也快一年了吧,先推荐一个比较直观的新特性——png图片代码之前在论坛交流LabVIEW程序时都必须用第三方截图工具截成jpg图片,然后上传。而下载的人呢,又需要重新在LabV...
zwj-gg_818035047 2010-11-07 10:49
好长时间没来了
好长时间没来了,果然是上班了就没时间了,或者说没心了。...
zwj-gg_818035047 2009-11-22 17:58
各大公司样片申请指南
做项目常常避免不了申请样片,原因无外这几种情况:一是片子不好买;二是太贵而又最小定量限制。现在根据自己的经验分享几家公司。分享前几个建议,一是要有正当用途,不要以为是免费午餐就滥申请;二是一般使用公司...
zwj-gg_818035047 2009-09-17 19:32
Format Date/Time String VI的注意事项
LabVIEW中Format Date/Time String VI的注意事项 注意其故事标准,比如%U是用来计算当前日期是一年中第几周的,也就是周历,但是这个周历是从第0周开始计数的,也就是说第一周...
zwj-gg_818035047 2009-05-16 15:15
LabVIEW下的串口通讯
LabVIEW下的串口通讯其实很简单的,只需要根据自己的协议做相应的处理即可。一般发送的是字节,https://static.assets-stash.eet-china.com/album/old-...
我要评论
3
12
关闭 站长推荐上一条 /2 下一条