`
lovnet
  • 浏览: 6704591 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
文章分类
社区版块
存档分类
最新评论

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语言来实现几种数据处理中常见滤波算法

    单片机几种软件滤波程序示例.

    提供几种C语言滤波方法,平均方法,这是我从网上下载下来的,觉得很有用,所以也共享一下

    11111_C语言_空间滤波_数字图像处理_

    几种数字图像处理空间滤波的实现,如高斯滤波、拉普拉斯锐化、阈值滤波、中值滤波等等

    几种常用的滤波算法C语言filter.c

    在嵌入式开发中经常会用到一些滤波算法,我整理了一些资料把这些算法封装成可以直接调用的函数,方便以后的开发,包括限幅滤波、中位值滤波法、 算术平均滤波法、一阶滞后滤波法、加权递推平均滤波法、消抖滤波法 ,...

    C滤波算法分析

    详细介绍了,平时用到的十几种数据滤波算法。对每种算法的优缺点进行逐一说明,平时遇到的数据处理很有帮助

    滤除特定谐波的几种滤波算法C语言实现

    在AD采样应用中,如果采样信号含有特定次谐波,如果想滤掉这些谐波,可以参考里面的几个函数,包含差分、加法、积分、加减法、零点滤波函数。文档中对各滤波函数有详细的注释,及应用条件,及测试函数。测试函数中...

    经典滤波器算法C语言编程

    几种经典滤波器算法,C语言编程实例,能很好的移植

    C语言算法集锦

    常见的几种MCU接口处理程序,如AD滤波,按键消抖等等,C语言代码

    五点3次平滑,最小二乘平滑C语言程序.txt

    C语言写的五点3次平滑还有其他几种线性平滑,最小二乘平滑源程序可以直接用

    数字滤波C程序 电源设计 数据采集好用

    数据采集,电源设计时都要用到数字滤波,作者总结了几种非常实用的滤波算法

    c语言编写单片机技巧

    用C语言来编写目标系统软件,会大大缩短开发周期,且明显地增加软件的可读性,便于改进和扩充,从而研制出规模更大、性能更完备的系统。 综上所述,用C语言进行单片机程序设计是单片机开发与应用的必然趋势。所以...

    DSP芯片的原理与开发应用(第2版)电子版下载.pdf

    数字信号处理的实现方法一般有以下几种: (1) 在通用的计算机(如PC机)上用软件(如Fortran、C语言)实现; (2) 在通用计算机系统中加上专用的加速处理机实现; (3) 用通用的单片机(如MCS-51、96系列等)实现,...

    MCS-51单片机,软件抗干扰方法

    本文针对后者提出了几种有效的软件抗干扰方法。 (1) 指令冗余 CPU取指令过程是先取操作码,再取操作数。当PC受干扰出现错误,程序便脱离正常轨道“乱飞”,当乱飞到某双字节指令,若取指令时刻落在操作数上,误将...

    单片机与DSP中的用8位微处理器实现数字低通滤波器设计

    一个简单的汇编程序... 有几种方法解决这些问题。例如,可以使用16、32和64位数的操作,或可以缩放到更好的精度。这些和其他方法通常需要更多的存储器,造成编程经常不适于小型微处理器。文献研究所示用C语言编写的

    室内智能防盗控制系统设计.doc

    据悉,目前防盗报警系统的附加功能主要有一下 几种:1、自动拨号报警功能。系统探测到窃贼入室或火灾等信息后,按事先设定的电话 号码自动拨号,播通后自动播放报警信息,以有效地减少报警时间。2、系统可利用接口 ...

    MFC数字图像处理(BMP格式读取 保存 DFT FFT 直方图 色调均化 缩放 模糊 锐化 滤镜 形态学处理 曲线 裁剪 灰度图 彩色图 自动阈值)

    【锐化】个人觉得除了拉普拉斯的锐化方式之外的锐化都很难看所以就只保留了这两种锐化方式了,将就着用把- -。 【自定义滤波器】为了能够灵活地使用滤波器,一个自定义滤波器的功能还是需要的,具体的功能就跟PS的...

    OPenGL编程书籍

    什么是卡通了,一个轮廓加上少量的几种颜色。使用一维纹理映射,你也可以实现这种效果。 38.从资源文件中载入图像 如何把图像数据保存到*.exe程序中,使用Windows的资源文件吧,它既简单又实用。 39.物理模拟简介...

    Nehe的OpenGL教程电子书

    什么是卡通了,一个轮廓加上少量的几种颜色。使用一维纹理映射,你也可以实现这种效果。 38.从资源文件中载入图像 如何把图像数据保存到*.exe程序中,使用Windows的资源文件吧,它既简单又实用。 39.物理...

Global site tag (gtag.js) - Google Analytics