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语言滤波方法,平均方法,这是我从网上下载下来的,觉得很有用,所以也共享一下
几种数字图像处理空间滤波的实现,如高斯滤波、拉普拉斯锐化、阈值滤波、中值滤波等等
在嵌入式开发中经常会用到一些滤波算法,我整理了一些资料把这些算法封装成可以直接调用的函数,方便以后的开发,包括限幅滤波、中位值滤波法、 算术平均滤波法、一阶滞后滤波法、加权递推平均滤波法、消抖滤波法 ,...
详细介绍了,平时用到的十几种数据滤波算法。对每种算法的优缺点进行逐一说明,平时遇到的数据处理很有帮助
在AD采样应用中,如果采样信号含有特定次谐波,如果想滤掉这些谐波,可以参考里面的几个函数,包含差分、加法、积分、加减法、零点滤波函数。文档中对各滤波函数有详细的注释,及应用条件,及测试函数。测试函数中...
几种经典滤波器算法,C语言编程实例,能很好的移植
常见的几种MCU接口处理程序,如AD滤波,按键消抖等等,C语言代码
C语言写的五点3次平滑还有其他几种线性平滑,最小二乘平滑源程序可以直接用
数据采集,电源设计时都要用到数字滤波,作者总结了几种非常实用的滤波算法
用C语言来编写目标系统软件,会大大缩短开发周期,且明显地增加软件的可读性,便于改进和扩充,从而研制出规模更大、性能更完备的系统。 综上所述,用C语言进行单片机程序设计是单片机开发与应用的必然趋势。所以...
数字信号处理的实现方法一般有以下几种: (1) 在通用的计算机(如PC机)上用软件(如Fortran、C语言)实现; (2) 在通用计算机系统中加上专用的加速处理机实现; (3) 用通用的单片机(如MCS-51、96系列等)实现,...
本文针对后者提出了几种有效的软件抗干扰方法。 (1) 指令冗余 CPU取指令过程是先取操作码,再取操作数。当PC受干扰出现错误,程序便脱离正常轨道“乱飞”,当乱飞到某双字节指令,若取指令时刻落在操作数上,误将...
一个简单的汇编程序... 有几种方法解决这些问题。例如,可以使用16、32和64位数的操作,或可以缩放到更好的精度。这些和其他方法通常需要更多的存储器,造成编程经常不适于小型微处理器。文献研究所示用C语言编写的
据悉,目前防盗报警系统的附加功能主要有一下 几种:1、自动拨号报警功能。系统探测到窃贼入室或火灾等信息后,按事先设定的电话 号码自动拨号,播通后自动播放报警信息,以有效地减少报警时间。2、系统可利用接口 ...
【锐化】个人觉得除了拉普拉斯的锐化方式之外的锐化都很难看所以就只保留了这两种锐化方式了,将就着用把- -。 【自定义滤波器】为了能够灵活地使用滤波器,一个自定义滤波器的功能还是需要的,具体的功能就跟PS的...
什么是卡通了,一个轮廓加上少量的几种颜色。使用一维纹理映射,你也可以实现这种效果。 38.从资源文件中载入图像 如何把图像数据保存到*.exe程序中,使用Windows的资源文件吧,它既简单又实用。 39.物理模拟简介...
什么是卡通了,一个轮廓加上少量的几种颜色。使用一维纹理映射,你也可以实现这种效果。 38.从资源文件中载入图像 如何把图像数据保存到*.exe程序中,使用Windows的资源文件吧,它既简单又实用。 39.物理...