[应用相关] 10种软件滤波算法(转载)

[复制链接]
2043|7
 楼主| cztqwa 发表于 2015-11-30 10:59 | 显示全部楼层 |阅读模式
本帖最后由 cztqwa 于 2015-11-30 11:01 编辑

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

二、中位值滤波法
1、连续采样N次值,把采样值按大小排列,取中间值为本次有效值。
2、例程
  1. #define N 9
  2. unchar MiddleValueFilter()
  3. {
  4. unchar i,j,k;
  5. uchar temp;
  6. uchar ArrDataBuffer[N];
  7. for(i=0;i<N;i++)  //一次采集N个数据放入数组中
  8. {
  9.                  ArrDataBuffer=GetAD();
  10.                   Delay();
  11. }
  12. for(j=0;j<N-1;j++)//采样值由小到大排列
  13. {
  14.                  for(k=0;k<N-j-1;k++)
  15.                   {
  16.                             if(ArrDataBuffer[k]>ArrDataBuffer[k+1])
  17.                             {
  18.                               temp=ArrDataBuffer[k];
  19.                               ArrDataBuffer[k]=ArrDataBuffer[k+1];
  20.                               ArrDataBuffer[k+1]=temp;
  21.                     }
  22.                   }
  23. }
  24. return(ArrDataBuffer[(N-1)/2]);        //取中间值
  25. }


三、算术平均滤波法
1、连续取N个值进行算术平均运算。
N较大时,信号平滑度较高,但灵敏度较低;N较小,信号平滑度低,但灵敏度较高。
2、例程
  1. #define N 12
  2. uchar ArithmeticalAverageValueFilter()
  3. {
  4. uchar i;
  5. uchar Value;
  6. uchar sum;
  7. sum=0;
  8. for(i=0;i<N;i++)
  9. {
  10.     sum+=GetAD();
  11.     Delay();
  12. }
  13. Value=sum/N;
  14. return(Value);
  15. }

四、递推平均滤波法
1、把连续N个采集值看成一个队列,每次采集到的新数据放入队尾,并扔掉原来队首的数据。把队列中的N个数据进行平均计算,即可获得新的滤波结果。
2、例程
  1. #define N 12
  2. uchar Data[];
  3. uchar Gilde(Data[])
  4. {
  5.         ucahr i,Value,sum;
  6. sum=0;
  7. Data[N]=GetAD();
  8. for(i=0;i<N;i++)
  9. {
  10.                   Data=Data[i+1];//所有数据左移,低位仍掉
  11.                   sum+=Data;
  12. }
  13. Value=sum/N;
  14. return(Value);
  15. }

五、中位值平均滤波法
1、中位值平均滤波法又称脉冲干扰平均滤波法,相当于“中位值滤波法”+“算术平均滤波法”。
连续采集N个数据,去掉一个最大和最小值,然后计算N-2个数的平均值。
2、例程
  1. #define N 12
  2. uchar Middle()
  3. {
  4. ucahr i,j,k,l;
  5. uchar temp;
  6. uchar ArrDataBuffer[N];
  7. uchar sum,Value;
  8. for(i=0;i<N;i++)//一次采集N个数据,存入数组
  9. {
  10.         ArrDataBuffer=GetAD();
  11.         Delay();
  12. }
  13. for(j=0;j<N-1;j++)//采样值由小到大排列
  14. {
  15.         for(k=0;k<N-j-1;k++)
  16.           {
  17.             if(ArrDataBuffer[k]>ArrDataBuffer[k+1])
  18.             {
  19.                       temp=ArrDataBuffer[k];
  20.                       ArrDataBuffer[k]=ArrDataBuffer[k+1];
  21.                       ArrDataBuffer[k+1]=temp;
  22.             }
  23.           }
  24. }
  25. for(l=0;l<N-1;l++)
  26. {
  27.         sum=ArrDataBuffer[l];
  28. }
  29. Value=Sum/(N-2);
  30. return(Value);
  31. }

