您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 管理学资料 > DSP编程与Visual-DSP++入门
实验一DSP编程与VisualDSP++入门一、实验内容本次实验内容主要有四个部分:练习一:启动VisualDSP++,建立一个用C源代码的工程(Project),同时用调试器来评估用C语言所编写代码的性能;练习二:创立一个新的工程,修改源码来调用一个汇编(asm)程序,重新编译工程,用调试器来评估用汇编语言所写程序的性能并与C语言程序作比较;练习三:利用调试器的绘图(plot)功能来图形显示一个卷积算法中的有关数据的波形;练习四:利用调试器的性能统计功能(Statisticalprofile统计剖析)来检查练习三中卷积算法的效率。利用所收集到的性能统计数据就能看出算法中最耗时的地方。二、实验步骤1.练习一进入VisualDSP++开发环境,选择菜单File中Open打开文件G:\ProgramFiles\AnalogDevices\VisualDSP5.1\work\test1\DSP_exp\unit_1\DotProductC\DotProductC.dpj。DotProductC工程中有3个文件,定义数组和计算数组点积和的两个C语言源文件dotprod_main.C(主程序)、DOTPROD.c(子程序)以及一个描述程序和数据存储位置的链接描述文件DOTPRODC.LDF。在菜单Project中选择BuildProject来对工程进行编译。输出窗口显示程序编译时的各种状态信息(包括出错和编译进程信息)。当编译检测到错误时,输出窗口出现相应的出错信息,打开对应的源文件进行修改,保存并再次进行编译。当编译不再有错时,输出窗口将显示“Buildcompletedsuccessfully”。编译成功后进入Debug界面,初次进入Debug需要设置session,其设置步骤如图1.1和图1.2所示,按图中步骤设置完毕后,点击next,再点finish即可。如果不是第一次进入Debug,不会出现session的设置,会默认之前的设置,这是如果要更换处理器的类型可以在session选项中选择newsession来设置。图1.1session界面设置步骤1图1.2session界面设置步骤2完成上述步骤后,在debug菜单中选择run,可以在console窗口中看到运行结果。下面对程序中的各个函数进行性能的分析,在进入debug没有运行程序之前,选Tools\LinearProfile\NewProfiling命令,会在反汇编窗口上方出现一个小窗口如图1.3,窗口可以拖动放大。图1.3linearprofiling窗口在窗口空白处右击,选properties,点filter中的C/C++function,点击add,将3个子函数和主函数都加进去如图1.5所示:图1.5剖析窗口的设置窗口设置好后点确定,运行程序,得到分析结果。2.练习二关闭DotProductC工程,file→open→project,选择路径G:\ProgramFiles\AnalogDevices\VisualDSP5.1\work\test1\DSP_exp\unit_1\DotProductASM\DotProductASM.dpj。如果需要对工程选用的处理器等做修改,在project窗口右击当前工程,选择projectoptions,进行相应的设置如图1.6所示。图1.6project选项卡设置在对话框中打开Compile选项卡点General,选中“Enableoptimization”,“Generatedebuginformation”这一项默认已选,系统将自动生成针对ADSP-21161的优化代码,如图1.7所示:图1.7Compile选项卡设置编译工程,主程序与练习一相比有两个地方被改动了:externdoublea_dot_b(doublepm*,double*);/*externdoublea_dot_c(doublepm*,double*);*/externdoublea_dot_c_asm(doublepm*,double*);externdoublea_dot_d(doublepm*,double*);result[0]=a_dot_b(a,b);/*result[1]=a_dot_c(a,c);*/result[1]=a_dot_c_asm(a,c);result[2]=a_dot_d(a,d);上面两段程序中绿色的是练习一中的主程序用的语句,练习二的主程序则用的是标红的语句,从语句中可以看到练习二用汇编语言重新写了a数组和c数组的点乘,并在后面调用了这个汇编程序。实现了在C语言中调用汇编语言程序,同样也可以分析其性能。对工程进行编译,右击练习一中建的linearprofiling窗口的空白处,选择clearprofile,将之前的性能分析清除掉,再右击:properties→filter→C/C++function,将之前添加的函数选中,点remove,再点add,5个文件中只有a_dot_c不选,用a_dot_c_asm代替它,如图1.8所示图1.8添加待分析的函数设置完成后运行程序,在console窗口得到运行结果,同时在性能分析窗口看到函数的性能分析结果。3.练习三关闭DotProductASM工程,file→open→project,选择路径G:\ProgramFiles\AnalogDevices\VisualDSP5.1\work\test1\DSP_exp\unit_1\Convolution\Convolution.dpj。编译工程,编译成功后,会在工程的debug文件中生成可执行文件Convolution.dxe。将工程关闭,file→loadprogram,找到Convolution工程文件夹下的debug文件夹下的可执行文件Convolution.dxe打开,工程进入debug界面,运行程序后,在console窗口并没有输出结果,我们的得到的计算结果都存储在4个数组当中,为了看清运行结果,下面将数据以图形的形式展现出来。选择菜单View\DebugWindows\Plot\New…项,将出现Plot参数设置窗口。在PlotType项中选择LinePlot,在PlotTitle中输入Convolution。其它参数设定如表1-1所示:NameAddressCountDataTableTable360floatInputInput360floatOutputOutput360float表1-1数组图形化的参数设置在plotconfiguration窗口中还有一个很重要的选项设置memory选项,该选项默认为数据存储器,而这个练习中的3个数组都存在数据存储器中,所以不用选;但如果以后要处理的数据有存在其他的存储器中的就需要进行选择。每对一个数组设置完毕就点击add,都设完后点OK,就可以在一个convolution窗口中看到相应的曲线(程序已经运行完毕)。想对图形的某一部分放大可以用鼠标左键选中这一部分,如果想恢复的话右击鼠标,右击鼠标选择reset,想精确的知道某点的数据也可以右击鼠标,选择“DataCursor”项,图形上将出现“十”字大光标,可点击曲线上的任一点,在窗口左下角会出现该点的数值和曲线名,可用键盘上的上(↑)下(↓)键来切换所选曲线。4.练习四关闭所有文件,选File→LoadPrograme命令项,在对话框中选择文件convolution.dxe。选Tools\LinearProfile\NewProfiling命令,可以按练习二中的步骤对窗口进行设置,也可以直接选“Entirememoryspace”对整个程序进行分析,设置完毕后运行程序即可得到分析结果。三、程序调试这个实验中需要进行调试的程序只有练习一中DotProductC工程中的主程序,进行练习一时,编译工程会出现错误,提示信息如图1.9所示:图1.9编译错误提示图将鼠标放在line115处双击,可以打开有错误的源程序,而且光标所在行即为有错误的行,同时提示信息还提示了错误的类型,这里可以看到是说有未定义的变量“itn”,事实上这是int的误写,将这个错误改正后再编译就可以顺利通过。四、实验结果及分析1.练习一按练习一的步骤进行实验,得到的结果如图1.10和图1.11所示:图1.10DotProductC工程的结果显示图1.11DotProductC工程各程序性能分析从程序上来看,a,b,c,d是四个复数数组,a,b,c的长度相同是20,d是10。函数a_dot_b,a_dot_c,a_dot_d分别将a和b,c,d做点乘,即逐点相乘之后累加,图1.10显示的就是累加后的3个结果。由于a,b,c的长度相同,所以a_dot_b和a_dot_c的计算量可以说是完全相同的,其耗时也就完全一样,而d的长度只有前三者的一半,所以a_dot_d是将a的偶数项和d中的数据点乘累加,其运算量要小于前两者,耗时也小于前两者,从图1.1中就可以看到这种分析与结果是一致的,子程序a_dot_b和a_dot_c各占总时间的34.54%,a_dot_d占22.40%,主程序基本上就是对3个函数的调用,所以仅占8.52%。窗口的右半部分显示的是各程序中逐条语句在这个程序中耗时所占百分比,想研究哪一个程序双击即可。2.练习二按练习二的步骤进行实验,得到的实验结果如图1.12和图1.13所示:图1.12DotProductASM工程的结果显示图1.13DotProductASM工程各程序性能分析练习二中的工程与练习一中的工程实现的功能是一样的,所以对比图1.12和图1.10可以发现它们的结果是一样的。但二者的区别在于练习DotProductASM工程主函数在调用子函数实现相应数组的点乘累加时,对a数组和c数组的点乘累加调用的不再是C语言的程序,而是汇编语言,也就是用_a_dot_c_asm代替了原来的a_dot_c。对比图1.12和图1.14可以发现,实现同样功能的汇编语言程序要比C语言程序高效,原来的a_dot_c耗时34.54%,而_a_dot_c_asm仅耗时18.10%。这是由于汇编语言可以在一个指令周期内实现多个操作(包括寻址,运算,条件判断等,具体如何组合使用由指令规则而定),而且人为地编写汇编程序可以有效地利用填充时间和排空时间,使程序更高效。但查看程序代码其编写难度也明显高于C语言程序。3.练习三按练习三的步骤进行实验,得到的实验结果如图1.14和图1.15所示:图1.14数组数据的图形显示图1.14数组数据的局部放大图形图1.14中的蓝色正弦波形是Table数据画出的,Table是从0到2以0.017453292为步长取了360个点再求其sin值。红色波形是Input数据的图形,它是有Table的前36个数据不断赋值得到的,所以其最大幅值不会超过Table波形第36个数据的值。黄色的是Output的波形,它是由Input的每个数据和Impulse中所有数据分别相乘累加后得到的,而Impulse则是由Table中10的整数倍位置的数据不断赋值得到的。图1.14是图形某个部分的放大图,这种方法可以很好地观察我们重点关注的区域。4.练习四按练习四的步骤进行实验,结果如图1.15和图1.16所示:图1.15Convolution中个程序性能分析图1.16CalculateOutputPulse子程序中各语句所占时间比图1.15和图1.16是性能分析窗口的左右两边,为了便于观看分两幅图截了下来。从图1.15中可以看到最耗时的程序就是Output的计算子程序,占总时间的89.04%;而在图1.16中可以看到CalculateOutputPulse子程序中最耗时又是程序的内循环,也就是用Input中的数据与Impulse中的数据逐个相乘在累加的过程,所以想要改善这个子程序的效率,可以将这一段程序用汇编语言编写。五、实验体会经过本次实验,基本上学会了DSP开发环境的使用,初步掌握了一些程序调试和分析的手段,深刻体会到了C语言和汇编语言的差别,C语言编写
本文标题:DSP编程与Visual-DSP++入门
链接地址:https://www.777doc.com/doc-5725498 .html