CHANGCHUN INSTITUTE OF TECHNOLOGY
设计题目: FIR数字低通滤波器 学生姓名: 胡扬、李元林、黄一师、周通 学院名称: 长春工程学院 专业名称: 电子信息工程 班级名称: 电子1041 学 号: 35、29、34、8 完成时间: 2013-12-11
2013年 12月 11日
任务分配表
班级 学号 姓名 完成主要任务 电子1041 电子1041 电子1041 电子1041 35 胡扬 程序调试及 软件仿真 29 李元林 Protel原理图 及PCB图 34 黄一师 整理报告、 协同软件仿真 8 周通 查找资料 理论研究 FIR数字低通滤波器
胡扬、李元林、黄一师、周通 (电子1041:35、29、34、8)
摘 要:
本文设计了一个一种基于Matlab和CCS软件的FIR数字低通滤波器,符合通带边界频率8600Hz,阻带边界频率12000Hz,通带最大衰减3db,阻带最小衰减80db的技术指标。文中深入分析了该滤波器系统设计的功能特点、实现原理以及技术关键,阐述了使用MATLAB进行Fir低通滤波器设计及仿真的具体方法。最后把整个设计方案用CCS编写代码并用Matlab和CCS联合进行仿真。仿真结果与理论相符,因此,该设计方法实现了FIR数字低通滤波。
关键词:Fir数字低通滤波器 TMS320VC54xx
0 引言
随着电子技术的飞速发展,人们正逐步进入数字化时代,数字滤波器越来越受到人们的关注,并且在近代电信设备和各类控制系统中的应用极为广泛,如语音处理、图像处理、通信、电视、雷达、生物医学信号处理等。数字滤波器根据其冲激响应函数的时域特性,可分为有无限长单位冲激响应(IIR)滤波器和有限长单位冲击响应(FIR)滤波器。IIR滤波器虽然可以利用模拟滤波器设计的结果,方便简单,但它的相位是非线性的。图像处理以及数据传输都要求信道具有线性相位,同时又可以具有任意的幅度特性,而FIR滤波器的单位冲激响应是有限长的,因而滤波器一定是稳定的。随着Matlab软件和信号处理工具箱的不断完善,可以利用Matlab信号处理工具箱快速有效地实现数字滤波器的设计、分析和仿真。 1 系统原理及设计方法
1.1 FIR滤波器的基本结构
FIR滤波器[7]的单位抽样响应为有限长度,一般采用非递归形式实现。通常的FIR数字滤波器有横截性和级联型两种。
FIR滤波器实现的基本结构有: (1)FIR滤波器的横截型结构
表示系统输入输出关系的差分方程可写作:
y(n)h(m)x(nm)
m0N1
直接由差分方程得出的实现结构如图2-2所示:
图1-1、 横截型(直接型﹑卷积型)
若h(n)呈现对称特性,即此FIR滤波器具有线性相位,则可以简化加横截型结构,下面分情况讨论:
图1-2、N为奇数时线形相位实现结构 图1-3、N为偶数时线性相位实现结构
(2)FIR滤波器的级联型结构
将H(z)分解成实系数二阶因子的乘积形式:
(1-1)
N0k1
这时FIR滤波器可用二阶节的级联结构来实现,每个二阶节用横截型结构实现。如图所示:
N]2H(z)h(n)zNb0kb1kz1b2kz2
N1[
图1-4、 FIR滤波器的级联结构
这种结构的每一节控制一对零点,因而在需要控制传输零点时可以采用这种结构。
1.2 FIR数字滤波器的设计方法
IIR滤波器[7]的优点是可利用模拟滤波器设计的结果,缺点是相位是非线性的,若需要线性相位,则要用全通网络进行校正。FIR滤波器的优点是可方便地实现线性相位。 FIR滤波器单位冲激响应h(n)的特点: 其单位冲激响应h(n)是有限长(
N1n0),系统函数为:
H(z)h(n)zn
在有限Z平面有(N-1)个零点,而它的(N-1)个极点均位于原点z=0处。 Fir滤波器线性相位的特点:
(1-2)
如果FIR滤波器的单位抽样响应h(n)为实数,而且满足以下任一条件:
偶对称h(n)=h(N-1-n) 奇对称h(n)=-h(N-1-n)
其对称中心在n=(N-1)/2处,则滤波器具有准确的线性相位。 窗函数设计法:
一般是先给定所要求的理想滤波器频率响应Hd(ej),由Hd(ej)导出hd(n),我们知道理想滤波器的冲击响应hd(n)是无限长的非因果序列,而我们要设计的是hd(n)是有限长的FIR滤波器,所以要用有限长序列hd(n)来逼近无限长序列hd(n),设:
1hd(n)2Hd(ej)ejd
即:
(1-3)
常用的方法是用有限长度的窗函数w(n)来截取
h(n)(n)hd(n)
(1-4)
这里窗函数就是矩形序列RN(n),加窗以后对理想低通滤波器的频率响应将产生什么样的影响呢?根据在时域是相乘关系,在频域则是卷积关系: 其中,
H(ej)12Hd(ej)WR[ej()]d
(1-5)
为矩形窗谱, H(e)是FIR滤波器频率响应.
的幅度函数H(ω)的起伏现象,可知,加窗处理后,对理想
j 通过频域卷积过程看
矩形的频率响应产生以下几点影响:
(1)使理想频率特性不连续点处边沿加宽,形成一个过渡带,其宽度等于窗的频率响应的主瓣宽度。
(2)在截止频率的两边的地方即过渡带的两边,出现最大的肩峰值,肩峰的两侧形成起伏振荡,其振荡幅度取决于旁瓣的相对幅度,而振荡的多少,则取决于旁瓣的多少。(3)改变N,只能改变窗谱的主瓣宽度,改变ω的坐标比例以及改变的绝对值大小,但不能改变主瓣与旁瓣的相对比例(此比例由窗函数的形状决定)。 (4)对窗函数的要求
a、窗谱主瓣尽可能窄,以获取较陡的过渡带;
b、尽量减小窗谱的最大旁瓣的相对幅度;即能量集中于主瓣,使肩峰和波纹减小,增大阻带的衰减。
频率采样法:
窗函数设计法是从时域出发,把理想的hd(n)用一定形状的窗函数截取成有限长的h(n),来近似理想的hd(n),这样得到的频率响应
。
频率抽样法则是从频域出发,把给定的理想频率响应,然后以此
加以等间隔抽样得到
逼近于所要求的理想的频率响应
作为实际FIR滤波器的频率特性的抽样值H(k),即
Hd(k)Hd(ejw)|2k N(1-6)
知道H(k)后,由DFT定义可唯一确定有限长序列 h(n),利用这N个频域抽样值H(k)同样利用频率内插公式可得FIR滤波器的系统函数H(z),及频率响应 频率抽样法内插公式:
频率抽样法小结
优点:可以在频域直接设计,并且适合于最优化设计。
,即:
1zNH(z)NH(k) k1k01WNzN1(1-7)
缺点:抽样频率只能等于 2π/N 的整数倍,或等于2π/N 的整数倍加上π/N。因而不能
确保截止频率
的自由取值,要想实现自由地选择截止频率,必须增加抽样点数N,但这
又使计算量增大。
为了提高逼近质量,减少通带边缘由于抽样点的陡然变化而引起的起伏振荡。有目的地在理想频率响应的不连续点的边缘,加上一些过渡的抽样点,增加过渡带,减少起伏振荡。 2 系统硬件电路
电源 复位
Matlab产生的 DSP 复合信号 TMS320C54x
时钟
图 1-5、系统原理框图
2.1 复位电路设计
JTAG SRAM
图 2-1、复位电路
2.2 电源电路设计
图2-2、电源电路 2.3 JTAG电路设计及时钟电路设计
图2-3、 JTAG电路设计及时钟电路
3 系统软件设计
开始产生输入数据初始化DSP读入新数据并存放到栈顶滤波处理保存滤波结果到输出单元待滤波的样本点数处理完成否是结束
图 3-1、系统主流程图 4 系统调试与结果分析 4.1、Matlab仿真结果
1、利用MATLAB编写程序产生一个由三种频率信号复合的信号;
2、程序运行产生此混合信号的时域图;
图 4-1
3、混合信号的频域图;
图 4-2
4、混合信号经滤波器后的时域图;
图 4-3
5、混合信号经滤波器后的频域图;
图 4-4
6、用Matlab自带的滤波器设计工具FDAtool设定FIR低通滤波器类型及参数。
在MATLAB左下角的Start菜单中选择Toolboxes->Filter Design->Filter Design & Analysis Tools(fdatool),启动滤波器分析器。启动成功后界面如图4-5
图 4-5
7、在选项中选择或输入滤波器参数,完成后单机“Design Filter”按钮,实现滤波器设计。结果如图4-6
图 4-6
8、从MATLAB中导出FIR滤波器系数。
a.在Fdatool中,选择Targets->Generate C header,产生如下图4-7界面:
图4-7
b.点击“Export as”,输出系数类型选择为Signed 16-bit integer。然后点击“Generate”,选择路径,即可输出前一步设计出的FIR滤波器的系数表。(假设生成的系数表文件为fdacoefs.h)
4.2 CCS仿真
1、打开CCS软件,新建工程。
2、编写C语言程序、cmd文件,完成后导入工程。
3、导入rts.lib文件,在...\i\\c5400\\cgtool\\lib文件夹下。
4、在编译成功并完成工程建立后产生*.Out文件,在File->Load Program里打开。 5、选择File->Data->Load...打开MATLAB生成的input.dat文件。 6、将Address设置为input,Length设置为200,Page设置为Data。
7、运行程序,点击按钮,程序即开始运行。
8、打开View->Graph->Time/Frequency,设置参数图如图4-9:
图 4-8
9、重复前3个步骤,改变图形选项中的Display Type、Start Address,出现如下图形:
图 4-9、输入数据时域图
图 4-10、输出数据时域图
图 4-11、输入数据频谱
图4-12、输出数据频谱
5 结论
本次实习我们成功实现数字信号的Fir低通滤波,当然在这过程中我们遇到了很多困难,尤其是调试程序时,花费了好几天时间,一开始总是Build不成功,后来发现是确少Matlab产生的数据文件和相应头文件,后来通过上网查资料以及和同学讨论最终解决。并且通过本次的课程设计,我明白了细节决定成败这句话的道理,在实验中,有很多注意的地方,都被我忽视了,导致我再花费时间去修改,这严重影响了我试验的进度。同时,在实验中我了解了FIR滤波器的原理,熟练掌握了MATLAB的操作,不仅是我学到了知识,更锻炼了我的动手能力。也进一步认识了CCS 软件的使用,了解了各种窗函数对滤波器特性的影响。
参考文献:
(1)程佩青; <<数字信号处理教程>> 清华大学出版社. (2)吴镇扬;<<数字信号处理>>; 高等教育出版社. (3)胡广书; <<数字信号处理导论 >>; 清华大学出版社.
(4)高西全,丁玉美.数字信号处理.3版.西安:西安电子科技大学出版社,2008年 (6)楼顺天,李伯菡. 基于Matlab的系统分析与设计. 西安;西安电子科技大学出版社.
(7)周浩敏,王睿. 测试信号处理技术. 北京航空航天大学出版社.
附录一:protel原理图
附录二:程序源代码
一、Matlab代码: sl=500; %有效信号 ns1=5000; %高频噪声1 ns2=10000; %高频噪声2 fs=25000; %采样频率 N=800; %序列长度 T=1/fs; %采样周期 n=0:N; %序列的长度范围
signal=sin(2*pi*sl*n*T); %离散序列
noise1=0.7*sin(2*pi*ns1*n*T); noise2=0.4*sin(2*pi*ns2*n*T); x=(signal+noise1+noise2);%待滤波信号 subplot(2,2,1), plot(x)
subplot(2,2,2),
y=abs(fft(x));%待滤波频谱做1000点FFT,显示幅频特性 df=n*(fs/N); plot(df,y)
subplot(2,2,3),
plot(signal) %所需信号的离散信号的图形
subplot(2,2,4),
ysignal=abs(fft(signal));%滤波后频谱 df=n*(fs/N); plot(df,ysignal)
%滤波数据导出
xout=x/max(x); %归一化 xto_css=round(32767*xout);%数据取整 fid=fopen('input.dat','w'); %打开文件
fprintf(fid,'1651 1 0 0 0\\n');%输出文件头
fprintf(fid,'%d\\n',xto_css); %输出 fclose(fid); 二、CCS源代码: Iirh.c:
#include\"stdio.h\"
#include\"fdacoefs.h\" //头文件包含滤波器的系数
#define N 81 //定义滤波器的阶数为81阶
#define Length 200 //定义缓冲区数组大小为200 long yn;
int input[Length]; //存放输入数据 int output[Length]; //存放输出数据
void main() { int i,j; int *x;
for(j=0;j { x=&input[j]; //指针指向 DAT1: origin = 0x2800, length = 0x0100 /* 256 words for sys data */ DAT2: origin = 0x2900, length = 每次导入的数据 yn=0; //每做完一次乘累加后, 0x1000 /* 12K words for appl data */ 把值赋给output数组后,从新归0 for(i=0;i 累加 output[j]=yn>>15; //把值赋给 output数组 } while(1); //做完滤波后使程序保持在本循环中 } 三、CCS命令文件: MEMORY { PAGE 0: /* program space */ VECS: origin = 0x0100, length = 0x0200 /* 128bytes vector table space */ PROG: origin = 0x0300, length = 0x1F00 /* 8K program memory space */ PAGE 1: /* data space */ STCK: origin = 0x2000, length = 0x0800 /* 1K words for stack */ } SECTIONS { .vectors : {} > VECS PAGE 0 /* interrupt vector table */ .text : {} > PROG PAGE 0 /* program code */ .coeffs : {} > PROG PAGE 0 /* initialized parameters */ .data : {} > DAT2 PAGE 1 /* initialized data */ .stack : {} > STCK PAGE 1 /* software stack section */ .variable : {} > DAT1 PAGE 1 /* uninitialized vars for DSP&AIC10 */ } 因篇幅问题不能全部显示,请点此查看更多更全内容