DSP实验结果及
分析
定性数据统计分析pdf销售业绩分析模板建筑结构震害分析销售进度分析表京东商城竞争战略分析
《DSP技术及应用》实验指导
实验一 CCS开发环境的使用 【实验目的】
1.熟悉Code Composer Studio开发环境,了解相关的开发工具。
2.掌握DSP软件开发
流程
快递问题件怎么处理流程河南自建厂房流程下载关于规范招聘需求审批流程制作流程表下载邮件下载流程设计
。通过使用CCS软件,学会创建
工程
路基工程安全技术交底工程项目施工成本控制工程量增项单年度零星工程技术标正投影法基本原理
、编译、连接工程
3.掌握CCS软件的调试方法。学习使用CCS的探针和断点调试工程,能够用图形窗口观察数据。
【实验原理】
CCS (Code Composer Studio)是TI公司为其TMS320系列DSP提供的一个高度集成的软件开发和调试环境,它将DSP工程项目管理、源代码的编辑、目标代码的生成、调试和分析都打包在一个环境中,使其可以基本涵盖软件开发的每一个环节。CCS主要包括以下工具:
1. C编译器、汇编优化器和连接器(代码生成工具)
2.指令集仿真器(Simulator)
3.实时的基础软件(DSP/BIOS)
4.主机和目标机之间的实时数据交换(RTDX)
5.实时分析和数据可视化
利用CCS,用户可以方便地建立一个DSP的工程项目,并对相应的源文件进行管理或编辑修改。所有源文件的编译、汇编和连接只需要一个按钮就可以一次完成,用户不必再通过输入冗长的命令行来完成这些操作。
经过上面的过程产生的目标代码可以在CCS的环境下通过硬件仿真工具,如XDS510等,下载到用户目标系统中进行调试和运行。如果没有用户目标系统,还可以将目标代码装载到Simulator中运行。Simulator利用计算机的资源模拟DSP的运行情况,可以帮助用户熟悉DSP的内部结构和指令,在有的情况下还可以对部分的程序功能进行非实时的验证。在CCS中,用户可以利用其提供的数据可视化工具按照数据的格式来观察数据,如眼图、星座图、FFT瀑布图等,较好的分析数据。
【实验内容与步骤】
1(创建一个新项目工程
1)从菜单或者快捷方式中打开CCS。
1
《DSP技术及应用》实验指导
图1CCS界面
2)选择Project?New。在myprojects文件夹中建立一个以自己姓名拼音命名的新的工
程文件,如”zhangsan”,如下图所示:
图2项目创建对话框
3) 在Target中选择器件类型"TMS320C54xx"。
4) 点击完成。这样CCS就新建了一个名为“zhangsan.pjt”的工程文件。
2(向工程中添加文件
1)选择Project?Add Files to Project,将volume. c添加至工程。
2)选择Project?Add Files to Project,选择汇编源文件(*.asm)类型的文件,将vector. asm和load.asm添加至工程。vector. asm文件定义了中断向量
表
关于同志近三年现实表现材料材料类招标技术评分表图表与交易pdf视力表打印pdf用图表说话 pdf
,其中RESET中断将跳转至C语言程序的入口地址 c_ int00。
3)选择Project?Add Files to Project,添加volume.cmd文件。该文件将源程序中定义的程序段、数据段、和堆栈段等定位到相应的程序存储器和数据存储器中。
2
《DSP技术及应用》实验指导
4)选择Project?Add Files to Project,进入c:\ti\c5400\cgtools\lib,文件类型选择日标文件
和库文件(*.o*,*.lib),添加rts.lib文件。这是一个C语言运行环境库。
5)在Project View中展开文件夹,如下图所示。注意,你不必自己向你的工程中添加 Include文件,因为CCS在编译过程中会自动地寻找Include文件并将已们添加至工程中。在你编译完你的工程以后,你就可以在你的Project View中找到Include文件。在编译一个程序时,ccs将按照下列顺序在工程文件中查找文件:
?包含源文件的文件夹
?在Include搜索路径中列出的文件夹
?在C54X_ C_ DIR(编译器)和C54X_ A_ DIR(汇编器)环境变量的定义中列出的文件夹。
图3 项目文件查看窗口
此时,工程中文件有:
volume.c这是主程序的源代码。 ?
?volume.h这是volume.c包含的头文件,用来定义不同的变量和结构。
?load. asm这个文件包含了模拟对DSP形成运算负载的程序。
?vectors.asm这是定义中断向量的表文件。
?volume.cmd这个CMD文件。
?rts.lib DSP运行环境库。
如果你要从你的工程中删除一个文件,在Project View中右击文件,在弹出的菜单中选
3
《DSP技术及应用》实验指导 择“Remove from Project"。
3(查看源代码
双击volume.c,源代码会出现在CCS窗口的右半窗口。在此C程序中应注意以下部分:
?主函数main输出第一条信息后,进入一个无限循环。在该循环内,主函数调用了函
数dataIO和processing。
?函数processing将输入缓冲区中取出的每一个值乘以增益(gain),然后将结果送入
输出缓冲区。它也调用了汇编加载程序,这在变量调入的处理过程中会消耗大量指令
周期。
?本程序中的函数dataIO完成返回(return)操作,使用探针从文件中将数据读入缓冲
区,其效率大大超过了用C代码来完成I/O操作。
4(编译和运行程序
按以下步骤编译运行程序:
1)选择Project?Rebuild All或者单击窗口菜单, CCS将编译、连接工程中的
所有文件,这个工程的编译连接消息将在底部的一个窗口显示。默认方式编译过程中,
在当前项目文件存在目录下将生成一个Debug子目录,生成可执行zhangsan.out文件
放在该目录下。
2)选择File?Load Program,选择在\zhangsan\debug目录刚刚生成的zhangsan.out文件。
CCS将把程序载入到DSP内,并且打开一个反汇编(Disassembly)窗口。在反汇编窗口
你可以看到一个绿色的箭头,它表示当前DSP的程序指针地址(PC值),注意此时PC
指针将指向c_ int00的位置。
3)在反汇编窗口中点击一条汇编指令,按下F1,CCS寻找该条指令的帮助文件。这是
一个熟悉的汇编指令的帮助信息的好办法。
4)选择Debug?Go Main,使程序从主函数main处开始执行程序,这一进程将在main处暂停显示,符号。
5)选择Debug?Run或单击工具条中的。
6)选择Debug?Halt或单击工具条中的,使程序退出运行状态。
5(使用断点和观察窗
当你开发并测试一个程序的时候,你经常需要查看在程序执行过程中一个变量的值的变
4
《DSP技术及应用》实验指导 化。本节中,你将使用断点和观察窗口来查看这些值,你也可以在到达断点以后使用单步调试命令。
load Program,装载zhangsan.out。 1)选择File?
2)双击打开volume.c程序,把你的光标移到这一行:
dataIO( );
3)单击Toggle Breakpoint工具栏按钮,或者按下 F9,此时将在这一行设置一个断
点,用红色的小点表示。
4)选择View?Watch Window或者,一个单独的窗口将出现在CCS窗口的右下方。在程序运行中,该区域将显示被观察的变量的值。在默认方式下,首先选中的是Watch Locals选项,在函数执行时,局部变量被显示出来。
图6变量观察窗口(1)
5)程序如果未回到main处,选择Debug?Go Main.
6)选择Debug?Run或者按下F5或者。
7)选择Watch1选项,在Name栏单击表达式按钮,并将dataIO作为变量名输入。单击观察窗口的空白处保存设置,变量值会立即显示出来。
5
《DSP技术及应用》实验指导
图7变量观察窗口(2)
9)单出(Step Over)或按F10键单步调用执行指令dataIO()。
10)结束本练习,使用,清除所有断点。
6(使用观察窗口查看结构体变量
1) 选择Watch1选项。
2) 在Name栏单击表达式按钮,并将str作为变量名输入。
3) 单击观察窗口的空白处保存设置,变量值会立即显示出来。
4) 重新查看源程序会发现一个PARMS类型的结构体变量已经在volume.c中被初始化
并定义为全局变量。该结构体类型是在volume.h中定义的。
5) 单击str旁的+号,CCS将扩展该行并列出该结构体中的所有元素及其值(显示出的
链接可能有所不同),通过双击其中元素值可更改选中的元素值。 6) 在观察窗口的value列中,改变一个变量的值。注意此时观察窗口的值已经改变,
同时该变量的颜色变为红色,表明已经改变了该变量的值。
7) 窗口中选择str变量并按Delete键,并对观察窗口中的所有表达式重复该步骤。 8) 选择Debug?Breakpoint,在Breakpoint栏中单击Delete All并单击OK。
6
《DSP技术及应用》实验指导
图8变量观察窗口(3)
8(为文件的I/O添加探针(Probe Point)
在本节中,你将添加一个探针,这个探针将从你的电脑上的文件中读取数据,探针是在算法开发中十分有用的工具。你可以通过以下几条途径使用它们:
?通过一定的算法,把主机电脑文件中的输入数据向目标板上的缓冲区传输。
?把目标板上缓冲区内的输出数据向主机传输,用于分析。
?更新窗口,比如一个图表等。
探针和断点有些相似,因为他们都可以中止目标板来完成已们的行为。但是,他们也有所不同,具体如下:
?探针即刻停止目标板,完成一个单独的行为,然后继续目标板的执行过程。
?断点停止CPU的工作,直到它的执行过程重新被手动继续。
?探针允许输入输出文件自动的被执行,而断点不行。
本节显示了如何使用探针向目标板传送数据。并且使用了一个断点在运行到探针的时候来更新所有打开的窗口。窗口中包括输入和输出的窗口。
1)选择Project?Rebuild All或者单击。
2)选择File?Load Program,将zhangsan.out加载到DSP中。
3)在volume.c中 dataIO();这一行设置一个断点。
4)单击,在dataIO();这一行前面出现一个蓝色菱形标志,表示在这一行插入探
针。
5)选择File?FileI/O。出现了文件I/O对话框,这样你就可以选择输入输出的文件。选
择AddFile,选择sine.dat文件,添加到FileI/O的对话框中。这时出现了一个sine.dat
7
《DSP技术及应用》实验指导 的窗口,当你运行程序时,你可以用这个窗口开始,停止,回放数据文件。在File I/O对话框中,把Address改为“inp_buffer",把Length改为“100",在WrapAround选项前打钩。如下图所示:
图9 File I/O对话框
其中,Address栏指出了文件中的数据将置于何处。Length栏指每一次程序运行到探针时从数据文件中读取数据的长度。Wrap Around选项使CCS循环从文件中读取数据。这就使数据文件被视为连续的数据流。
一个关于sine.dat文件的控制窗口显示出来。
图10 sine.dat控制窗口
6)单击 Add Probe Point, 出现Break/Probe/Frofile对话框。选中在上面步骤中建立的探针,在Connect列表中选取sine.dat文件。单击Replace,这时候探针和sine.dat文件就建立了连接。
点击绿色一行,如下图所示。
8
《DSP技术及应用》实验指导
点击Connect,下拉菜单,如下图所示。
点击 add,可以得到:
9
《DSP技术及应用》实验指导
图11 Add Probe Point设置
7)单击确定完成Add Probe Point设置。
8)单击确定,关闭File I/O对话框。
9显示图形
CCS提供了许多种用图表显示数据的方法,在这个例子中,你将看到一个基于时间的信号图。
1)选择View ? Graph ? Time/Frequency。对弹出的对话框依照下图对应修改。这样就为输入缓冲区inp_ buffer建立了一个波形观察窗口。
2)在Graph Propert对话框中,按下图所示设置Graph Title,Star Address,Acquisition Buffer
Size,Display Data Size,DSP Data Type,Autoscale,Maximum Y-value的值;向下移动滚动条或改变窗口大小可以看出所有的属性值。
10
《DSP技术及应用》实验指导
图12 图形显示设置对话框(1)
2}同1}的方法为输出缓冲区out buffer建立了一个波形观察窗口。改变Graph Title为Output,Star Address为out_buffer,其它设置一律不变。设置如下:
图13 图形显示设置对话框(2)
11
《DSP技术及应用》实验指导 9(启动程序并显示图形
在本节中,将设置一个断点来更新所有的窗口,并且使用Animate功能在到达断点之后
能够自动的继续程序的执行。
1)重新加载程序volume.out
口中,在dataIO()的那一行设置断点 2)在volume.c窗
3)单击Animating运行程序。
Animate和Run命令有些类似,它使目标板一直运行直到遇到一个断点,这时目标板被停止,所有的窗口被更新。但和run命令不同的是,Animate继续运行程序直到下一个断点。这样的过程直到手动停止目标板的工作。
4)注意到每个图表都有一个正弦信号,不同的是两者反相了。每次遇到一个探针,CCS从dine.dat文件中得到100个值,并把他们写入inp_buffer的地址中。信号反向是因为输入缓冲区包含的从sine.dat中读到的数据,而输出缓冲区包含的processing函数产生的数据。
图14 volume.c程序运行输入图形
图15 volume.c程序运行输出图形
12
《DSP技术及应用》实验指导 11调整Gain的值
从volume.c中,我们可以看出,processing函数利用gain和输入缓冲区的每一个值相乘,并且把结果置十输出缓冲区。在循环中,执行下列语句:
*output++=*iuput++*gain gain初始被置为MINGAIN,这在volume.h中有定义。为了修改输出值,你需要修改gain的值,一种方法是使用一个观察变量(watch window )。
1) 选择View}Watch Window。在watch窗口中添加gain变量,观察其值,如下:
图16 观察变量窗口
2)如果你已经停止了目标板,单击重新运行程序
3)在Watch窗口中把gain的值改成l0。观察波形的变化,如下:
图17 程序执行输出图形
【实验思考题】
1.如何产生测试正弦信号的数据文件“sine.dat”?参考教材280页
2.探针的作用是什么,
3(建立一项工程文件,一般包括哪些文件,每个文件的作用是什么,
13
《DSP技术及应用》实验指导
实验二 基本算术运算
【实验目的】
1. 练习TMS320C54X汇编程序的编写与调试方法,重点练习C54X程序流程控制方法
2.掌握用C54X进行算术运算的基本方法和使用的基本语句
3. 掌握汇编指令系统的使用方法,重点练习一些在功能上有所扩展的特殊指令 【实验内容】
1( 创建一个新项目工程
将“x:…\base_operation文件夹”复制到“c:\Program Files\ti\myprojects文件夹”下。 2( 打开工程调试程序
1) 阅读工程exer1.prj下exer1.asm程序,读懂加、减、乘、除汇编代码;
2) 单击,编译、连接工程,生成exer1.out;选择File?load Program,装载exer1.out;
选择Debug?Restart,光标移动到这一行 “_c_int00: ”
3) 使用添加断点,使用单步调试,通过View?Memory观察存储空间(首
地址为0x080)的内容,分析运算结果。
14
《DSP技术及应用》实验指导
4)整个的参考结果如图所示:
3. 编程y=0.5*0.4+0.6*0.5。
【实验思考题】
1( 编程y=0.4/0.5+0.6*0.5,尽量采用子程序调用的方式(乘法,除法)实现,并且注
释程序。
15
《DSP技术及应用》实验指导
实验三 FFT谱分析实现 【实验目的】
1.了解FFT算法的原理
2.了解在DSP中FFT的设计及编程方法
3.掌握C54x的存储器管理、辅助寄存器的使用及位码倒序寻址方式等技巧 【实验原理】
1(FFT原理
,,,,对于有限长离散数字信号{},,它的频谱离散数学值XK可由x[n]0,n,N,1
离散傅立叶变换(DFT)求得。DFT定义为
N,1,,j(2/N)nk,,XK,x[n]e k,0,1,?,N,1,N,0
也可以方便地把它改写成如下形式
N,1nk,,XK,x[n]W k,0,1,?,N,1,NN,0
nk,j(2,/N)nkWW式中,代表。不难看出,是周期性的,且周期为,即 eNNN
(n,mN)(k,lN)nkW,W m,l,0,,1,,2,? NN
nkWW的周期性是DFT的关键之一。为了强调,常用表达式取代以便明确地给出WNN
nkW的周期为。 NN
x[n]由DFT的定义可以看出,在为复数序列的情况下,完全可以直接运算点的DFTN
2,,N,1需要次复数乘法和N(N,1)次复数加法。因此,对于一些相当大的值来说,直N接计算它的DFT所需要的计算量是很大的。一个优化的实数FFT算法是一个组合以后的算法。原始的2个点的实输入序列组成一个点的复序列,然后对复序列进行点的FFTNNN运算,最后再将点复数输出拆分成2点的复数序列,这2点的复数序列与原始的2NNNN点的实数输入序列的DFT输出一致。
FFT的基本思想在于:将原来的点序列分成两个较短的序列,这些序列的DFT可以N
简单地组合起来得到原序列的DFT。例如,若为偶数,将原有的点序列分成两(/2)NNN
22,,(N/2),2,N/2点序列,那么计算点DFT将只需要约次复数乘法,即直接计算少N
2,,N/2进行一半乘法。因子表示直接计算()点DFT所需要的乘法次数,而乘数2N/2
代表必须完成两个DFT。上述处理方法可以反复使用,即()点的DFT计算也可以N/2
简化成两个(/4)点的DFT(假定/2为偶数),从而又少进行一半乘法。使用这种方NN
法,在组合输入和拆分输出的操作中,FFT的运算量均减半。这样,利用实数FFT算法来
16
《DSP技术及应用》实验指导
计算实输入序列的DFT的速度几乎是一般FFT的两倍。 假定序列{}的点数是2的幂,按上述处理方法,定义两个分别为的偶数项x[n]x[n]N
和奇数项的()点序列x[n]和x[n],即 N/212
Nx[n],x[2n] n,0,1,2,?,,112
N,,x[n],x2n,1 n,0,1,2,?,,122
{}的点DFT可写成 x[n]N
N/2,1N/2,12nk(2n,1)k,,XK,x[n]W,x[2n,1]W ,,NNN,0N,0
kW因考虑到可写成 N
2kj(2)/Nj(2)/(N/2),,,, ,, W,e,e,WNN/2
,,XK故可写为
/21/21NN,,2nkknkXK,x[n]W,Wx[2n,1]W,,1/22/2,NN,N 00NN,,
k ,X(K),WX(K)12N
X(K)X(K)x[n]x[n]式中,和是和的()点DFT。上式表明,点的DFT N/2N1212
,,XK可分解为按上式的规则加以组合的两个()点DFT。 N/22(DSP的FFT算法
2(1 码位倒序
FFT的码位倒置实际上是将输入数据进行倒序,以便在输出时得到正确的序列,以=8N
x[n]为例说明码位倒置的原理。设输入序列为,对=8,其自然序列号是0,1,2,3,4,N
x[n]5,6,7。第一次按奇、偶分开,得到两组/2点的DFT,的序号为 N
0,2,4,6 | 1,3,5,7 对每一组再按奇、偶分开,这时应将每一组按自然顺序排列,故抽取后得到四组,每组
序号为
0,4 | 2,6 | 1,5 | 3,7 这是一种直观的解释,实际编程时应考虑运算速度。下面再讲述一种汇编常用的算法。还以
x[n]x[n]n,0,1,2,?,N,1上面为例,设输入序列为,对=8,把的序号写成二进制数,N
,,x[0],?,x7即对应为
17
《DSP技术及应用》实验指导
,,,,,,, x[000]x[001]x[010]x[011]x[100]x[101]x[110]x[111]采用加/2逆向进位法,即将前一个数加上[100],如果有进位则向低位进位,如N
[110]+[100] 逆向进位得到[001],那么可得到如下序列:
,,,,,,, x[000]x[100]x[010]x[110]x[001]x[101]x[011]x[111]对应十进制序号为
,,,,,,, x[0]x[4]x[2]x[6]x[1]x[5]x[3]x[7]这也是按奇、偶抽取得到的顺序。掌握这一规律才能正确编程。 2(2 W因子的生成及分布规律
rW,cos(2,r/N),jsin(2,r/N)在FFT中,乘法主要来自旋转因子,因为,所以r在对相乘时,必须产生相应的正、余弦函数。在编程时,正、余弦函数产生的方法一般W
r有两种:一种是在每一步直接产生,另一种是在程序开始预先计算出,将W
r,0,1,?,N,1这个独立的值存于数组中,等效建立了一个正、余弦函数“表”,在程N
序执行时可直接查“表”得到。这样可提高运算速度,但占用了更多的内存。
r每一级因子分布有如下规律: W
rrmW=0级,,=0 2
rrmW=1级,,=0,1 4
rWrm=2级,,=0,1,2,3 8
???
rWrm?,N/2,1=-1级,,=0,1,2, MN
r因此,可以得出因子的一般分布规律为 W
mrr?,2m级,,=0,1,2, 第Wm,12
2(3 蝶形运算的基本原理
M对于任何一个2的整数幂N,2,总可以通过M次分解后成为2点的DFT计算。这
logNx[n]X(k)样的M次分解,也构成了从到的M(即)级迭代计算,每级由个N/22
蝶形运算组成。可以得计算方程
kX(p),X(p),WX(q) m,1mNm
kX(q),X(p),WX(q) m,1mNm
18
《DSP技术及应用》实验指导
M完成点的DFT计算需要级迭代运算,那么计算256点的DFT就要8logNN,22级迭代运算。
2(4 功率谱的计算
用FFT计算的频谱,即计算 x[n]
N,1,nkX(k),x[n]W ,NN,0
,,Xk一般是实部X(k)和虚部X(k)组成的复数,即 RI
X(k),X(k),jX(k) RI
因此,只需要将FFT变好的数据按照虚部的平方加上实部的平方,然后再对得到的数
据进行开方,就能得到功率谱密度。
根据FFT算法,设计程序并上机调试。 【实验内容与步骤】
1( 运用MATLAB信号处理工具箱中FFT函数编程实现FFT,注意fft(x)和fft(x,N)的
区别。
要求
对教师党员的评价套管和固井爆破片与爆破装置仓库管理基本要求三甲医院都需要复审吗
绘制原始信号波形图和幅频图。 参考代码如下:
%此程序仿真fft过程的是实验
%利用Matlab产生余弦信号:
clear all;
N=256;
y=zeros(1,N);
for i=0:N-1
y(i+1)=(sin(2*pi*(i*10)/256)+sin(100*pi*i/256))/2;
end
%绘制时域余弦信号
figure(1)
stem(y);
%绘制时域余弦信号的频谱
m=fft(y,N);
y1=abs(m);
figure(2)
plot(y1);
%验证ifft函数
figure(5)
plot(ifft(m));
%利用Matlab产生方波信号:
j=1;
19
《DSP技术及应用》实验指导
A=1;
a1=1;
y=zeros(1,N); for i=1:N
if(i/20==a1) j=(-1)*j
a1=a1+1;
end
if (j==1)
y(i)=50;
else
y(i)=-50;
end
end
%绘制时域方波信号
figure(3)
stem(y);
%绘制时域方波信号的频谱
y1=abs(fft(y,N)); figure(4)
plot(y1)
运行结果如下:测试点数N=256时
测试点数N=64时
2.启动CCS,创建工程FFT,添加相关文件,或者将“x:…\fft文件夹”复制到“c:\Program
20
《DSP技术及应用》实验指导
Files\ti\myprojects文件夹”下。
3.打开fft.asm源程序,单击,进行编译,链接生成fft.out并装入5402存储器。
4.将光标移动到“call get_input”行,并设置一个探针点。光标移动到下一行“nop”语句,使用工具设置一个断点。
5.选择File?File I/O,使用Add File打开FFT目录下的方波数据文件fft.dat,然后修改”Address”为“d_input_addr”,修改”Length”为256。并选择“Wrap Around”,循环使用该数据文件。
6.选择“Add Probe Point”,将探针点与该数据文件连接起来。选择探针点,然后在“ Connect”选项中选择需要使用的数据文件名,再选择“Replace”,按确定完成。
7.完成探针设置后,可以使用F5或”Run”命令或者启动程序运行。程序执行到探针点时自动从数据文件读出256个点的数据放入缓冲d_input_addr。
8.选择View ? Graph ? Time/Frequency打开一个波形观察窗口。将“Star Address”改为“d_input_addr”,将“Acquisition Buffer Size”改为128,将“DSP Data Type”改为“16-Bit signed integer”,这样即可显示128个输入点的小波形。
9.调整窗口大小,将光标移动到源程序的“b _c_int00”这行,使用Debug中的“Run to Cursor”项,程序将执行到这行并停下。这时FFT程序已经计算完成。再打开一个波形窗口,这次仅仅将将“Star Address”改为“d_output_addr”, 便可以显示计算完成后的谱波形。
10.选择Debug?Animae运行程序,这时程序将循环运行,不断从数据文件fft.dat中读出数据,并计算其频谱。这时你可以看到连续的输入/输出波形。
11.选择原始数据波形窗口,单击鼠标右键,进入“Properties”属性对话框。你可以将“Display Type”改为“FFT Magnitude”,这时输入数据将显示其频谱,对比两个图形,看看谱线的位置是否一样,
12. 选择File?File I/O,使用Add File打开FFT目录下的正弦数据文件sine.dat,重复7-11的操作。
【实验思考题】
1. 代码指令:ST B,*AR2 ||SUB *AR2+0%,B功能是什么,
21
《DSP技术及应用》实验指导
实验四 数字滤波器的设计 【实验目的】
1(了解FIR、IIR滤波器的原理及使用方法
2(熟悉使用MATLAB语言设计FIR、IIR滤波器的方法
3(掌握DSP对FIR、IIR滤波器的设计及编程方法
【实验原理及简要说明】
数字滤波器的输入和输出之间的关系可以用如下常系数线性差分方程及其Zx[k]y[k]
变换描述,即
MN
y[k],bx[k,i],ay[k,i] ,,ii,0,0ii
系统传递函数为
Mk,bz,kY(z)k,0H(z),, NX(z)k,1,az,kk,0
转换成零极点表示为
Nz,zj Hz,C(),z,p,1jj
zp式中,表示零点;表示极点。H(z)具有N个零点和N个极点,如果任何一个极点jj
在Z平面单位圆外,则系统不稳定。对于IIR滤波器,有系数量化敏感的缺点。由于系统对输入序列施加的算法是加法、延时和常系数乘三种基本运算的组合,所以可以用不同结构的数字滤波器来实现,且不影响系统总的传输函数。
b如果系数全部为零,滤波器成为非递归的FIR滤波器,这时系统没有极点,因此FIRj
滤波器总是稳定的。FIR滤波器的常系数线性差分方程及其Z变换描述,即
M
y[k],bx[k,i] ,i,0i
系统传递函数为
MY(z)k,H(z),,bz ,k()Xzk,0
【实验内容与步骤】
本实验要求设计采样频率为1200Hz、截止频率为200Hz的高通滤波器。设计FIT、IIR滤波器实现上述要求。输入信号为100Hz和300Hz的合成信号,目的是通过所设计的滤波器将100Hz的信号滤掉,余下300Hz的信号成份,达到滤波的效果。
22
《DSP技术及应用》实验指导 1( 滤波器的MATLAB语言设计
在MATLAB中使用滤波器设计工具箱(FDA)来设计滤波器,首先打开MATLAB,在命令窗口中输入FDAtool,将实现滤波器设计工具箱。
图1是滤波器设计的主界面,可通过输入滤波器的参数可以设计各种满足用户要求的滤波器,包括滤波器的类型(IIR或FIR)、滤波器的阶数(Specify order)、滤波器的截止频率(Fpass)、带宽、纹波系数(Apass)采样频率(Fs)等有关参数。
图1 IIR滤波器设计的主界面
图2、图3、图4和图5分别对应滤波器的频率特性、冲激响应特性图、阶跃响应特性图和零极点示意图。
图2 滤波器的频率特性
23
《DSP技术及应用》实验指导
图3 冲激响应特性图
图4 阶跃响应特性图
图5 零极点示意图
FIR设计:滤波器的类型为FIR、滤波器的阶数(Specify order)、滤波器的截止频率(Fc)、采样频率(Fs),指定滤波器采用的窗类型(Window)等有关参数。
24
《DSP技术及应用》实验指导
图6 FIR滤波器设计的主界面
图7 滤波器的频率特性
25
《DSP技术及应用》实验指导
图8 冲激响应特性图
图9 阶跃响应特性图
图10 零极点示意图
2( 滤波器的MATLAB实现
使用MATLAB语言设计得到滤波器的系数,也就得了滤波器的传递函数H(z)。用
26
《DSP技术及应用》实验指导
MATLAB语言可以将传递函数H(z)变成具体的数字系统,即滤波器的实现问题。下面分
别实现IIR和FIR滤波器。
(1)IIR滤波器的MATLAB实现
clear all;
clc;
N=256;
fs=1200;
dt=(1:N)/fs;
f1=300;
f2=100;
x=sin(2*pi*f1*dt)+sin(2*pi*f2*dt);
lp=200;
wn=2*lp/fs;
[B,A]= cheby1(3,0.5,wn,'high')
yy1(1)=0;
yy1(2)=0;
yy1(3)=0;
yy1=filter(B,A,x); y=fft(x,N);
figure(1);
plot(abs(y));
pyy=y.*conj(y); f=(0:(N/2-1));
figure(2);
plot(f,pyy(1:N/2)); y=fft(yy1,N);
pyy=y.*conj(y); f=(0:(N/2-1));
figure(3);
plot(f,pyy(1:N/2));
图11 输入信号的频谱图
27
《DSP技术及应用》实验指导
图12 滤波前的信号功率谱图
图13 滤波后的信号功率谱图 (2)FIR滤波器的MATLAB实现
clear all;
clc;
N=256;
fs=1200;
dt=(1:N)/fs;
f1=300;
f2=100;
x=sin(2*pi*f1*dt)+sin(2*pi*f2*dt);
lp=200;
wn=2*lp/fs;
B= fir1(34,1/3,'high')
yy1=zeros(34);
yy1=filter(B,1,x);
y=fft(x,N);
figure(1);
plot(abs(y));
pyy=y.*conj(y);
f=(0:(N/2-1));
28
《DSP技术及应用》实验指导
figure(2);
plot(f,pyy(1:N/2));
y=fft(yy1,N);
pyy=y.*conj(y);
f=(0:(N/2-1));
figure(3);
plot(f,pyy(1:N/2));
图14 输入信号的频谱图
图15 滤波前的信号功率谱图
图16 滤波后的信号功率谱图
29
《DSP技术及应用》实验指导 3.滤波器的汇编编语言设计
在编写汇编语言程序之前,首先确定滤波器的参数,从上面滤波器的设计中得出滤波器的参数如下,这些参数从图1的FDA主界面可以提到。
IIR滤波器系数
IIR滤波器系数
显然FDA提供的滤波器的参数不能直接用到DSP汇编语言中去,若设计参数有大于1的的数据,这样一个大于1的数据要直接用到DSP中,需要进行数据格式的浮点运算,这将增加编程的复杂度,而且会导致DSP运行程序速度的降低。一般情况下都不这样使用,而是将数据做一定比例的压缩后计算。针对以上设计的滤波器,编写汇编语言程序。 4( 在CCS环境下对IIR、FIR滤波程序分别进行调试
30
《DSP技术及应用》实验指导
(1)在CCS中新建一个工程,添加所需文件,然后编译链接生成可执行.out文件,装入.out文件。
(2)运行程序。单击工具栏上的run符号,程序运行,在菜单view?graph中选择Time/Frequency,出现Graph Property Dialog界面。在“Start Address”栏中地址为
“Acquisition Buffer Size”栏读取缓存大小为inputdata,“Display Type”栏,选择Single Time。
256,“Display Data Size”栏改显示点数为256。“DSP Data Type” 下拉选框中选择“16-bit singed integer”,“Sampling Rate(Hz)”中改抽样频率为1200。单击“OK”按钮,得到信号滤波前的波形图。
(3)在菜单view?graph中选择Time/Frequency,出现Graph Property Dialog界面。把“Display Type”栏改为FFT Magnitude,则可以观察到信号滤波前的频谱。
4)在菜单view?graph中选择Time/Frequency,改“Start Address”栏中地址为filterdata,(
则可以观察到信号滤波后的波形图。
(5)在菜单view?graph中选择Time/Frequency,改“Display Type”栏改为FFT Magnitude, 改“Start Address”栏中地址为filterdata,则可以观察到信号滤波后的频谱图。 5( 参考教材P201页例5-25、26、27、28,选择其中方法实现FIR滤波器。 【实验思考题】
4
()()axax,yax,1( 编程并求Z=,尽量采用子程序调用的方,iiiiiimaxmin,i1
式实现,并且注释程序。
31