- 壹零零单片机©版权所有 2008-2023 粤ICP备17151077号
在单片机进行数据采集时,会遇到数据的随机误差,随机误差是由随机干扰引起的,其特点是在相同条件下测量同一量时,其大小和符号会现无规则的变化而无法预测,但多次测量的结果符合统计规律。为克服随机干扰引起的误差,硬件上可采用滤波技术,软件上可采用软件算法实现数字滤波。滤波算法往往是系统测控算法的一个重要组成部分,实时性很强。
1、数字滤波无需其他的硬件成本,只用一个计算过程,可靠性高,不存在阻抗匹配问题。尤其是数字滤波可以对频率很低的信号进行滤波,这是模拟滤波器做不到的。
3、只要适当改变滤波器的滤波程序或运算,就能方便地改变其滤波特性,这对于滤除低频干扰和随机信号会有较大的效果。
(1)限幅滤波算法
算法的程序代码如下:
chardata; //上一次的数据
{
datanew=get_data(); //获得新数据变量
return data;
returndatanew;
说明:限幅滤波法主要用于处理变化较为缓慢的数据,如温度、物体的位置等。使用时,关键要选取合适的门限制A。通常这可由经验数据获得,必要时可通过实验得到。
该运算的过程是对某一参数连续采样N次(N一般为奇数),然后把N次采样的值按从小到大排列,再取中间值作为本次采样值,整个过程实际上是一个序列排序的过程。
#define N11 //定义获得的数据个数
{
char count,i,j,temp;
{
delay(); //如果采集数据比较慢,那么就需要延时或中断
for(j=0;j
for(value_buff[i]>value_buff[i+1]
temp=value_buff[i];
value_buff[i+1]=temp;
}
}
(3)算术平均滤波算法
算法的程序代码如下:
{
for(count=0;count
sum+=get_data();
}
}
(4)加权平均滤波算法
式中:D为N个采样值的加权平均值:XN-i为第N-i次采样值;N为采样次数;Ci为加权系数。加权系数Ci体现了各种采样值在平均值中所占的比例。一般来说采样次数越靠后,取的比例越大,这样可增加新采样在平均值中所占的比重。加权平均值滤波法可突出一部分信号抵制另一部分信号,以提高采样值变化的灵敏度。
char codejq[N]={1,2,3,4,5,6,7,8,9,10,11,12}; //code数组为加权系数表,存在程序存储区
char filter()
char count;
int sum=0;
{
delay();
for(count=0;count
return(char)(sum/sum_jq);
(5)滑动平均滤波算法
程序代码如下:
char i=0;
{
int sum=0;
if(i==N)
for(count=0;count
return (char)(sum/N);
(6)低通滤波
Yn=a* Xn+(1-a) *Yn-1
Yn-1——上次的滤波输出值;
Yn——本次滤波的输出值。
fL=a/2Pit pi为圆周率3.14…
, t——采样间隔时间;
fL=(1/32)/(2*3.14*0.5)=0.01Hz
低通滤波算法程序于加权平均滤波相似,但加权系数只有两个:a和1-a。为计算方便,a取一整数,1-a用256-a,来代替,计算结果舍去最低字节即可,因为只有两项,a和1-a,均以立即数的形式编入程序中,不另外设表格。虽然采样值为单元字节(8位A/D)。为保证运算精度,滤波输出值用双字节表示,其中一个字节整数,一字节小数,否则有可能因为每次舍去尾数而使输出不会变化。
<section !important;"="" break-word="" border-box="" 255,="" rgb(255,="" arial,="" yahei",="" "microsoft="" ui",="" yahei="" gb",="" sans="" "hiragino="" sc",="" "pingfang="" neue",="" helvetica="" style="max-width: 100%;">
END