C语言几种软件滤波方式

1.算数平均值滤波

void interrupt
AD(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 interrupt
AD(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 interrupt
AD(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 interrupt
AD(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 interrupt
AD(void)
{
 WREG_temp=WREG;           		//现场保护
 STATUS_temp=STAUTS;
 ADIF=0;                      		//清除中断标志
 AD_result=ADRESH;           		//AD结果存放到AD_result中;
 WREG=WREG_temp;
 STATUS=STAUTS_temp;      		//还原现场
}


你可能感兴趣的:(c,c,语言,Go,Go)