两种常用AD转换数字滤波方法

核心思想是多次样本求平均值,在求平均值之前剔除掉干扰值。干扰值一般是最大或最小,当然还可以扩大范围,将次大次小值也进行剔除。
递推中位值滤波法还可以演变成即时的,获取AD值后立即处理,不进行缓存,进一步节省空间。
1、中位值平均滤波法(又称防脉冲干扰平均滤波法)

/********************************************
说明:采一组队列去掉最大值和最小值
优点:融合了两种滤波的优点。对于偶然出现的脉冲性干扰,可消
除有其引起的采样值偏差。对周期干扰有良好的抑制作用,
平滑度高,适于高频振荡的系统。
缺点:测量速度慢
*********************************************/

#define N 12

uchar filter()

{
  unsigned char i,j,k,l;
  unsigned char temp,sum=0,value;
  unsigned char value_buf[N],;

  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];

  value = sum/(N-2);
  return(value);
}

2、递推中位值滤波法
/************************************************
优点:对于偶然出现的脉冲性干扰,可消除由其引起的采样值偏差。
对周期性干扰有良好的抑制作用,平滑度高;试用于高频振荡
的系统
缺点:测量速度慢
*************************************************/

char filter(char new_data,char queue[],char n)
{
  char max,min;
  char sum;
  char i;

  queue[0]=new_data;
  max=queue[0];
  min=queue[0];
  sum=queue[0];

  for(i=n-1;i>0;i--)
  {
    if(queue[i]>max)
    max=queue[i];
    else if (queue[i]<min)
    min=queue[i];
    sum=sum+queue[i];
    queue[i]=queue[i-1];
  }

  i=n-2;
  sum=sum-max-min+i/2;     //说明:+i/2的目的是为了四舍五入
  sum=sum/i;

  return(sum);
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ydgd118

您的鼓励是我最大的动力!谢赏!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值