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; //还原现场
}
分享到:
相关推荐
"软件滤波算法.txt" 文件很可能包含了关于这些滤波算法的具体实现代码和实例,对于学习和理解滤波器的工作原理和C语言编程技巧具有很高的价值。通过阅读和分析这个文件,你可以更深入地了解每种滤波器的细节,并可能...
卡尔曼滤波是一种在线性高斯噪声环境下的最优估计理论,广泛应用于许多领域,如导航、控制、信号处理等。它的基本思想是结合系统模型和观测数据,通过一系列递推计算,提供对系统状态的最优估计。在C语言中实现...
通过c语言来实现几种数据处理中常见滤波算法
在"单片机10种软件滤波方法的示例程序.txt"中,你可能会找到以下几种滤波算法的C语言实现: 1. **滑动平均滤波**:即上述的平均方法,连续计算固定窗口内的样本平均值。 2. **加权平均滤波**:赋予最近的数据点更高...
通常,C语言实现的卡尔曼滤波代码会包含以下几个部分: - 初始化函数:设置初始状态和协方差矩阵。 - 预测函数:基于系统模型计算预测状态。 - 更新函数:结合观测值更新状态估计。 - 循环应用:在每个时间步长...
在数字信号处理领域,滤波是一种非常重要的技术,它用于去除信号中的噪声,提取有用信息,或者改变信号的频谱特性。本主题聚焦于“C语言实现数字滤波算法”,我们将深入探讨数字滤波的基本概念、常用算法以及如何用...
中值滤波是一种广泛应用在...总之,中值滤波是一种强大的图像处理工具,C语言的实现则使得它更加灵活和实用。通过学习和实践这个项目,不仅可以掌握中值滤波的基本原理,还能提升C语言编程和图像处理的实际操作能力。
在嵌入式开发中经常会用到一些滤波算法,我整理了一些资料把这些算法封装成可以直接调用的函数,方便以后的开发,包括限幅滤波、中位值滤波法、 算术平均滤波法、一阶滞后滤波法、加权递推平均滤波法、消抖滤波法 ,...
几种数字图像处理空间滤波的实现,如高斯滤波、拉普拉斯锐化、阈值滤波、中值滤波等等
外部中断的按键,软件滤波实现方法 本篇文章主要讲述了外部中断的按键,软件滤波实现方法的相关知识点。文章的作者曾经在实验室待了几年,搞点比赛等相关的电子工作,对于按键有一点心得。 首先,作者提到按键可以...
在图像处理领域,均值滤波是一种常见的降噪方法,尤其适用于去除图像中的高频噪声。本项目使用C语言实现这一技术,为初学者提供了一种深入理解图像处理算法的实践平台。下面将详细介绍图像处理的基本概念、均值滤波...
本文将详细解析几种经典滤波算法的原理和特点,并提供相应的C语言实现。这些算法包括限幅滤波法、中位值滤波法、算术平均滤波法、递推平均滤波法、中位值平均滤波法、限幅平均滤波法、一阶滞后滤波法以及加权递推...
详细介绍了,平时用到的十几种数据滤波算法。对每种算法的优缺点进行逐一说明,平时遇到的数据处理很有帮助
在AD采样应用中,如果采样信号含有特定次谐波,如果想滤掉这些谐波,可以参考里面的几个函数,包含差分、加法、积分、加减法、零点滤波函数。文档中对各滤波函数有详细的注释,及应用条件,及测试函数。测试函数中...
C语言实现卡尔曼滤波时,需要注意以下几点: - **内存管理**:C语言没有内置的动态内存管理,需要手动分配和释放内存,确保不会造成内存泄漏。 - **精度**:由于浮点运算可能在嵌入式环境中受限,需要考虑使用单...
防脉冲干扰移动平均值法数字滤波器是指一种数字滤波方法,用于对脉冲干扰信号进行处理。这种方法的基本原理是将被认为是受干扰的信号数据去掉,然后对剩余数据进行平均值计算。 防脉冲干扰移动平均值法数字滤波器的...
在C++编程环境中实现卡尔曼滤波,通常涉及以下几个关键步骤: 1. **系统模型定义**:卡尔曼滤波基于系统模型,这包括状态转移矩阵(A)和观测矩阵(H)。状态转移矩阵描述了系统在时间步之间如何演变,观测矩阵则将...
本文将详细探讨C程序实现的几种常见滤波算法,包括中值滤波、直方图均衡化、Sobel算子和Robert算子,以及与之相关的二值化处理。 首先,中值滤波是一种非线性的滤波方法,主要用于去除椒盐噪声。它的工作原理是,...
主要有以下几种矩阵: 1. 状态转移矩阵(A):描述系统从一个时间步到下一个时间步的状态变化。 2. 测量矩阵(H):将系统状态映射到可测量的输出上。 3. 系统噪声协方差矩阵(Q):表示系统模型中的不确定性或噪声...
在C语言实现卡尔曼滤波时,需要注意以下几点: 1. 数据结构:定义状态向量、状态转移矩阵、观测矩阵等数据结构,以便存储和操作滤波器所需的参数。 2. 初始化:设置初值,包括初始状态估计、状态协方差矩阵、过程...