首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

10种软件滤波1~5

10种软件滤波1~5

一、限幅滤波法
1、
先根据经验判断,确定两次采样允许的最大偏差值,设为A。
每次检测到新采样值时进行判断:
(1)如果本次新采样值与上一次滤波效果之差<=A,则本次采样值有效,令本次滤波结果=新采样值;
    (2)如果本次采样值与上次滤波结果之差>A,则本次采样值无效,放弃本次采样值,本次滤波结果=上次滤波结果。
2、例程
#define A 10
uchar Value;    //上次采样有效值
uchar AmplitudeLimiterFilter()
{
  uchar NewValue,ReturnValue;
  NewValue=GetAD();          //本次采样值

  if(((NewValue-Value)>A)||((Value-NewValue)>A))
  {
    ReturnValue=Value;
  }
  else
  {
    ReturnValue=NewValue;
  }

  return(ReturnValue);
}

二、中位值滤波法
1、连续采样N次值,把采样值按大小排列,取中间值为本次有效值。
2、例程
#define N 9
unchar MiddleValueFilter()
{
  unchar i,j,k;
  uchar temp;
  uchar ArrDataBuffer[N];

  for(i=0; i<N; i++) //一次采集N个数据放入数组中
  {
    ArrDataBuffer=GetAD();
    Delay();
  }

  for(j=0; j<N-1; j++) //采样值由小到大排列
  {
    for(k=0; k<N-j-1; k++)
    {
      if(ArrDataBuffer[k]>ArrDataBuffer[k+1])
      {
        temp=ArrDataBuffer[k];
        ArrDataBuffer[k]=ArrDataBuffer[k+1];
        ArrDataBuffer[k+1]=temp;
      }
    }
  }

  return(ArrDataBuffer[(N-1)/2]);//取中间值
}

三、算术平均滤波法
1、连续取N个值进行算术平均运算。
N较大时,信号平滑度较高,但灵敏度较低;N较小,信号平滑度低,但灵敏度较高。
2、例程
#define N 12
uchar ArithmeticalAverageValueFilter()
{
  uchar i;
  uchar Value;
  uchar sum;
  sum=0;

  for(i=0; i<N; i++)
  {
    sum+=GetAD();
    Delay();
  }

  Value=sum/N;
  return(Value);
}
四、递推平均滤波法
1、把连续N个采集值看成一个队列,每次采集到的新数据放入队尾,并扔掉原来队首的数据。把队列中的N个数据进行平均计算,即可获得新的滤波结果。
2、例程
#define N 12
uchar Data[];
uchar Gilde(Data[])
{
  ucahr i,Value,sum;
  sum=0;
  Data[N]=GetAD();

  for(i=0; i<N; i++)
  {
    Data=Data[i+1];//所有数据左移,低位仍掉
    sum+=Data;
  }

  Value=sum/N;
  return(Value);
}

五、中位值平均滤波法
1、中位值平均滤波法又称脉冲干扰平均滤波法,相当于“中位值滤波法”+“算术平均滤波法”。
连续采集N个数据,去掉一个最大和最小值,然后计算N-2个数的平均值。
2、例程
#define N 12
uchar Middle()
{
  ucahr i,j,k,l;
  uchar temp;
  uchar ArrDataBuffer[N];
  uchar sum,Value;

  for(i=0; i<N; i++) //一次采集N个数据,存入数组
  {
    ArrDataBuffer=GetAD();
    Delay();
  }

  for(j=0; j<N-1; j++) //采样值由小到大排列
  {
    for(k=0; k<N-j-1; k++)
    {
      if(ArrDataBuffer[k]>ArrDataBuffer[k+1])
      {
        temp=ArrDataBuffer[k];
        ArrDataBuffer[k]=ArrDataBuffer[k+1];
        ArrDataBuffer[k+1]=temp;
      }
    }
  }

  for(l=0; l<N-1; l++)
  {
    sum=ArrDataBuffer[l];
  }

  Value=Sum/(N-2);
  return(Value);
}
返回列表