微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > 嵌入式系统设计讨论 > 9个软件滤波的C程序

9个软件滤波的C程序

时间:10-02 整理:3721RD 点击:
1-限副滤波:

  1. /* A值可根据实际情况调整
  2. value为有效值,new_value为当前采样值
  3. 滤波程序返回有效的实际值 */
  4. #define A 10
  5. char value;
  6. char filter()
  7. {
  8. char new_value;
  9. new_value = get_ad();
  10. if ( ( new_value - value > A ) || ( value - new_value > A )
  11. return value;
  12. return new_value;   
  13. }

复制代码



2-中位值滤波法


  1. /* N值可根据实际情况调整
  2. 排序采用冒泡法*/
  3. #define N 11

  4. char filter()
  5. {
  6. char value_buf[N];
  7. char count,i,j,temp;
  8. for ( count=0;count<N;count++)
  9. {
  10. value_buf[count] = get_ad();
  11. delay();
  12. }
  13. for (j=0;j<N-1;j++)
  14. {
  15. for (i=0;i<N-j;i++)
  16. {
  17.    if ( value_buf>value_buf[i+1] )
  18.    {
  19.       temp = value_buf;
  20.       value_buf = value_buf[i+1];
  21.          value_buf[i+1] = temp;
  22.    }
  23. }
  24. }
  25. return value_buf[(N-1)/2];
  26. }

复制代码



3-算术平均滤波法


  1. /*
  2. */

  3. #define N 12

  4. char filter()
  5. {
  6. int sum = 0;
  7. for ( count=0;count<N;count++)
  8. {
  9. sum + = get_ad();
  10. delay();
  11. }
  12. return (char)(sum/N);
  13. }

复制代码



4-递推平均滤波法(又称滑动平均滤波法)


  1. /*
  2. */
  3. #define N 12

  4. char value_buf[N];
  5. char i=0;

  6. char filter()
  7. {
  8. char count;
  9. int sum=0;
  10. value_buf[i++] = get_ad();
  11. if ( i == N ) i = 0;
  12. for ( count=0;count<N,count++)
  13. sum = value_buf[count];
  14. return (char)(sum/N);
  15. }

复制代码



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


  1. /*
  2. */
  3. #define N 12

  4. char filter()
  5. {
  6. char count,i,j;
  7. char value_buf[N];
  8. int sum=0;
  9. for (count=0;count<N;count++)
  10. {
  11. value_buf[count] = get_ad();
  12. delay();
  13. }
  14. for (j=0;j<N-1;j++)
  15. {
  16. for (i=0;i<N-j;i++)
  17. {
  18.    if ( value_buf>value_buf[i+1] )
  19.    {
  20.       temp = value_buf;
  21.       value_buf = value_buf[i+1];
  22.          value_buf[i+1] = temp;
  23.    }
  24. }
  25. }
  26. for(count=1;count<N-1;count++)
  27. sum += value[count];
  28. return (char)(sum/(N-2));
  29. }

复制代码



6-一阶滞后滤波法


  1. /* 为加快程序处理速度假定基数为100,a=0~100 */

  2. #define a 50

  3. char value;

  4. char filter()
  5. {
  6. char new_value;
  7. new_value = get_ad();
  8. return (100-a)*value + a*new_value;
  9. }

复制代码



7-加权递推平均滤波法

  1. /* coe数组为加权系数表,存在程序存储区。*/

  2. #define N 12

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

  5. char filter()
  6. {
  7. char count;
  8. char value_buf[N];
  9. int sum=0;
  10. for (count=0,count<N;count++)
  11. {
  12. value_buf[count] = get_ad();
  13. delay();
  14. }
  15. for (count=0,count<N;count++)
  16. sum += value_buf[count]*coe[count];
  17. return (char)(sum/sum_coe);
  18. }

复制代码



8-消抖滤波法

  1. #define N 12

  2. char filter()
  3. {
  4. char count=0;
  5. char new_value;
  6. new_value = get_ad();
  7. while (value !=new_value);
  8. {
  9. count++;
  10. if (count>=N) return new_value;
  11.    delay();
  12. new_value = get_ad();
  13. }
  14. return value;
  15. }

复制代码



9-IIR滤波例子


  1. int BandpassFilter4(int InputAD4)
  2. {
  3. int ReturnValue;
  4. int ii;
  5. RESLO=0;
  6. RESHI=0;
  7. MACS=*PdelIn;
  8. OP2=1068; //FilterCoeff4[4];
  9. MACS=*(PdelIn+1);
  10. OP2=8; //FilterCoeff4[3];
  11. MACS=*(PdelIn+2);
  12. OP2=-2001;//FilterCoeff4[2];
  13. MACS=*(PdelIn+3);
  14. OP2=8; //FilterCoeff4[1];
  15. MACS=InputAD4;
  16. OP2=1068; //FilterCoeff4[0];
  17. MACS=*PdelOu;
  18. OP2=-7190;//FilterCoeff4[8];
  19. MACS=*(PdelOu+1);
  20. OP2=-1973; //FilterCoeff4[7];
  21. MACS=*(PdelOu+2);
  22. OP2=-19578;//FilterCoeff4[6];
  23. MACS=*(PdelOu+3);
  24. OP2=-3047; //FilterCoeff4[5];
  25. *p=RESLO;
  26. *(p+1)=RESHI;
  27. mytestmul<<=2;
  28. ReturnValue=*(p+1);
  29. for (ii=0;ii<3;ii++)
  30. {
  31. DelayInput[ii]=DelayInput[ii+1];
  32. DelayOutput[ii]=DelayOutput[ii+1];
  33. }
  34. DelayInput[3]=InputAD4;
  35. DelayOutput[3]=ReturnValue;

  36. // if (ReturnValue<0)
  37. // {
  38. // ReturnValue=-ReturnValue;
  39. // }
  40. return ReturnValue;
  41. }

复制代码




然而这只是两个~

谢谢大神。谢谢大神。谢谢大神。谢谢大神。谢谢大神。谢谢大神。谢谢大神。谢谢大神。谢谢大神。谢谢大神。

这个数不够呀                              

感谢分享

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top