10种软件滤波方法的示例程序

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

10种软件滤波方法的示例程序(JKRL)
假定从8位AD中读取数据(如果是更高位的AD可定义数据类型为int),子程序为get_ad();
1、限副滤波
/* A值可根据实际情况调整
value为有效值,new_value为当前采样值
滤波程序返回有效的实际值 */
#define A 10
char value;
char filter()
{
char new_value;
new_value = get_ad();
if ( ( new_value - value > A ) || ( value - new_value > A )
return value;
return new_value;

}
2、中位值滤波法
/* N值可根据实际情况调整
排序采用冒泡法*/
#define N 11
char filter()
{
char value_buf[N];
char count,i,j,temp;
for ( count=0;count<N;count++)
{
value_buf[count] = get_ad();
delay();
}
for (j=0;j<N-1;j++)
{
for (i=0;i<N-j;i++)
{
if ( value_buf[i]>value_buf[i+1] )
{
temp = value_buf[i];
value_buf[i] = value_buf[i+1];
value_buf[i+1] = temp;
}
}
}
return value_buf[(N-1)/2];
}
3、算术平均滤波法
#define N 12
char filter()
{
int sum = 0;
for ( count=0;count<N;count++)
{
sum + = get_ad();
delay();
}
return (char)(sum/N);
}
4、递推平均滤波法(又称滑动平均滤波法)
#define N 12
char value_buf[N];
char i=0;
char filter()
{
char count;
int sum=0;
value_buf[i++] = get_ad();
if ( i == N ) i = 0;
for ( count=0;count<N,count++)
sum = value_buf[count];
return (char)(sum/N);
}
5、中位值平均滤波法(又称防脉冲干扰平均滤波法)
#define N 12
char filter()
{
char count,i,j;
char value_buf[N];
int sum=0;
for (count=0;count<N;count++)
{
value_buf[count] = get_ad();
delay();
}
for (j=0;j<N-1;j++)
{
for (i=0;i<N-j;i++)
{
if ( value_buf[i]>value_buf[i+1] )
{
temp = value_buf[i];
value_buf[i] = value_buf[i+1];
value_buf[i+1] = temp;
}
}
}
for(count=1;count<N-1;count++)
sum += value[count];
return (char)(sum/(N-2));
}
6、限幅平均滤波法
/*
*/
略 参考子程序1、3
7、一阶滞后滤波法
/* 为加快程序处理速度假定基数为100,a=0~100 */
#define a 50
char value;
char filter()
{
char new_value;
new_value = get_ad();
return (100-a)*value + a*new_value;
}
8、加权递推平均滤波法
/* coe数组为加权系数表,存在程序存储区。*/
#define N 12
char code coe[N] = {1,2,3,4,5,6,7,8,9,10,11,12};
char code sum_coe = 1+2+3+4+5+6+7+8+9+10+11+12;
char filter()
{
char count;
char value_buf[N];
int sum=0;
for (count=0,count<N;count++)
{
value_buf[count] = get_ad();
delay();
}
for (count=0,count<N;count++)
sum += value_buf[count]*coe[count];
return (char)(sum/sum_coe);

}
9、消抖滤波法
#define N 12
char filter()
{
char count=0;
char new_value;
new_value = get_ad();
while (value !=new_value);
{
count++;
if (count>=N) return new_value;
delay();
new_value = get_ad();
}
return value;


}
10、限幅消抖滤波法
/*
*/
略 参考子程序1、9





发帖人 主题: 单片机系统中数字滤波的算法 第2楼

用户名: 箫竹
注册日: 2005-09-20
发表于 2007-08-19 07:44:22 [引用回复] [编辑] [删除] [查看ip] [加入黑名单]
单片机系统中数字滤波的算法

随机误差是有随机干搅引起的,其特点是在相同条件下测量同一个量时,其大小和符号做无规则变化而无法预测,但多次测量结果符合统计规律。为克服随机干搅引入的误差,硬件上可采用滤波技术,软件上可以采用软件算法实现数字滤波,其算法往往是系统测控算法的一个重要组成部分,实时性很强,采用汇编语言来编写。


采用数字滤波算法克服随机干搅引入的误差具有以下几个优点:

(1) 数字滤波无须硬件,只用一个计算过程,可靠性高,不存在阻抗匹配问题,尤其是数字滤波可以对频率很高或很低的信号进行滤波,这是模拟滤波器做不到的。

(2) 数字滤波是用软件算法实现的,多输入通道可用一个软件“滤波器”从而降低系统开支。

(3) 只要适当改变软件滤波器的滤波程序或运行参数,就能方便地改变其滤波特性,这个对于低频、脉冲干搅、随机噪声等特别有效。


常用的数字滤波器算法有程序判断法、中值判断法、算术平均值法、加权滤波法、滑动滤波法、低通滤波法和复合滤波法。

1. 程序判断法:

程序判断法又称限副滤波法,其方法是把两次相邻的采样值相减,求出其增量(以绝对值表示)。然后与两次采样允许的最大差值△Y进行比较,△Y的大小由被测对象的具体情况而定,若小于或等于△Y,则取本次采样的值;若大于△Y,则取上次采样值作为本次采样值,即

|yn - yn-1|≤△Y,则yn有效,

|yn -yn-1|>△Y,则yn-1有效。

式中 yn ——第n次采样的值;

Yn-1——第(n-1)次采样的值;

;△Y——相邻两次采样值允许的最大偏差。

设R1和R2为内部RAM单元,分别存放yn-1和yn,滤波值也存放在R2单元,采用MCS-51单片机指令编写的程序判断法子程序如下:付表1.

2. 中值 滤波法即对某一参数连续采样N次(一般N为奇数),然后把N次采样值按从小到大排队,再取中间值作为本次采样值。

设DATA为存放采样值的内存单元首地址,SAMP为存放滤波值的内存单元地址,N为采样值个数,用MCS-51指令编写的中值滤波子程
序如下:副表2.



3.算术平均值滤波算法

算术平均滤波法就是连续取N次采样值进行算术平均,其数学表达式是:

Y=∑yi

N

~y=1/N ∑ yi

i=1

式中 ~y——N个采样值的算术平

均值;

Yi ——第i个采样值;

设8次采样值依次存放在地址DATA开始的连续单元中,滤波结果保留在累加器A中,程序如下:副表3.



4.加权平均滤波法

算术平均滤波法存在前面所说的平滑和灵敏度之间的矛盾。采样次数太少,平滑效果差,次数太多,灵敏度下降,对参数的变化趋势不敏感。协调两者关系,可采用加权平均滤波,对连续N次采样值,分别乘上不同的加权系数之后再求累加和,加权系数一般先小后大,以突出后面若干采样的效果,加强系统对参数的变化趋势的辩识,各个加权系数均为小于1的小数,且满足总和等于1的约束条件,这样,加权运算之后的累加和即为有效采样值。为方便计算,可取各个加权系数均为整数,且总和为256,加权运算后的累加和除以256(即舍去低字节)后便是有效采样值 。

设每批采样8个数据,依次存放在地址DATA开始的单元中,个加权系数是用一个表格存放在ROM中,MCS-51指令编写的算术平均滤波程序如下:副表4.

5.滑动平均滤波法:

以上介绍的各种平均滤波算法有一个共同点,即每取得一个有效采样值必须连续进行若干次采样,当采样速度较慢(如双积分型A/D转换)或目标参数变化较快时,系统的实时性不能保证,滑动平均滤波算法只采样一次,将这一次采样值和过去的若干次采样值 一起求平均,得到的有效采样值即可投入使用,如果取N个采样值求平均,RAM中必须开辟N个数据的暂存区。每新采样一个数据便存入暂存区,同时去掉一个最老的数据,保持这N个数据始终是最近的数据,这种数据存放方式可以用环行队列结构方便的实现。设环行队列为40H-4FH连续16个单元,RO作为队尾指针,滤波程序如下:副表5.


6.低通滤波法:

将普通硬件RC低通滤波器的微分方程用差分方程来表求,变可以采用软件算法来模拟硬件滤波的功能,经推导,低通滤波算法如下:

Yn=a* Xn+ (1-a) *Yn-1

式中 Xn——本次采样值

Yn-1——上次的滤波输出值;

,a——滤波系数,其值通常远小于1;

Yn——本次滤波的输出值。

由上式可以看出,本次滤波的输出值主要取决于上次滤波的输出值 (注意不是上次的采样值,这和加权平均滤波是有本质区别的),本次采样值对滤波输出的贡献是比较小的,但多少有些修正作
用,这种算法便模拟了具体有教大惯性的低通滤波器功能。滤波算法的截止频率可用以下式计算:

fL= a/2Pit pi为圆周率 3.14…

式中 a——滤波系数;

, t——采样间隔时间;

例如:当t=0.5s(即每秒2次),a=1/32时;

fL=(1/32)/(2*3.14*0.5)=0.

01Hz

当目标参数为变化很慢的物理量时,这是很有效的。另外一方面,它不能滤除高于1/2采样频率的干搅信号,本例中采样频率为2Hz,故对1Hz以上的干搅信号应采用其他方式滤除,

低通滤波算法程序于加权平均滤波相似,但加权系数只有两个:a和1-a。为计算方便,a取一整数,1-a用256-a,来代替,计算结果舍去最低字节即可,因为只有两项,a和1-a,均以立即数的形式编入程序中,不另外设表格。虽然采样值为单元字节(8位A/D)。为保证运算精度,滤波输出值用双字节表示,其中一个字节整数,一字节小数,否则有可能因为每次舍去尾数而使输出不会变化。

设Yn-1存放在30H(整数)和31H(小数)两单元中,Yn存放在32H(整数)和33H(小数)中。滤波程序如下:副表6.



结束语:

微型计算机在仪器仪表系统中的成功应用,使传统的电子仪器以及复杂的跟踪测量装置发生了许多革命性变化。其中一个突出表现就是一个系统中包含了只能性运做。微机具有很强的分析和运算能力,智能系统可完成复杂的数据处理,智能系统采用软件硬件想结合的方法进行随机误差的数字滤波和系统误差的修正,可以实现实时的修正,效准测量数据,这些都是传统仪器难以比拟的。




相关文档
最新文档