紫外工控论坛

 找回密码
 立即注册

扫一扫,访问微社区

QQ登录

只需一步,快速开始

搜索
查看: 1913|回复: 0

【转】十大经典滤波算法

[复制链接]
冰糖 发表于 2011-12-30 21:27:00 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
  1. 1、限幅滤波法


  2. #define  A   10
  3. unsigned char Value
  4. unsigned char AmplitudeLimiterFilter()
  5. {
  6.    unsigned char NewValue;
  7.    unsigned char ReturnValue;
  8.    NewValue=GatAD();
  9.    if(((NewValue-Value)>A))||((Value-NewValue)>A)))
  10.    ReturnValue=Value;
  11.    else ReturnValue=NewValue;
  12.    return(ReturnValue);
  13. }


  14. 2、中位值滤波法




  15. #define N 11


  16. unsigned char MiddlevalueFilter()


  17. {
  18.   unsigned char value_buf[N];
  19.   unsigned char i,j,k,temp;
  20.   for(i=0;i<N;i++)
  21.   {
  22.     value_buf[i] = get_ad();
  23.     delay();
  24.   }
  25.   for (j=0;j<N-1;j++)
  26.   {
  27.    for (k=0;k<N-j;k++)
  28.    {
  29.     if(value_buf[k]>value_buf[k+1])
  30.      {
  31.        temp = value_buf[k];
  32.        value_buf[k] = value_buf[k+1];
  33.        value_buf[k+1] = temp;
  34.      }
  35.    }
  36.   }
  37.   return value_buf[(N-1)/2];
  38. }




  39. 3、算术平均滤波法




  40. #define N 12


  41. char filter()
  42. {
  43.   unsigned int sum = 0;
  44.   unsigned char i;


  45.   for (i=0;i<N;i++)
  46.   {
  47.     sum + = get_ad();
  48.     delay();
  49.   }
  50.   return(char)(sum/N);
  51. }


  52. 4、递推平均滤波法(又称滑动平均滤波法)




  53. #define N 12


  54. unsigned char value_buf[N];


  55. unsigned char filter()
  56. {
  57.   unsigned char i;
  58.   unsigned char value;
  59.   int sum=0;


  60.   value_buf[i++] = get_ad();       //采集到的数据放入最高位
  61.   for(i=0;i<N;i++)
  62.   {
  63.     value_buf[i]=value_buf[i+1];   //所有数据左移,低位扔掉
  64.     sum += value_buf[i];
  65.   }
  66.   value = sum/N;
  67.   return(value);
  68. }


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




  70. #define N 12


  71. uchar filter()


  72. {
  73.   unsigned char i,j,k,l;
  74.   unsigned char temp,sum=0,value;
  75.   unsigned char value_buf[N],;


  76.   for(i=0;i<N;i++)
  77.   {
  78.     value_buf[i] = get_ad();
  79.     delay();
  80.   }
  81.   //采样值从小到大排列(冒泡法)
  82.   for(j=0;j<N-1;j++)
  83.   {
  84.     for(i=0;i<N-j;i++)
  85.     {
  86.       if(value_buf[i]>value_buf[i+1])
  87.       {
  88.         temp = value_buf[i];
  89.         value_buf[i] = value_buf[i+1];
  90.         value_buf[i+1] = temp;
  91.       }
  92.     }
  93.   }


  94.   for(i=1;i<N-1;i++)
  95.   sum += value_buf[i];


  96.   value = sum/(N-2);
  97.   return(value);
  98. }


  99. 6、递推中位值滤波法


  100. char filter(char new_data,char queue[],char n)
  101. {
  102.   char max,min;
  103.   char sum;
  104.   char i;


  105.   queue[0]=new_data;
  106.   max=queue[0];
  107.   min=queue[0];
  108.   sum=queue[0];


  109.   for(i=n-1;i>0;i--)
  110.   {
  111.     if(queue[i]>max)
  112.     max=queue[i];
  113.     else if (queue[i]<min)
  114.     min=queue[i];
  115.     sum=sum+queue[i];
  116.     queue[i]=queue[i-1];
  117.   }


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


  121.   return(sum);
  122. }


  123. 7、限幅平均滤波法


  124. #define A 10
  125. #define N 12


  126. unsigned char data[];
  127. unsigned char filter(data[])
  128. {
  129.   unsigned char i;
  130.   unsigned char value,sum;


  131.   data[N]=GetAD();
  132.   if(((data[N]-data[N-1])>A||((data[N-1]-data[N])>A))
  133.   data[N]=data[N-1];
  134.   //else data[N]=NewValue;
  135.   for(i=0;i<N;i++)
  136.   {
  137.     data[i]=data[i+1];
  138.     sum+=data[i];
  139.   }
  140.   value=sum/N;
  141.   return(value);
  142. }




  143. 8、一阶滞后滤波法




  144. #define Thre_value  10
  145. #define  N   50


  146. float Or_data[N];
  147. unsigned char Dr0_flag=0,Dr1_flag=0;


  148. void abs(float first,float second)
  149. {
  150. float abs;
  151. if(first>second)
  152. {
  153.    abs=first-second;
  154.    Dr1_flag=0;
  155. }
  156. else
  157. {
  158.    abs=second-first;
  159.    Dr1_flag=1;
  160. }
  161. return(abs);
  162. }  


  163. void filter(void)
  164. {
  165.   uchar i=0,F_count=0,coeff=0;
  166.   float Abs=0.00;


  167.   //确定一阶滤波系数
  168.   for(i=1;i<N;i++)
  169.     {
  170.       Abs=abs(Or_data[i-1],Or_data[i]);
  171.       if(!(Dr1_flag^Dr0_flag))                    //前后数据变化方向一致
  172.       {  
  173.         F_count++;
  174.         if(Abs>=Thre_value)
  175.         {
  176.           F_count++;
  177.           F_count++;
  178.         }
  179.         if(F_count>=12)
  180.         F_count=12;
  181.         coeff=20*F_count;   
  182.       }
  183.       else                                        //去抖动
  184.       coeff=5;
  185.       //一阶滤波算法
  186.       if(Dr1_flag==0)                             //当前值小于前一个值
  187.       Or_data[i]=Or_data[i-1]-coeff*(Or_data[i-1]-Or_data[i])/256;
  188.       else
  189.       Or_data[i]=Or_data[i-1]+coeff*(Or_data[i]-Or_data[i-1])/256;   
  190.       
  191.       F_count=0;                                  //滤波计数器清零
  192.       Dr0_flag=Dr1_flag;
  193.     }
  194. }


  195. 9、加权递推平均滤波法




  196. #define N 12


  197. const char code coe[N] = {1,2,3,4,5,6,7,8,9,10,11,12};
  198. const char code sum_coe = 1+2+3+4+5+6+7+8+9+10+11+12;


  199. unsigned char filter()
  200. {
  201.   unsigned char i;
  202.   unsigned char value_buf[N];
  203.   int sum=0;


  204.   for (i=0;i<N;i++)
  205.   {
  206.     value_buf[i] = get_ad();
  207.     delay();
  208.   }


  209.   for (i=0,i<N;i++)
  210.   {
  211.     value_buf[i]=value_buf[i+1];
  212.     sum += value_buf[i]*coe[i];
  213.   }


  214.   sum/=sum_coe;
  215.   value=sum/N;
  216.   return(value);
  217. }


  218. 10、消抖滤波法


  219. #define N 12


  220. unsigned char filter()
  221. {
  222.   unsigned char i=0;
  223.   unsigned char new_value;
  224.   new_value = get_ad();
  225.   if(value !=new_value);
  226.   {
  227.     i++;
  228.     if (i>N)
  229.     {
  230.       i=0;
  231.       value=new_value;
  232.     }
  233.   }
  234.   else i=0;
  235.   return(value);
  236. }
复制代码
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则


--------------------------------------------------------------------------------------------------------------------
本站是工控技术交流站点,论坛内容均为网络收集或会员所发表,并不代表本站立场,会员拥有该内容的所有权力及责任!
本站内容如有侵犯您的版权,请按下面方式联系本站管理员,我们将及时删除处理
管理员:冰糖 QQ:5483695(请直击主题), Mail:admin#ziwai.net(#改成@) 其它非本人.
拒绝任何人以任何形式在本论坛发表与中华人民共和国法律相抵触的言论!

QQ|Archiver|手机版|小黑屋|紫外工控论坛. ( 苏ICP备11032118号-1 )

GMT+8, 2024-4-28 02:14 , Processed in 0.343747 second(s), 21 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表