打印
[AVR单片机]

十种软件滤波方法

[复制链接]
2248|8
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
suoma|  楼主 | 2009-12-28 23:22 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 suoma 于 2009-12-31 21:50 编辑

//软件滤波是常用的滤波方式之以,此处提供十种滤波方法,任你选择

CODE:

#define get_ad() 10
extern void delay(void);
/*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;
  else return new_value;

}

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

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

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

#define N 12
char filter()
{
  char count,i,j,temp;
  char value_buf[N];
  int sum=0;
  for (count=0;count<N;count++)
  {
    value_buf[count] = get_ad();
    delay();
  }
  for (j=0;j<N-1;j++)
  {
    for (i=0;i<N-j;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;count<N-1;count++)
  sum += value_buf[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 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()
{
  char count;
  char value_buf[N];
  int sum=0;
  for (count=0;count<N;count++)
  {
    value_buf[count] = get_ad();
    delay();
  }
  for (count=0;count<N;count++)
  sum += value_buf[count]*coe[count];
  return (char)(sum/sum_coe);
}


/*9、消抖滤波法*/
char value;
#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 */

转载,滤波小程序可以看看

相关帖子

沙发
thf2008| | 2009-12-29 00:44 | 只看该作者
好东西,谢谢LZ分享

使用特权

评论回复
板凳
thf2008| | 2009-12-29 00:45 | 只看该作者
大赞一下LZ,能找到这么好的东西

使用特权

评论回复
地板
suoma|  楼主 | 2009-12-31 21:48 | 只看该作者
sorry,又出斜体了

使用特权

评论回复
5
huamunv| | 2010-1-1 22:35 | 只看该作者
一直搞不明白滤波的合理性

使用特权

评论回复
6
gegegegeda| | 2013-4-5 16:34 | 只看该作者
马克

使用特权

评论回复
7
qin552011373| | 2013-4-7 22:46 | 只看该作者
很经典  程序匠人书里面就是这些

使用特权

评论回复
8
cclgxuanshao| | 2013-4-8 16:29 | 只看该作者
虽然不是很懂,帮顶

使用特权

评论回复
9
qin552011373| | 2013-4-8 20:28 | 只看该作者
cclgxuanshao 发表于 2013-4-8 16:29
虽然不是很懂,帮顶

主要用于ad采样的  以后会接触的

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

82

主题

714

帖子

5

粉丝