单片机系统中数字滤波的算法

上传人:子 文档编号:43429699 上传时间:2018-06-06 格式:DOC 页数:21 大小:20.46KB
返回 下载 相关 举报
单片机系统中数字滤波的算法_第1页
第1页 / 共21页
单片机系统中数字滤波的算法_第2页
第2页 / 共21页
单片机系统中数字滤波的算法_第3页
第3页 / 共21页
单片机系统中数字滤波的算法_第4页
第4页 / 共21页
单片机系统中数字滤波的算法_第5页
第5页 / 共21页
点击查看更多>>
资源描述

《单片机系统中数字滤波的算法》由会员分享,可在线阅读,更多相关《单片机系统中数字滤波的算法(21页珍藏版)》请在金锄头文库上搜索。

1、单片机系统中数字滤波的算法单片机系统中数字滤波的算法单片机系统中数字滤波的算法【C 程序整理】 来源: 张小如 Jerry 的日志 随机误差是有随机干搅引起的,其特点是在相同条件下测量同一个量时,其大小和符号做无规则变化而无法预测,但多次测量结果符合统计规律。为克服随机干搅引入的误差,硬件上可采用滤波技术,软件上可以采用软件算法实现数字滤波,其算法往往是系统测控算法的一个重要组成部分,实时性很强,采用汇编语言来编写。采用数字滤波算法克服随机干搅引入的误差具有以下几个优点:(1)数字滤波无须硬件,只用一个计算过程,可靠性高,不存在阻抗匹配问题,尤其是数字滤波可以对频率很高或很低的信号进行滤波,这

2、是模拟滤波器做不到的。(2)数字滤波是用软件算法实现的,多输入通道可用一个软件“滤波器”从而降低系统开支。(3)只要适当改变软件滤波器的滤波程序或运行参数,就能方便地改变其滤波特性,这个对于低频、脉冲干搅、随机噪声等特别有效。常用的数字滤波器算法有程序判断法、中值判断法、算术平均值法、加权滤波法、滑动滤波法、低通滤波法和复合滤波法。1 程序判断法:程序判断法又称限副滤波法,其方法是把两次相邻的采样值相减,求出其增量(以绝对值表示) 。然后与两次采样允许的最大差值Y进行比较,Y 的大小由被测对象的具体情况而定,若小于或等于Y,则取本次采样的值;若大于Y,则取上次采样值作为本次采样值,即yn -

3、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 单片机指令编写的程序判断法子程序如下:付表2 中值滤波法即对某一参数连续采样 N 次(一般 N 为奇数) ,然后把 N 次采样值按从小到大排队,再取中间值作为本次采样值。设 DATA 为存放采样值的内存单元首地址,SAMP 为存放滤波值的内存单元地址,N 为采样值个数,用 MCS-51 指令编写的中值滤波子程序

4、如下:副表3算术平均值滤波算法算术平均滤波法就是连续取 N 次采样值进行算术平均,其数学表达式是:Y=yiy=1/N yii=1N式中 yN 个采样值的算术平均值;Yi 第 i 个采样值;设 8 次采样值依次存放在地址 DATA 开始的连续单元中,滤波结果保留在累加器 A 中,程序如下:副表4.加权平均滤波法算术平均滤波法存在前面所说的平滑和灵敏度之间的矛盾。采样次数太少,平滑效果差,次数太多,灵敏度下降,对参数的变化趋势不敏感。协调两者关系,可采用加权平均滤波,对连续 N 次采样值,分别乘上不同的加权系数之后再求累加和,加权系数一般先小后大,以突出后面若干采样的效果,加强系统对参数的变化趋势

5、的辩识,各个加权系数均为小于 1 的小数,且满足总和等于 1 的约束条件,这样,加权运算之后的累加和即为有效采样值。为方便计算,可取各个加权系数均为整数,且总和为 256,加权运算后的累加和除以256(即舍去低字节)后便是有效采样值。设每批采样 8 个数据,依次存放在地址 DATA 开始的单元中,各加权系数是用一个表格存放在 ROM 中,MCS-51 指令编写的算术平均滤波程序如下:副表5.滑动平均滤波法:以上介绍的各种平均滤波算法有一个共同点,即每取得一个有效采样值必须连续进行若干次采样,当采样速度较慢(如双积分型 A/D转换)或目标参数变化较快时,系统的实时性不能保证,滑动平均滤波算法只采

6、样一次,将这一次采样值和过去的若干次采样值一起求平均,得到的有效采样值即可投入使用,如果取 N 个采样值求平均,RAM 中必须开辟 N 个数据的暂存区。每新采样一个数据便存入暂存区,同时去掉一个最老的数据,保持这 N 个数据始终是最近的数据,这种数据存放方式可以用环行队列结构方便的实现。设环行队列为 40H-4FH 连续 16 个单元,RO 作为队尾指针,滤波程序如下:副表6.低通滤波法:将普通硬件 RC 低通滤波器的微分方程用差分方程来表求,变可以采用软件算法来模拟硬件滤波的功能,经推导,低通滤波算法如下:Yn=a* Xn+ (1-a) *Yn-1式中 Xn本次采样值Yn-1上次的滤波输出值