六、递推中位值平均滤波法
1、相当于“中位值滤波法”+“递推平均滤波法”。这种方法把连续N个值看成一个队列,每次采集到一个新数据放入队尾,并扔掉原来队首的值。 把队列中的N个数据先去掉一个最大值和最小值,然后计算N-2个数据的平均值。
2、例程
  1. char Filter()
  2. {
  3. char max.min;
  4. int sum;
  5. char i;
  6. QUEUE[0]=NewData;
  7. max=QUEUE[0];
  8. min=QUEUE[0];
  9. sum=QUEUE[0];
  10. for(i=n-1;i!=0;i--)
  11. {
  12.           if(QUEUE>max)
  13.         max=QUEUE;
  14.     else if(QUEUE<min)
  15.         min=QUEUE;
  16.           sum+=QUEUE;
  17.           QUEUE=QUEUE[i-1];
  18. }
  19. i=n-2;
  20. sum=sum-max-min+i/2;//加入(n-2)/2目的为了四舍五入
  21. sum=sum/i;
  22. return(sum);
  23. }

七、限幅平均滤波法
1、相当于“限幅滤波法”+“递推平均滤波法”。每次采样先进行限幅处理,再进行队列平均滤波处理。
2、例程
  1. #define A 10
  2. #define N 12
  3. uchar Data[N];
  4. uchar Limit()
  5. {
  6.         ucahr i,Value,sum;
  7.         Data[N]=GetAD();
  8.         if(((Data[N]-Data[N-1])>A)||((Data[N-1]-Data[N])>A)))
  9.                 Data[N]=Data[N-1];
  10.         else
  11.     Data[N]=NewValue;
  12. for(i=0;i<N;i++)
  13. {
  14.                   Data=Data[i+1];
  15.                   sum+=Data;
  16. }
  17. Value=sum/N;
  18. return(Value);
  19. }

八、一阶滞后滤波法
1、本次结果滤波结果=a*本次采样值+(1-a)*上次结果。
a代表滤波系数,a=0--1。
2、例程
  1. #define a 128
  2. uchar Value;
  3. ucahr OneFactorialFiler()
  4. {
  5. uchar NewValue;
  6. uchar ReturnValue;
  7. NewValue=GetAD();
  8. ReturnValue=(255-a)*NewValue+a*Value;
  9. ReturnValue/=255;
  10. return(ReturnValue);
  11. }

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

十、消抖滤波法
1、将每次采样值与当前有效值比较,如果采样值=当前有效值,则计数器清零,否则计数器加1。然后,判断计数器是否>=上限N(溢出)。如果溢出,将本次值替换当前有效值,并清计数器。
2、例程
  1. #define N 20
  2. uchar count;
  3. uchar Value;
  4. uchar Avoid()
  5. {
  6. uchar NewValue;
  7. if(NewValue==Value)
  8.     count=0;
  9. else
  10. {
  11.                   count++;
  12.                   if(count>N)
  13.                   {
  14.                      count=0;
  15.                      Value=NewValue;
  16.                   }
  17. }
  18. return(Value);
  19. }

foxglove 发表于 2015-11-30 11:07 | 显示全部楼层
10种软件滤波算法
cooldog123pp 发表于 2015-11-30 13:14 | 显示全部楼层
这个可以有 收下了 楼主
冰河w 发表于 2015-11-30 20:54 | 显示全部楼层
不错的资料,程序有注释就更好了
淘阳光39 发表于 2015-12-1 08:43 | 显示全部楼层
软件滤波算法    高大上。。
mmuuss586 发表于 2015-12-1 09:41 | 显示全部楼层

网上有,呵呵;
小小怪下士 发表于 2015-12-4 22:51 | 显示全部楼层
以前用过,思路可以,这里的有些语法有问题
wwof3w 发表于 2015-12-6 09:16 | 显示全部楼层
收下了,学习验证,谢楼主
您需要登录后才可以回帖 登录 | 注册

本版积分规则

2

主题

33

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部