《DSP原理及应用实验指导书.doc》由会员分享,可在线阅读,更多相关《DSP原理及应用实验指导书.doc(22页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、DSP原理及应用实验指导书武汉理工大学教材中心2009年7月实验一 CCS基本操作实验一、实验目的重点学习CCS的基本操作,练习C语言和汇编语言编程及调试。二、实验设备计算机,CCS软件三、实验内容与步骤1CCS设置双击桌面上的图标,先选择Close,进入如图4.1所示的配置对话框。由于本实验采用软件仿真器(Simulator)进行软件仿真,因此应从Available Board/Simulator Types列表栏中选择C54x Simulator,在C54x Simulator上单击右键,选择Add to System。然后按照向导设置均选择默认设置即可。注意:如果要从另一种平台转变为C5
2、4x Simulator平台,应右击System Configuration列表中的该平台,再选择Remove删除,然后才能按照本步骤对CCS进行设置。图4.1 CCS设置2创建新项目文件创建一个新的工程,将使用CCS 来创建一个工程,并向这个工程里添加源程序文件和库文件,它采用标准的C 语言库函数来显示一条“hello world”消息。创建一个新的工程的操作步骤如下:(1)运行CCS软件,进入如图1-1 所示的画面。图 1-1 CCS 的进入画面(2) 选择“Project”“New”,弹出如图1-2 所示的对话框。图1-2 新建工程对话框(3) 在“Project Name”中输入“my
3、hello”作为工程名,在“Location”(位置)中选择你所建的工作文件夹,然后在“Project Type”中选择“Executable(.out)”。输入完成后单击“Finish”按钮,CCS将会建立一个叫做“myhello.prj”的工程文件,这个文件保存了你的工程的设置和涉及到的变量文件。3、创建所需文件1)创建“hello.c”源程序/*/* */* H E L L O . C */* */* Basic C standard I/O from main. */* */* */*/#include void main() puts(hello world!n);2)创建“hell
4、o.cmd”文件/*/* C5402 DSK DSP Memory Map */* */*/MEMORY PAGE 0: VECS: origin = 0FF80h, length = 0100h /* Internal Program RAM */ PRAM: origin = 2800h, length = 8000h /* Internal Program RAM */ PAGE 1: SCRATCH: origin = 0060h, length = 0020h /* Scratch Pad Data RAM */ DMARAM: origin = 0C00h, length = 03
5、00h /* DMA buffer */ DATA: origin = 1100h, length = 0080h /* Internal Data RAM */ STACK: origin = 1180h, length = 0560h /* Stack Memory Space */ INRAM: origin = 1900h, length = 0100h /* Internal Data RAM */ HPRAM0: origin = 1A00h, length = 0002h /* HPI memory accessible by Host and DSP */ HPRAM1: or
6、igin = 1A02h, length = 0280h /* HPI memory accessible by Host and DSP */ HPRAM2: origin = 1C82h, length = 0280h /* HPI memory accessible by Host and DSP */ EXRAM: origin = 1F10h, length = 01000h /* External Data RAM */ EXRAM2: origin = 2F10h, length = 0D000h /* External Data RAM */*/* DSP Memory All
7、ocation */*/SECTIONS .cinit PRAM PAGE 0 .text PRAM PAGE 0 .vectors VECS PAGE 0 init_var PRAM PAGE 0 detect PRAM PAGE 0 vrcprg PRAM PAGE 0 matprg PRAM PAGE 0 .stack STACK PAGE 1 .trap SCRATCH PAGE 1 .const EXRAM PAGE 1 .data EXRAM PAGE 1 .bss EXRAM2 PAGE 1 .cio EXRAM PAGE 1 .switch EXRAM PAGE 1 table
8、s EXRAM PAGE 1 var EXRAM PAGE 1 svctab EXRAM PAGE 1 /* SS_V LSP table */ vctab EXRAM PAGE 1 /* V LSP table */ uvctab EXRAM PAGE 1 /* UV LSP table */ cuvtab EXRAM PAGE 1 /* Stochastic codebook */ cdbktab EXRAM PAGE 1 /* various codebook tables*/ logtab EXRAM PAGE 1 /* table for log2 */ powtab EXRAM P
9、AGE 1 /* table for pow2 */ hamtab EXRAM PAGE 1 /* table for hamming */ lgwtab EXRAM PAGE 1 /* table for lag window */ acostab EXRAM PAGE 1 /* table for arccos */ sqrtab EXRAM PAGE 1 /* table for square root */ acbtab EXRAM PAGE 1 /* table for thresholds in acb */ pm03tab EXRAM PAGE 1 /* table for x(
10、-0.3) computation */ costab EXRAM PAGE 1 /* table for cosine */ V23 INRAM PAGE 1 FSK INRAM PAGE 1 hpibuff0 HPRAM0 PAGE 1 hpibuff1 HPRAM1 PAGE 1 hpibuff2 HPRAM2 PAGE 1 dma_buff DMARAM PAGE 1 (CMD文件说明:CMD是用来分配ROM和RAM空间用的,不同的芯片就有不同大小的ROM和RAM。放用户程序的地方也不尽相同,所以要根据芯片进行修改。分两部分:MEMORY和SECTIONS。MEMORY是用来指定芯片的
11、ROM和RAM的大小和划分出几个区间。PAGE 0 对应ROM;PAGE 1 对应RAM。PAGE 里包含的区间名字与其后面的参数反映了该区间的起始地址和长度。SECTIONS:(在程序里添加下面的段名如” .vectors”用来指定该段名以下,另一个段名以上的程序(属于PAGE0)或数据(属于PAGE1)放到“”符号后的空间名字所在的地方。)4向项目中加入文件(向工程里添加文件的操作步骤如下:(1) 选择“Project”“Add Files to Project”,然后选择“hello.c”文件。(2) 选择“Project”“Add Files to Project”,然后在文件类型中选
12、择“Asm Source Files (*.a*,*.s*)”。(3) 选择“Project”“Add Files to Project”,在文件类型框中选择连接命令文件(*.cmd),然后选择“hello.cmd”并打开。这个文件包含程序段到存储器的映射。(4) 选择“Project”“Add Files to Project”,进入编译库文件夹(c:tic5400cgtoolslib),再在文件类型框中选择目标文件和库文件(*.o*, *.l*),然后选择“rts.lib”并打开。这个库对目标系统DSP提供了运行实时支持。(5) 单击紧挨着Projects、hello.pjt、Librar
13、ies 和Source 旁边的“+”标记来扩充工程(Projects)列表,这个列表叫做工程窗口(Project View)。(6) 此时,包含文件还没有出现在工程窗口里。(7) 如果需要从工程中删除某一个文件,则只需要在工程窗口中的相应文件上单击鼠标右键,并从弹出的菜单里选择“Remove from project”(删除)即可。5浏览代码和Windows的浏览器相似,只要在项目文件查看窗口中打开“+”号展开下面的文件,在工程窗口里双击 hello.c 文件,在主窗口(右半窗口)就会显示相应文件的源程序,出现图1-3,此时可以浏览并检查源程序。 图1-3 查看源程序6编译、运行程序(1)选择
14、ProjectRebuilt All或单击工具条中的按钮,CCS将重新编译、链接项目中的所有文件。整个过程的信息将在窗口下方的信息框内显示。如果有错误,就需要检查、修改源程序,然后再重新编译、链接,直到通过编译链接为止。(2)选择FileLoad Program并选中hello.out,这样CCS就把程序加载到目标系统DSP中。(3)选择DebugRun或单击工具条中的按钮,这样程序就可以运行起来。选择DebugHalt或单击工具条中的按钮,就可以使程序退出运行状态。图 1-4 hello 程序运行结果7跟踪/调试程序(1)使用断点(Breakpoint)与观察窗口(Watch Window)
15、当开发和测试一个程序时,经常需要在程序运行过程中检查一个变量的值。这里使用断点与观察窗口来观察这些变量,也可以到达断点后使用step命令。将C:titutorialsim54xx目录下的volume1文件拷贝到C:timyprojects文件夹下。打开该工程并编译通过,选择FileLoad Program并选中volume.out,把程序加载到目标系统DSP中。在项目文件查看窗口中双击volume.c文件;将光标移到下面这行:dataIO();单击或按F9键,此时该行红色高亮显示,表示一个断点已经被设置。单击工具条中的按钮或按F5键,或选择DebugRun,开始运行。当运行到断点时停止,直到再
16、次按。如果需要使程序回到main处,选择DebugGo Main。 选择ViewWatch Window,一个单独的窗口将出现在CCS窗口的右下方,如图1-5所示。用鼠标右击该窗口,在窗口中填入要观察的变量的名称查看其结果。例如:input等。图1-5 观察变量单击(Step Over)或按F10键单步调用执行指令。尝试使用CCS提供的step命令: Step Into(F8) Step Over(F10) Step Out(shift+F7) Run to Cursor(Ctrl+F10)(2)加入文件输入/输出探针(Probe Point)选择FileLoad Program并选中volu
17、me.out,再单击Open。在项目文件查看窗口中双击volume.c文件。把光标放在主程序(main function)的下面这行:dataIO();单击或按F9键,此时该行蓝色高亮显示,表示一个探点已经被设置。选择FileFile I/O,这时File I/O对话框显示出来,从中选择与该探点相关联的输入或输出文件。 在File Input栏中选择Add File,在随后出现的对话框中选择sine.dat文件并单击Open。一个关于sine.dat的控制窗口显示出来,如下图所示。在此后运行程序时,使用该窗口利用这个数据文件开始、结束、重复、快速向前运行程序。在File I/O对话框中进行如下
18、设置:Address设置为inp_buffer,Length设置为100,同时选中Wrap Around。单击Add Probe Point,Break/Probe Points的探点窗口将显示出来,如下图所示。在Connect To栏的下拉菜单中选择sine.dat,单击Replace 。Probe Point列表发生变化,显示出探点被连接到sine.dat文件上。单击确定,File I/O对话框显示文件已经被连接到探点上。单击确定,关闭File I/O对话框。 (3)图形显示选ViewGraphTime/Frequency打开图形显示设置窗口。在弹出的对话框中按图设置: “Graph Ti
19、tle”为Input(也可以是其它名字);“Start Address”为inp_buffer;“Acquisition Buffer Size”和“Display Data Size”均设为100;“DSP Data Type”为16-bit signed integer。 单击OK,会生成一个名为Input图形(显示)窗口。在该输入图形窗口中单击右键,并从弹出菜单中选择Clear Display。再次选择ViewGraphTime/Frequency,并改变“Graph Title”为Output(也可以是其它名字);“Start Address”为out_buffer,其它设置一律不变。
20、单击OK,系统显示一个名为Output的图形(显示)窗口,在该输出图形窗口中单击右键,并从弹出菜单中选择Clear Display。在volume.c源程序窗口中,将光标移到指令所在行,并在此处设置一个断点,即单击(Toggle Breakpoint)。此时将探点和断点都放置在同一个命令行上,这就会使得运行操作时(传输数据或刷新图形时目标程序)只暂停一次。重排窗口可以看到所有的图形。单击工具条中的按钮(Animate)或按F12键运行程序。观察Input窗口和Output窗口的变化。如图所示。选择DebugHalt,使程序退出运行状态。(4)调整增益选择ViewWatch Window,并将g
21、ain作为要观察的变量输入,通过改变gain的取值从而改变增益。四、实验报告要求1、简述CCS的基本特点2、调试实验内容,得到相应结果,分析在调试过程中出现的问题,并如何解决问题。实验二 FIR数字滤波器实验一、实验目的1 掌握FIR数字滤波器的原理。2 掌握FIR数字滤波器的DSP实现方法。二、实验原理数字滤波器一直以来就是数字信号处理器最广为人知的应用。数字滤波器有别于模拟滤波器的优点是:1)可重复设计,不需更改任何硬件电路的设计,就可以将一个低通滤波器重新设计成一个高通滤波器。2)执行阶段可以直接更新滤波器的系数,形成适应性滤波器。滤波器分成两种形态:有限长度脉冲响应(FIR)滤波器。F
22、IR指的是单一采样响应的期间是有限长的,IIR指的是单一采样响应的期间是无限长的。FIR滤波器的特性可以用一个差分方程来描述: 其中是滤波器的系数。常用的滤波器有:低通、高通、带通及带阻滤波器。滤波器特性可以由很多的参数来决定,这些参数包括带通涟波、带阻涟波、带通截止频率及带阻截止频率。在设计FIR滤波器时,必须根据这些参数来确定FIR滤波器的系数及阶数。这个过程可以通过几种方法来完成。一是通过Matlab软件来完成,二是通过专门的数字滤波器设计的软件包来完成。这一过程本实验不详述,本实验假定该过程已经完成,并得到了滤波器的阶数及系数。本实验完成32阶的FIR数字低通。三、程序主要代码1、FI
23、R滤波器程序下面为一个FIR低通通用程序。LOWPASS.set1.globalstart,fir.mmregsCOFF_FIR_START: .sect coff_fir.if LOWPASS.includelowpasslowpass.inc.endifK_FIR_BFFR.set32d_data_buffer.usectfir_bfr,64FIR_DP.usectfir_vars,0d_filin.usectfir_vars,1d_filout .usectfir_vars,100h.asgAR4,FIR_DATA_P.asgAR6,INBUF_P.asgAR7,OUTBUF_P.sec
24、tfir_prog nopstart:LD#FIR_DP,DP;加载数据页指针STM#d_data_buffer,FIR_DATA_PRPTZ A,#K_FIR_BFFR-1STLA,*FIR_DATA_P+;置数据缓冲区为0STM#d_filin,INBUF_P;新采样数据指针STM#d_filout,OUTBUF_P;滤波输出指针 STM#100h,BKfir_loop: NOP ;Add Breakpoint & porbe pointLD*INBUF_P,A;获得输入采样数据CALLfir ;执行滤波STHA,*OUTBUF_P+%main_end:bfir_loop ;Add Bre
25、akpointfir:SSBXSXM SSBX FRCT STM#d_data_buffer,FIR_DATA_PSTLA,*FIR_DATA_P;将采样数据放入数据缓冲X(n)STM#(d_data_buffer+K_FIR_BFFR-1),FIR_DATA_P fir_task: RPTZA,#K_FIR_BFFR-1MACD*FIR_DATA_P-,COFF_FIR_START,A;乘加累加,且将数据缓冲区的数据移位。RET.end2、创建“fir.cmd”文件MEMORYPAGE 0:PROG:o= 100h,l= 2000h PAGE 1:DATA1:o= 2600h, l= 100
26、0hDATA2:o= 2100h, l= 100hDATA3:o= 2200h,l= 100hDATA4:o= 2300h,l= 100hDATA5:o= 2400h,l= 100hDATA6:o= 2500h,l= 100hSECTIONScoff_fir : PROGPAGE 0fir_prog : PROGPAGE 0fir_vars : DATA1PAGE 1 fir_coff : DATA2PAGE 1 fir_bfr : DATA3PAGE 1四、实验步骤如果你使用的是软件仿真,实验步骤如下:1) 新建一个工程,创建fir滤波器源程序和配置文件。2) 将文件添加到工程中。3) 将文
27、件夹lowpass拷贝到新建的工程文件夹内。4) 打开Project 选单,选择“Build Options” 选项,在Linker 菜单项中修改“Autoinit Model”为 “No Autoinitialization ”然后单击确定。5) 打开“Project ”选单,选择“Rebuild all”选项Code Composer Studio 重新编译和链接这个工程项目,在屏幕下方的“Message”窗口中返回整个的处理过程信息。6) 打开fir.asm 文件在“fir_loop:” 程序段的“NOP ”上点击右键选中Toggle Breakpoint,重复单击右键选中Toggle
28、Probe Point, 在“main_end: ”程序段内的“b fir_loop” 行上单击右键选中Toggle Breakpoint 。以上步骤是为了完成在程序中加入断点。7) 打开“File ”选单,选择“Load Program” 选项,在“Load Program” 对话框中,选中FIR目录下的fir.out 文件。8) 打开“File” 选单,选择“File I/O” 选项,就会在屏幕上弹出“File I/O ”对话框中,单击“Add File” 键。就会在屏幕上再弹出“File Input” 的对话框,双击C:timyprojectsfirlowpass64300.dat,单击
29、Add Probe Point。将出现Break/Probe/Profile Points 的对话框,单击Probe Point 框中的选项之后,在Connect 中选中“FILE IN: c:timyprojectsfir64300.dat”。单击“Replace ”之后,按“确定”键,就会回到“File I/O” 对话框,在“Address ”中填写“d_filin”( 数据输入地址),在“Length” 中填写“1”( 每次读入一个点数据)。然后单击“确定”,这样就使数据输入到程序中。9) 选择 VIEW 选单中 Graph 副选框内的Time/Frequency 打开对话框,修改以下内
30、容。Display Type:选择显示形式Graph Title:图表名称Start Address:起始地址Page:显示数据模式Acquisition Buffer Size:获得缓冲器的大小Index Increment:索引增量Display Data Size:显示数据的大小DSP Data Type:DSP 数据类型Sampling Rate:采样频率按如下步骤打开图形窗口显示输入信号波形a) Display Type: Singel Time,如要看频谱则选为FFT Magnitude,Graph Title: d_filinStart Address:d_data_buffer
31、Acquistition Buffer Size: 32Display Data Size:32DSP Data Type:16-bit signed integerAutoscale:on点击下面的OK 完成设置。按如下步骤打开图形窗口显示滤波后输出信号的波形。b) Display Type: Singel Time,如要看频谱则选为FFT Magnitude,Graph Title: d_filoutStart Address: d_filoutAcquistition Buffer Size: 128Display Data Size:128DSP Data Type:16-bit si
32、gned integerAutoscale:on点击下面的OK 完成设置。1) 打开“Debug” 选单,选择“Animate” 选项或按F12 运行程序,观察运行结果。2) 打开“Debug”选单,选择“Halt” 选项或按Shift+F5终止实验程序。五、实验报告要求1、简述实验目的;2、简述FIR的基本原理;3、调试实验内容,得到相应结果,分析在调试过程中出现的问题,并如何解决问题。实验三 DSP的定时器应用定时器实现数字振荡器一、实验目的.更进一步掌握定时器和中断的使用;.学会用数字振荡器方法产生正弦/余弦信号;二、实验原理利用定时器及中断产生频率为f正弦信号,定时器被设置成每1/fs
33、产生中断一次(等效于采样速率),在中断服务程序中用迭代算法计算出一个正弦值。用此方法可以很精确地产生某频率的正弦波。设一个传递函数为正弦序列,其Z变换为,其中A=,B=-1,C=。设初始条件为0,求出其反Z变换得:是一个二阶差分方程,其单位冲击响应即为sinkT,利用单位冲击函数xk-1的性质,即仅当k=1时,xk-1=1,推导得:在k2以后,yk能用yk-1和yk-2算出,这是一个递归的差分方程。式中,fs为采样频率,f为正弦波频率。A为正弦波幅度。可见用数字频率振荡器产生正弦波的实质就是用程序实现上述的递归差分方程。如要产生振荡器的频率为2kHz正弦波,设采样速率为40k,通过定时器设置,
34、每隔25us中断一次,即产生一个yn。则递归差分方程系数为:B=-1 为了便于定点DSP处理,将所有系数除以2,然后用16位定点格式表示为:A=79bcH,B=C000H,C=13c7H,这便是产生2kHz正弦信号的三个系数。主程序初始化时先计算出y1和y2,然后开放定时器中断,以后每次进入定时器中断服务程序时,利用前面计算出的y1和y2计算出新的y。初始化y1和y2SSBX FRCT ;置FRCT=1,准备进行小数乘法运算ST #0x79BC,AA ;将常数装入变量AAST #0xC000H,BB ;将常数装入变量BBST #0x13C7H,CC;将常数装入变量CCPSHD CC ;将CC压
35、入堆栈POPD Y2 ; 初始化Y2=CCLD AA,T ; 将AA装到 T寄存器MPY Y2,A ;Y2乘以系数A,结果放入A寄存器STH A,Y1 ;将A寄存器的高16位存入变量Y1;中断服务程序段:LD BB,T ;将系数B装入T寄存器MPY Y2,A ;Y2乘系数B,结果放入A寄存器LTD Y1 ;将Y1装入T寄存器,同时复制到Y2MAC AA,A ;完成新正弦数据计算,A寄存器;中为Y1*AA+Y2*BBSTH A,1,Y1 ;将新数据存入Y1,因所有系数都;除过2,在保存结果时转移一位,;恢复数据正常大小STH A,1,Y0 ;将新正弦数据存入Y0VC5402的片内定时器利用CLK
36、OUT时钟计数,用三个寄存器(TIM、PRD、TCR)来控制定时器。到定时器实际上可以有20个比特的周期寄存器。它对CLKOUT信号计数,先将PSC 减1,直到PSC 为0,然后用TDDR 重新装入PSC,同时将TIM减1,直到TIM减为0。这时CPU 发出TINT中断,同时在TOUT 引脚输出一个脉冲信号,脉冲宽度为CLKOUT 一致。然后用PRD 重新装入TIM,重复下去直到系统或定时器复位。因而定时器中断的频率由下面的公式决定:TINT的频率=,其中tc表示CLKOUT的周期。设置PRD寄存器值为12499,TINT中断频率为40kHz。定时器初始化程序段为:STM #10H,TCR ;
37、停止定时器STM #2499H,PRD;设置PRD 寄存器值为2499,;TINT 中断频率为Foutclk =(2499+1)= 100MHz/2500 = 40 kHzSTM #20H,TCR ;重新装入TIM 和PSC,然后;启动定时器,在开放中断屏蔽寄存器IMR后,就可以产生频率为2000Hz的正弦波。三、实验内容与步骤.使用C54x汇编语言实现数字振荡器,并通过CCS提供的显示窗口观察输出信号波形以及频谱。.根据确定数字振荡器的频率,确定系数。数字振荡器系数的确定在前面已经说明,3. 启动 CCS,新建工程文件,如文件名为sinewave.pjt。并建立如下文件: 汇编源程序exer
38、3.asm .title for test INT service program .(25 us) .mmregs .global _c_int00,_tint,vector OFF_INTIMER .set 04Ch ; vector of INTtimer at VECTOR+OFF_INTIMERINIT_A .set 079bch ; A/2=0.INIT_B .set 0c000h ; B/2=-0.5INIT_C .set 013c7h ; C/2=0. .bss y0,1 .bss y1,1 .bss y2,1 .bss temp,1 .bss AA,1 .bss BB,1 .
39、bss CC,1 .text _c_int00: ld #0,dp ssbx intm ; disable all interrupt ! st #1fffh,sp ld #vector, a ; get vector table address ! and #0FF80h, a andm #007Fh, pmst or pmst, a stlm a, pmst ; 设置IPTR stm #10h,TCR ; init TIMER stm #2499,PRD ; f=100M/(2499+1)=40kHz stm #20h,TCR ; reset TIMER ldm IMR,a ; read back IMR or #08h,a