1、皖西学院1皖 西 学 院 课程设计报告书 系 别 : 机电系 专 业 : 电气技术与自动化 学 生 姓 名 : 孙星月 学号: 2008010782 课程设计题目:防脉冲干扰移动平均值法数字滤波器算法及其程序设计 起 迄 日 期 : 6 月 12 日 6 月 25 日 课程设计地点: 计算机房 指 导 教 师 : 杜成涛 设计任务完成日期: 2011 年 6 月 23 日 皖西学院2皖西学院课程设计任务2010-2011 学年第 2 学期专业 电气工程及其自动化 班级 0802课程名称微型计算机原理与接口技术 课程类别必修设计时间2011 年 6 月 13 日2011 年 6 月 26 日一、
2、课程题目: 防脉冲干扰移动平均值法数字滤波器算法及其程序设计二、课程设计目的:微机应用课程设计电气工程及其制动化专业本科生重要的实践环节,在学习了与修课程的基础上,综合运用各种所学的软件,通过学生独立进行某一课题的设计和调试,理解和掌握相关软件的使用方法,运用软件的理论和方法,初步掌握汇编程序以及其他使用软件的设计方法和步骤,培养独立思考,深入研究,分析问题,解决问题的能力。熟悉所采用汇编语言基础知识,基本编程方法和技巧,设计出课题所要求的算法并编程实现。3、设计任务概述:1.熟悉设计任务,查找资料熟悉相关设计的方法2.选择最佳的设计方案3.程序编写及调试4.撰写设计报告,调试报告,设计心得体
3、会四、设计计划与时间安排:防脉冲干扰移动平均值法数字滤波器算法及其程序设计主要内容包括:理论设计、调试或仿真、撰写设计报告等。其中理论设计又包括选择总体方案、软件系统设、计算参数等;软件设计包括模块化层次结构图,程序流程图。程序设计是课程设计的关键环节,通过调试进一步完善程序设计,使之达到课题所要求的指标。课程设计的最后要求是写出设计总结报告,把理论设计内容,调试的过程及性能指标的测试结果进行全面的总结,把实践内容上升到理论高度。皖西学院3目 录一、课程任务 .2二、摘要 .4三、算法设计 .4四、软件编程 .5五、 程序调试 .11六、设计心得 .12七、参考文献 .14防脉冲干扰移动平均值
4、法数字滤波器算法及其程序设计皖西学院4摘 要数据采集,又称数据获取,是利用一种装置,从系统外部采集数据并输入到系统内部的一个接口。数据采集技术广泛引用在各个领域。比如摄像头,麦克风,都是数据采集工具。被采集数据是已被转换为电讯号的各种物理量,如温度、水位、风速、压力等,可以是模拟量,也可以是数字量。在互联网行业快速发展的今天,数据采集已经被广泛应用于互联网及分布式领域,数据采集领域已经发生了重要的变化。而在数据采集中存在着各种干扰。滤除干扰的方法有很多种,既有数字滤波器,也有模拟滤波器。我们针对数据采集系统中经常出现的随机干扰,这里我们采用了 C语言来设计并开发数字滤波系统。关键词:C 语言、
5、数字滤波。算法设计在许多的数据采集系统中,现场的强电设备较多,不可避免地会产生尖脉冲干扰,这种干扰一般持续时间短,峰值大,对这样的数据进行数字滤波处理时,仅仅采用算术平均或移动平均滤波时,尽管对脉冲干扰进行了 1/n 的处理,但,其剩余值仍然较大。这种场合最好的策略是:将被认为受干扰的信号数据去掉,这就是防脉冲干扰平均值滤波法的原理。算术平均滤波法适用于对一般的具有随机干扰的信号进行滤波。这种信号的特点是信号本身在某一数值范围附近上下波动,如测量流量、液位时经常遇到这种情况。算术平均滤波法是要按输入的 N 个采样数据,寻找这样一个 Y,使得 Y 与各个采样值之间的偏差的平方和最小。具体实现此算
6、法的程序如下:#define N 12 char filter()int count;int sum=0;皖西学院5for(count=0;countk,用移位的方法,可以加快处理速度。上述算法显然还存在一个不足之处,就是每采集一个数据就要进行一次排序,这样会大量占用系统宝贵的时间。这可以通过存储当前数据中的最大值和最小值来改进。具体做法是:系统中用两个变量来存储当前 n 个数据的最大值和最小值在这个数组中的偏移量(也就是数组下标,存储数组下标而直接不存储数据本身是因为:在一般的系统中,n 不会超无符号短整形的表示范围,因此用一个 char 形变量就可以存储而如果直接存储数据本身,则许多情况下
7、要用 int 形变量,甚至更长的类型)。这样只要在当前输入的数据将要覆盖的数据正好是当前的最大值或最小值时才在下个组中查找最大值或最小值,而其他情况下则只要将输入的数据与最大值和最小值比较就可以修改下最大值和最小值了,而且不用进行数据排序。这个算法很简单,下面是对应的 C 语言代码实现,可以很方便的应用的具体的 51 单片机,或其他处理器上,只须做少量的修改。软件编程皖西学院61、 软件设计步骤皖西学院72、程序流程图皖西学院82、软件程序#include#define dtype unsigned int /采集数据的数据类型#define LEN 6 /移动算术平均的个数+2=SHIFT=
8、8, 因此用指针记录而不是直接记录最大值和最值dtype szlb(dtype _data)/*/* 在调用此子程序前必须对*/* pdata,datas数组, */* pmax,pmin进行初始化 */*/ char i;dtype average=0; /清零,用来计算平均值 pdata=(pdata+1)%LEN; /指针下标在到LEN-1上滑动dataspdata=_data; /采样所得数据存入数据表中皖西学院9for(i=0;idataspmax)pmax=pdata; /得到最大值的指针 else if(_datadataspmax)pmax=i;else if(pdata=pm
9、in) /如果当前输入值将存入当前最小值的位置时 /由以上方法将不可行,必须从其他位置中查找极值for(i=0;iSHIFT); /求算术平均值void main()char i;dtype _data;pdata=0;pmax=0;皖西学院10pmin=0;for(i=0;iLEN;i+)datasi=0;printf(“数据: 最大 最小n“ );while(1)scanf(“%u“,szlb(_data);for(i=0;iLEN;i+)printf(“%-3u “,datasi);printf(“ %-3u %-3u“,dataspmax,dataspmin);printf(“n“);程序调试