Fir低通滤波实验报告Word文档格式.docx
《Fir低通滤波实验报告Word文档格式.docx》由会员分享,可在线阅读,更多相关《Fir低通滤波实验报告Word文档格式.docx(22页珍藏版)》请在冰豆网上搜索。
协同软件仿真
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.1FIR滤波器的基本结构
FIR滤波器[7]的单位抽样响应为有限长度,一般采用非递归形式实现。
通常的FIR数字滤波器有横截性和级联型两种。
FIR滤波器实现的基本结构有:
(1)FIR滤波器的横截型结构
表示系统输入输出关系的差分方程可写作:
直接由差分方程得出的实现结构如图2-2所示:
图1-1、横截型(直接型﹑卷积型)
若h(n)呈现对称特性,即此FIR滤波器具有线性相位,则可以简化加横截型结构,下面分情况讨论:
图1-2、N为奇数时线形相位实现结构图1-3、N为偶数时线性相位实现结构
(2)FIR滤波器的级联型结构
将H(z)分解成实系数二阶因子的乘积形式:
(1-1)
这时FIR滤波器可用二阶节的级联结构来实现,每个二阶节用横截型结构实现。
如图所示:
图1-4、FIR滤波器的级联结构
这种结构的每一节控制一对零点,因而在需要控制传输零点时可以采用这种结构。
1.2FIR数字滤波器的设计方法
IIR滤波器[7]的优点是可利用模拟滤波器设计的结果,缺点是相位是非线性的,若需要线性相位,则要用全通网络进行校正。
FIR滤波器的优点是可方便地实现线性相位。
FIR滤波器单位冲激响应h(n)的特点:
其单位冲激响应h(n)是有限长(
),系统函数为:
(1-2)
在有限Z平面有(N-1)个零点,而它的(N-1)个极点均位于原点z=0处。
Fir滤波器线性相位的特点:
如果FIR滤波器的单位抽样响应h(n)为实数,而且满足以下任一条件:
偶对称h(n)=h(N-1-n)
奇对称h(n)=-h(N-1-n)
其对称中心在n=(N-1)/2处,则滤波器具有准确的线性相位。
窗函数设计法:
一般是先给定所要求的理想滤波器频率响应
,由
导出
,我们知道理想滤波器的冲击响应
是无限长的非因果序列,而我们要设计的是
是有限长的FIR滤波器,所以要用有限长序列
来逼近无限长序列
,设:
(1-3)
常用的方法是用有限长度的窗函数w(n)来截取
即:
(1-4)
这里窗函数就是矩形序列RN(n),加窗以后对理想低通滤波器的频率响应将产生什么样的影响呢?
根据在时域是相乘关系,在频域则是卷积关系:
(1-5)
其中,
为矩形窗谱,
是FIR滤波器频率响应.
通过频域卷积过程看
的幅度函数H(ω)的起伏现象,可知,加窗处理后,对理想矩形的频率响应产生以下几点影响:
(1)使理想频率特性不连续点处边沿加宽,形成一个过渡带,其宽度等于窗的频率响应的主瓣宽度。
(2)在截止频率的两边的地方即过渡带的两边,出现最大的肩峰值,肩峰的两侧形成起伏振荡,其振荡幅度取决于旁瓣的相对幅度,而振荡的多少,则取决于旁瓣的多少。
(3)改变N,只能改变窗谱的主瓣宽度,改变ω的坐标比例以及改变的绝对值大小,但不能改变主瓣与旁瓣的相对比例(此比例由窗函数的形状决定)。
(4)对窗函数的要求
a、窗谱主瓣尽可能窄,以获取较陡的过渡带;
b、尽量减小窗谱的最大旁瓣的相对幅度;
即能量集中于主瓣,使肩峰和波纹减小,增大阻带的衰减。
频率采样法:
窗函数设计法是从时域出发,把理想的hd(n)用一定形状的窗函数截取成有限长的h(n),来近似理想的hd(n),这样得到的频率响应
逼近于所要求的理想的频率响应
。
频率抽样法则是从频域出发,把给定的理想频率响应
加以等间隔抽样得到
,然后以此
作为实际FIR滤波器的频率特性的抽样值H(k),即
(1-6)
知道H(k)后,由DFT定义可唯一确定有限长序列h(n),利用这N个频域抽样值H(k)同样利用频率内插公式可得FIR滤波器的系统函数H(z),及频率响应
,即:
频率抽样法内插公式:
(1-7)
频率抽样法小结
优点:
可以在频域直接设计,并且适合于最优化设计。
缺点:
抽样频率只能等于2π/N的整数倍,或等于2π/N的整数倍加上π/N。
因而不能确保截止频率
的自由取值,要想实现自由地选择截止频率,必须增加抽样点数N,但这又使计算量增大。
为了提高逼近质量,减少通带边缘由于抽样点的陡然变化而引起的起伏振荡。
有目的地在理想频率响应的不连续点的边缘,加上一些过渡的抽样点,增加过渡带,减少起伏振荡。
2系统硬件电路
图1-5、系统原理框图
2.1复位电路设计
图2-1、复位电路
2.2电源电路设计
图2-2、电源电路
2.3JTAG电路设计及时钟电路设计
图2-3、JTAG电路设计及时钟电路
3系统软件设计
图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->
FilterDesign->
FilterDesign&
AnalysisTools(fdatool),启动滤波器分析器。
启动成功后界面如图4-5
图4-5
7、在选项中选择或输入滤波器参数,完成后单机“DesignFilter”按钮,实现滤波器设计。
结果如图4-6
图4-6
8、从MATLAB中导出FIR滤波器系数。
a.在Fdatool中,选择Targets->
GenerateCheader,产生如下图4-7界面:
图4-7
b.点击“Exportas”,输出系数类型选择为Signed16-bitinteger。
然后点击“Generate”,选择路径,即可输出前一步设计出的FIR滤波器的系数表。
(假设生成的系数表文件为fdacoefs.h)
4.2CCS仿真
1、打开CCS软件,新建工程。
2、编写C语言程序、cmd文件,完成后导入工程。
3、导入rts.lib文件,在...\ti\c5400\cgtool\lib文件夹下。
4、在编译成功并完成工程建立后产生*.Out文件,在File->
LoadProgram里打开。
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个步骤,改变图形选项中的DisplayType、StartAddress,出现如下图形:
图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));
%滤波后频谱
plot(df,ysignal)
%滤波数据导出
xout=x/max(x);
%归一化
xto_css=round(32767*xout);
%数据取整
fid=fopen('
input.dat'
'
w'
);
%打开文件
fprintf(fid,'
16511000\n'
%输出文件头
%d\n'
xto_css);
%输出
fclose(fid);
二、CCS源代码:
Iirh.c:
#include"
stdio.h"
fdacoefs.h"
//头文件包含滤波器的系数
#defineN81//定义滤波器的阶数为81阶
#defineLength200//定义缓冲区数组大小为200
longyn;
intinput[Length];
//存放输入数据
intoutput[Length];
//存放输出数据
voidmain()
{
inti,j;
int*x;
for(j=0;
j<
Length-1;
j++)//循环导入数据
{
x=&
input[j];
//指针指向每次导入的数据
yn=0;
//每做完一次乘累加后,把值赋给output数组后,从新归0
for(i=0;
i<
N-1;
i++)
yn+=B[i]*(*x++);
//做N次的乘累加
output[j]=yn>
15;
//把值赋给output数组
}
while
(1);
//做完滤波后使程序保持在本循环中
}
三、CCS命令文件:
MEMORY
PAGE0:
/*programspace*/
VECS:
origin=0x0100,length=0x0200/*128bytesvectortablespace*/
PROG:
origin=0x0300,length=0x1F00/*8Kprogrammemoryspace*/
PAGE1:
/*dataspace*/
STCK:
origin=0x2000,length=0x0800/*1Kwordsforstack*/
DAT1:
origin=0x2800,length=0x0100/*256wordsforsysdata*/
DAT2:
origin=0x2900,length=0x1000/*12Kwordsforappldata*/
SECTIONS
.vectors:
{}>
VECSPAGE0/*interruptvectortable*/
.text:
PROGPAGE0/*programcode*/
.coeffs:
PROGPAGE0/*initializedparameters*/
.data:
DAT2PAGE1/*initializeddata*/
.stack:
STCKPAGE1/*softwarestacksection*/
.variable:
DAT1PAGE1/*uninitializedvarsforDSP&
AIC10*/