数字滤波C程序
/***************************** 数字滤波C程 *************************/
/////////////////////////////////限副滤波/////////////////// /*滤波程序返回有效的实际值*/
#define A 10 //A值可根据实际情况调整 char value; //value为有效值 char filter() { char new_value; //new value为当前采样值 new value=get_ad(); if ((new_value-value>A)‖(value-new_value> A) return value; return new_value; }
/////////////////////////中位值滤波/////////////////////////
#define N 11 //N值可根据实际情况调整 char filter() { char value_buf[N]; char count,i,j,temp; for (count=0;count<N;count++) { value_buf[count]=get_ad(); //获取采样值 delay(); } for (j=0;j<N-1;j++) //采样值由小到大排列,排序采用冒泡法 { for (i=0;i<N-j;i++) { if(value_buf>value_buf[i+1]) { temp=value_buf; value_buf=value_buf[i+1]; value_buf[i+1]=temp; } } } return value_buf[(N-1)/2]; //取中间值 }
/////////////////////////算术平均滤波//////////////////////
#define N 12 char filter() { int sum=0; for(count=0;count<N;count++) { sum+=get_ad(); delay(); } return (char)(sum/N); }
///////////////////去极值平均滤波 //////////////////////
#define N 11 //N值可根据实际情况调整 int sum=0;
char filter() { char value_buf[N]; char count,i,j,temp; for (count=0;count<N;count++) { value_buf[count]=get_ad(); //获取采样值 delay(); } for (j=0;j<N-1;j++) //采样值由小到大排列,排序采用冒泡法 { for (i=0;i<N-j;i++) { if(value_buf>value_buf[i+1]) { temp=value_buf; value_buf=value_buf[i+1]; value_buf[i+1]=temp; } } }
for(count=1;count<(N-1);count++) //去掉第一个和末一个数 { sum+=value_buf[count]; delay(); } return (char)(sum/(N-2)); }
///////////////////移动平均滤波(递推平均滤波)///////////
#define N 12 char value_buf[N]; char i=0; char filter() { char count; int sum=0; value_buf[i++]=get_ad(); if(i=N) i=0; for (count=0;count<N;count++) sum+=value_buf[count]; return (char)(sum/N)
}
//////////////////////加权平均滤波/////////////////////// #define N 12 char code jq[N]={1,2,3,4,5,6,7,8,9,10,11,12};//加权系数表 char code sum_jq=1+2+3+4+5+6+7+8+9+10+11+12; char filter() { char count; char value_buf[N]; int sum=0; for (count=0;count<N;count++) {value_buf[count]=get_ad(); //获取采样值 delay(); } for (count=0;count<N;count++) sum+=value_buf[count]*jq[count]; return (char)(sum/sum_jq); }
/////////////////////////低通滤波////////////////////////
#define a 0.25 char value; //value为已有值 char filter() { char new_value; //new value为当前采样值 new_value=get_ad(); return (a*new_value+(1-a)*value); }
|