C语言几种软件滤波方式

来源:互联网 发布:算法第四版 影印版PDF 编辑:程序博客网 时间:2024/05/05 03:02

1.算数平均值滤波

void interruptAD(void){ WREG_temp=WREG;         //现场保护 STATUS_temp=STAUTS; ADIF=0;                    //清除中断标志 AD_total+=ADRESH;  if(++count>=4)              //AD转换次数超过4次?    {     count=0;            //是,输出滤波结果     AD_result=AD_total/4;//存放在AD_result中     AD_total=0;     } WREG=WREG_temp; STATUS=STAUTS_temp;      //还原现场}AD转换的主程序:void main(void){  ADCON0=0x01;   //初始化ADCON0寄存器  TRISA=0xFF;     //A口设置成模拟输入  ADCON1=0xFF;  //初始化ADCON1寄存器  ADIE=1;        //开AD中断  ADIF=0;  GIE=1;         //开总部中断  PEIE=1;         //开外部中断  count=0;        //清零计数器,在主函数外部声明的全局变量  GO=1;        //开AD  while(1);}


2.滑动平均值滤波

void interruptAD(void){ WREG_temp=WREG;           //现场保护 STATUS_temp=STAUTS; ADIF=0;                     //清除中断标志 if(AD_enable=1)               //AD转换次数超过4次?    {     if(count>=8) count=0;     AD_total+=ADgot[count++];//是,输出滤波结果     AD_result=AD_total/8;    //存放在AD_result中     if(count>=8) count=0;     AD_total-=ADgot[count];  //去掉最早AD结果    } else    {     if(count>=7) AD_enable=1;//最初的8次AD结果     ADgot[count]=ADRESH;     //保存AD转换结果     AD_total+=ADgot[count++];  //累加AD转换结果     AD_result=AD_total/8;//计算8次采样AD转换平均结果     AD_total-=ADgot[0];        //去掉最早AD转换结果    } WREG=WREG_temp; STATUS=STAUTS_temp;        //还原现场}


3.防脉冲干扰平均值滤波

void interruptAD(void){ WREG_temp=WREG;         //现场保护 STATUS_temp=STAUTS; ADIF=0;                   //清除中断标志 AD_temp=ADRESH;          //保存1次AD采样结果 ADgot[count++]=AD_temp;//保存采样结果到数组中 if(AD_temp>AD_max)//当前采样大于最大值?   {    AD_max=AD_temp;      //是,在AD_max中保存当前值    } else if(AD_temp<AD_min)  //否,比较当前采样小于最小值?   {    AD_min=AD_temp;       //是,在AD_min中保存当前值   } if(count>=8)               //采样次数是否达到8次?   {    count=0;               //是,采样次数清零,    unsigned char i;    for(i=0;i<8;i++)      AD_total+=ADgot[i];   //累加8次采样数据    AD_total=AD_total-AD_min-AD_max;//减掉最大值和最小值,得到6次AD结果    AD_result=AD_total/6;   //计算6次采样平均值    AD_total=0;   } WREG=WREG_temp; STATUS=STAUTS_temp;     //还原现场}


4.中值滤波

void interruptAD(void){ WREG_temp=WREG;            //现场保护 STATUS_temp=STAUTS; ADIF=0;                       //清除中断标志 ADgot[count++]=ADRESH;      //保存AD转换结果到数组中 if(count>=5)                      //采样结果超过5次?   {                            //是,则执行以下操作    unsigned char i,j,temp;    for(i=0;i<4;i++)      for(j=i;j<5;j++)         if(ADgot[i]>ADgot[j]//将第i个数依次和第i+1到最后的数进行比较           {            temp=ADgot[j];   //在第i个数的位置            ADgot[j]=ADgot[i];//保存从i到最后个数中最小的一个            ADgot[i]=temp;     //temp用于中间交换的临时变量            }   AD_result=ADgot[2];        //把最中间的采样结果作为最后AD转换结果//即5个数当中的第3个,从0到4的下标号为2   count=0;                     //计数器清零   } WREG=WREG_temp; STATUS=STAUTS_temp;        //还原现场} 


5.一阶滞后滤波

void interruptAD(void){ WREG_temp=WREG;           //现场保护 STATUS_temp=STAUTS; ADIF=0;                      //清除中断标志 AD_result=ADRESH;           //AD结果存放到AD_result中; WREG=WREG_temp; STATUS=STAUTS_temp;      //还原现场}


原创粉丝点击