这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 嵌入式开发 » FPGA » 10种软件滤波

共11条 1/2 1 2 跳转至

10种软件滤波

助工
2014-10-30 22:11:55     打赏
《匠人手记》里的10种软件滤波,感觉不错,跟大家分享。感谢“程序匠人”的奉献。
一、限幅滤波法
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++)
  {
    ArrDataBuffer[i]=GetAD();
    Delay();
  }

  for(j=0; j<N-1;j++)
  {
    for(k=0; k<N-j;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[i]=Data[i+1];//所有数据左移,低位仍掉
    sum+=Data[i];
  }

  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++)
  {
    ArrDataBuffer[i]=GetAD();
    Delay();
  }

  for(j=0; j<N-1;j++)
  {
    for(k=0; k<N-j;k++)
    {
      if(ArrDataBuffer[k]>ArrDataBuffer[k+1])
      {
        temp=ArrDataBuffer[k];
        ArrDataBuffer[k]=ArrDataBuffer[k+1];
        ArrDataBuffer[k+1]=temp;
      }
    }
  }

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

  Value=Sum/(N-2);
  return(Value);
}

六、递推中位值平均滤波法
1、相当于“中位值滤波法”+“递推平均滤波法”。这种方法把连续N个值看成一个队列,每次采集到一个新数据放入队尾,并扔掉原来队首的值。 把队列中的N个数据先去掉一个最大值和最小值,然后计算N-2个数据的平均值。
2、例程
char Filter()
{
  char max.min;
  int sum;
  char i;
  QUEUE[0]=NewData;
  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=QUEUE[i];
    }

    sum+=QUEUE[i];
    QUEUE[i]=QUEUE[i-1];
  }

  i=n-2;
  sum=sum-max-min+i/2;//加入(n-2)/2目的为了四舍五入
  sum=sum/i;
  return(sum);
}

七、限幅平均滤波法
1、相当于“限幅滤波法”+“递推平均滤波法”。每次采样先进行限幅处理,再进行队列平均滤波处理。
2、例程
#define A 10
#define N 12
uchar Data[N];
uchar Limit()
{
  ucahr i,Value,sum;
  Data[N]=GetAD();

  if(((Data[N]-Data[N-1])>A)||((Data[N-1]-Data[N])>A))
  {
    Data[N]=Data[N-1];
  }
  else
  {
    Data[N]=NewValue;
  }

  for(i=0; i<N;i++)
  {
    Data[i]=Data[i+1];
    sum+=Data[i];
  }

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

八、一阶滞后滤波法
1、本次结果滤波结果=a*本次采样值+(1-a)*上次结果。
                    a代表滤波系数,a=0--1。
2、例程

#define a 128
uchar Value;
ucahr OneFactorialFiler()
{
  uchar NewValue;
  uchar ReturnValue;
  NewValue=GetAD();
  ReturnValue=(255-a)*NewValue+a*Value;
  ReturnValue/=255;
  return(ReturnValue);
}

九、加权递推平均滤波法
1、加权递推平均滤波法是对递推平均滤波法的改进,即不同时刻的数据加以不同的权。通常是越接近现时刻的数据,权取得越大。给予新采样值的权系数越大,则灵敏度越高,但信号的平滑度越低。
2、例程
#define N 10
#define CoeSum 55
const Coefficient[N]= {1,2,3,4,5,6,7,8,9,10};
uchar Data[N];
uchar AAGAFilter()
{
  uchar i,Value,sum;
  sum=0;
  Data[N]=GetAD();

  for(i=0; i<N;i++)
  {
    Data[i]=Data[i+1];
    sum+=Data[i]*Coefficient[i];
  }

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

十、消抖滤波法
1、将每次采样值与当前有效值比较,如果采样值=当前有效值,则计数器清零,否则计数器加1。然后,判断计数器是否>=上限N(溢出)。如果溢出,将本次值替换当前有效值,并清计数器。
2、例程
#define N 20
uchar count;
uchar Value;
uchar Avoid()
{
  uchar NewValue;

  if(NewValue==Value)
  {
    count=0;
  }
  else
  {
    count++;

    if(count>N)
    {
      count=0;
      Value=NewValue;
    }
  }

  return(Value);
}



关键词: 软件滤波    

高工
2014-11-01 13:06:48     打赏
2楼

五、中位值平均滤波法

 

最后求和的时候,应该是:

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

去掉了最大值和最小值。


高工
2014-11-01 13:28:34     打赏
3楼
还能补充点复杂的,比如巴特沃斯滤波器之类的

助工
2014-11-03 15:11:03     打赏
4楼
看得仔细哦

助工
2014-11-03 15:22:37     打赏
5楼
好想法哦

高工
2014-11-03 19:58:37     打赏
6楼
楼主继续啊

高工
2014-11-03 22:21:25     打赏
7楼

好贴要仔细看嘛,楼主继续啊,期待巴特沃兹滤波,貌似还有个切比雪夫滤波器?


菜鸟
2014-11-10 22:24:59     打赏
8楼
期待楼主继续更新。。。。巴特沃兹滤波

工程师
2014-11-10 22:34:13     打赏
9楼
软件滤波这么牛

工程师
2014-11-10 22:34:13     打赏
10楼
软件滤波这么牛

共11条 1/2 1 2 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]