`
lovnet
  • 浏览: 6766032 次
  • 性别: 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语言编写多种软件滤波算法

    "软件滤波算法.txt" 文件很可能包含了关于这些滤波算法的具体实现代码和实例,对于学习和理解滤波器的工作原理和C语言编程技巧具有很高的价值。通过阅读和分析这个文件,你可以更深入地了解每种滤波器的细节,并可能...

    用C语言编写的卡尔曼滤波算法

    卡尔曼滤波是一种在线性高斯噪声环境下的最优估计理论,广泛应用于许多领域,如导航、控制、信号处理等。它的基本思想是结合系统模型和观测数据,通过一系列递推计算,提供对系统状态的最优估计。在C语言中实现...

    c语言实现经典滤波代码

    通过c语言来实现几种数据处理中常见滤波算法

    卡尔曼滤波C语言代码

    总的来说,这个压缩包提供了一种便捷的方式来在C语言项目中实现卡尔曼滤波算法。通过理解和运用这些代码,开发者可以有效地处理不稳定或有噪声的数据,提高系统性能和准确性。对于学习和实践卡尔曼滤波理论,以及...

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

    在"单片机10种软件滤波方法的示例程序.txt"中,你可能会找到以下几种滤波算法的C语言实现: 1. **滑动平均滤波**:即上述的平均方法,连续计算固定窗口内的样本平均值。 2. **加权平均滤波**:赋予最近的数据点更高...

    程序代码源代码 卡尔曼滤波 C语言

    通常,C语言实现的卡尔曼滤波代码会包含以下几个部分: - 初始化函数:设置初始状态和协方差矩阵。 - 预测函数:基于系统模型计算预测状态。 - 更新函数:结合观测值更新状态估计。 - 循环应用:在每个时间步长...

    C语言实现数字滤波算法

    在数字信号处理领域,滤波是一种非常重要的技术,它用于去除信号中的噪声,提取有用信息,或者改变信号的频谱特性。本主题聚焦于“C语言实现数字滤波算法”,我们将深入探讨数字滤波的基本概念、常用算法以及如何用...

    C语言实现FIR滤波

    5. **验证与Matlab结果一致性**:为了确保C语言实现的FIR滤波器与Matlab结果一致,可以生成一组测试数据,先用Matlab进行滤波,然后用C语言程序处理相同的输入数据,比较两者的输出结果。通常,微小的浮点数误差是...

    中值滤波程序 用C语言实现

    中值滤波是一种广泛应用在...总之,中值滤波是一种强大的图像处理工具,C语言的实现则使得它更加灵活和实用。通过学习和实践这个项目,不仅可以掌握中值滤波的基本原理,还能提升C语言编程和图像处理的实际操作能力。

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

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

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

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

    FIR 数字滤波器 C语言实现

    FIR(Finite Impulse Response,有限冲击响应)数字滤波器是一种在信号处理领域广泛应用的滤波技术。它通过计算输入信号与一组预定义系数的卷积来改变信号的频率特性。C语言作为通用编程语言,是实现FIR滤波器的理想...

    极化雷达图像gaussian滤波源代码(C语言版)

    为了解决这一问题,人们发展了多种滤波方法,其中Gaussian滤波是一种常见的去噪技术。这里我们将深入探讨极化雷达图像中的Gaussian滤波及其C语言实现。 Gaussian滤波是一种线性平滑滤波器,其核函数为高斯分布。在...

    C语言嵌入式开发单片机通用KALMAN滤波代码实现

    KALMAN滤波是一种广泛应用的估计理论,能够处理线性和非线性系统的不确定性问题,对于传感器数据融合、导航、控制系统等领域具有重要作用。本知识点将详细讲解如何在C语言环境下,实现一个通用的KALMAN滤波器,并将...

    外部中断的按键,软件滤波实现方法

    外部中断的按键,软件滤波实现方法 本篇文章主要讲述了外部中断的按键,软件滤波实现方法的相关知识点。文章的作者曾经在实验室待了几年,搞点比赛等相关的电子工作,对于按键有一点心得。 首先,作者提到按键可以...

    图像处理(均值滤波C语言)

    在图像处理领域,均值滤波是一种常见的降噪方法,尤其适用于去除图像中的高频噪声。本项目使用C语言实现这一技术,为初学者提供了一种深入理解图像处理算法的实践平台。下面将详细介绍图像处理的基本概念、均值滤波...

    卡尔曼滤波C语言实现

    卡尔曼滤波是一种在噪声环境下估计系统状态的优化算法,尤其在处理动态系统的预测和更新问题上表现出色。它是基于线性系统理论的一种递归滤波器,即使在存在不确定性和随机干扰的情况下,也能提供最优的估计。在这个...

    经典滤波算法及C语言程序.doc

    本文将详细解析几种经典滤波算法的原理和特点,并提供相应的C语言实现。这些算法包括限幅滤波法、中位值滤波法、算术平均滤波法、递推平均滤波法、中位值平均滤波法、限幅平均滤波法、一阶滞后滤波法以及加权递推...

    单片机常用滤波算法+C语言深度剖析文档

    6. **巴特沃斯滤波**:一种线性相位滤波器,可以设计成低通、高通、带通或带阻滤波器。在单片机中实现通常需要离散傅立叶变换(DFT),这可能较为复杂。 7. **卡尔曼滤波**:适用于有噪声的动态系统,能估计出最优...

    软件滤波的原理与源码

    本文将深入探讨几种常见的软件滤波方法,并提供相关的C语言源代码实现。以下是对这些滤波方法的详细阐述: 1. 限副滤波:限副滤波器主要用于限制信号的动态范围,防止过大的输入信号导致系统的饱和或失真。在C语言...

Global site tag (gtag.js) - Google Analytics