7、;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 采样

8、频率的干搅信号,本例中采样频率为2Hz,故对 1Hz 以上的干搅信号应采用其他方式滤除,低通滤波算法程序于加权平均滤波相似,但加权系数只有两个:a和 1-a。为计算方便,a 取一整数,1-a 用 256-a,来代替,计算结果舍去最低字节即可,因为只有两项,a 和 1-a,均以立即数的形式编入程序中,不另外设表格。虽然采样值为单元字节(8 位 A/D) 。为保证运算精度,滤波输出值用双字节表示,其中一个字节整数,一字节小数,否则有可能因为每次舍去尾数而使输出不会变化。设 Yn-1 存放在 30H(整数)和 31H(小数)两单元中,Yn 存放在32H(整数)和 33H(小数)中。滤波程序如下:副表

9、结束语:微型计算机在仪器仪表系统中的成功应用,使传统的电子仪器以及复杂的跟踪测量装置发生了许多革命性变化。其中一个突出表现就是一个系统中包含了智能性运作。微机具有很强的分析和运算能力,智能系统可完成复杂的数据处理,智能系统采用软件硬件想结合的方法进行随机误差的数字滤波和系统误差的修正,可以实现实时修正,较准测量数据,这些都是传统仪器难以比拟的。#include #include #include #include #include “source.h“main()filter_1();filter_2();filter_3();filter_4();filter_5();filter_6();

10、filter_7();filter_8();filter_9();filter_10();unsigned char get_ad(void)static unsigned char i;return i+;void delay(void)unsigned char i=0;while(1)i+;if(i20) return;#define A 10 /设置两次采样允许的最大偏差值char value; /上次采用后的有效值变量char filter_1(void)char new_value; /本次采样值变量new_value=get_ad(); /读入本次采样值if(new_value-

11、valueA)|(value-new_valueA) /比较是否超出最大偏差值return value; /如果超出,返回上次的有效值作为本次的有效值return new_value;/ 如果没有超出,返回本次的采样值作为本次的有效值#define N 11 /设置连续采样的次数char filter_2(void)char value_bufN; /缓存 N 次采样值的存储变量char count,i,j,temp; /i,j 是冒泡排序的下标变量,count 是采样数据读入的下标变量/temp 是临时变量for(count=0;countvalue_bufi+1)temp=value_bu

12、fi;value_bufi=value_bufi+1;value_bufi+1=temp;return value_buf(N-1)/2; /将排序后 N 个采样值的中间值作为最后结果返回#undef N#define N 12 /设置每组参与平均运算的采样值个数char filter_3()int sum=0; /求和变量,用于存储采样值的累加值char count;/采样数据读入的下标变量for(count=0;countvalue_bufi+1 )temp = value_bufi;value_bufi = value_bufi+1;value_bufi+1 = temp;for(cou

13、nt=1;countA)|(value-new_valueA) /比较是否超出最大偏差值new_value=value; /如果超出,返回上次的有效值作为本次的有效值sum+=new_value; /累加采样的有效值value=new_value;delay();return (char)(sum/N); /将累加值进行平均计算作为返回值#define COE 50 /定义加权系数char value; /上一个采样值变量char filter_7()char new_value; /本次采样值变量new_value = get_ad();return (100-COE)*value + CO

14、E*new_value; /返回的本次滤波结果#undef N#define N 12 /设置 FIFO 队列的长度char code coeN = 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_8()char count; /采样数据读入的下标变量char value_bufN; /缓存 N 个采样值的存储变量int sum=0; /求和变量,用于存储采样值的累加值for (count=0;count=N) return new_value; /如果本次采

15、样值与当前有效值不相等,/且计数器溢出,返回本次采样值delay();new_value = get_ad();return value; /如果本次采样值与当前有效值相等,则返回当前有效值#undef A#undef N#define A 10 /设置两次采样允许的最大偏差值#define N 12 /设置计数器溢出值char value; /有效值变量char filter_10()char count=0; /计数变量char new_value; /本次采样值变量new_value = get_ad(); /读入本次采样值if(new_value-valueA)|(value-new_valueA) /比较是否超出最大偏差值new_value=value; /如果超出,返回有效值作为本次的采样有效值while (value !=new_value);count+; /计数器加 1if (count=N) return new_value; /如果本次采样值与当前有效值不相等,/且计数器溢出,返回本次采样值delay();new_value = get_ad();return value; /如果本次采样值与当前有效值相等,则返回当前有效值

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 生活休闲 > 科普知识

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号