DSP原理课练习题参考答案-应电.doc_第1页
DSP原理课练习题参考答案-应电.doc_第2页
DSP原理课练习题参考答案-应电.doc_第3页
DSP原理课练习题参考答案-应电.doc_第4页
DSP原理课练习题参考答案-应电.doc_第5页
已阅读5页,还剩11页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

DSP原理与应用练习题参考答案32学时版本用于应用电子方向注意:红色字体文字为解题注解与说明,万万不可作为答题内容1. Q.15表示是16位数据中第15位为符号位,第140位为小数位。试写出下面问题的答案: 分别写出十进制正数0.68和十进制负数-0.245的Q.15表示。0.68*32768=570AH-0.245*32768=-1F5CH=E0A4H 分别写出Q.15表示的A200H和5A00H的十进制数值。A200H/32768=-5E00H/32768=- 0.7343755A00H/32768=0.703125上面两小题使用教材P7两条公式,公式中Q为数据中的小数位数,digitsdata。取补码的正规方法是按位取反得到的反码加上1。16进制下快速算法是找出互补的数,即加上该互补数得10000H。例如求1F5CH补码,1F5CH+E0A4H=10000H。故E0A4H为所求。 已知两个Q.15数相乘的乘积存放于累加器A中。FRCT=0时A为16进制0xFFEA000000,该乘积的十进制数是多少?FRCT=1时A为16进制0x007D000000,该乘积的十进制数又是多少?FRCT=0时累加器A低30位为小数位解法一,取乘积Q.15形式,乘积Q.15形式为D400H=-2C00H/32768=-11264/32768=- 0.34375解法二,运用教材P7公式,EA000000/230=-16000000/230=-11/25=-0.34375解法三,写出小数点后二进制位数值,乘积为-16000000H,小数点后的二进制为01011B,得2-2+2-4+2-5=-11/25=-0.34375FRCT=1时累加器A低31位为小数位解法一,取乘积Q.15形式,乘积Q.15形式为7D00H=32000/32768=0.9765625解法二,运用教材P7公式,7D000000H/231=125/27= 0.9765625解法三,写出小数点后二进制位数值,乘积7D000000H小数点后的二进制为1111101B,得2-1+2-2+2-3+2-4+2-5+2-7=125/27= 0.97656252. 在C54x DSP的C语言开发环境中,数据类型与通常的C语言开发环境的数据类型不同,主要数据类型如下表所示:数据类型位长char, unsigned char16short, unsigned short, signed short16int, unsigned int, signed int16long, unsigned long, signed long32float32double32现在利用一个15阶Hamming低通滤波器对16位音频信号进行FIR滤波。在C54x DSP和CCS2.2上的C语言程序如下:const double coef15 = 0.00482584, 0.00804504,-0.00885584,-0.04291741, -0.02903702, 0.09725365, 0.28342322, 0.37452503, 0.28342322, 0.09725365,-0.02903702,-0.04291741, -0.00885584, 0.00804504, 0.00482584;void fir(int *x, int *y)int i, j;for (i = 0; i 1024; i+)double accumulator = 0.0;for (j = 0; j 15; j+)accumulator += xi - j * coefj;yi = (int)accumulator;以上表达式中,, 分别是低通滤波输入、输出的16位整型数组变量。现在要求把以上过程优化为在C54x平台上运行的精度最高、执行效率最高的16位定点运算形式。试写出在C54x DSP和CCS2.2环境下完成16位相乘和32位累加的定点运算的C程序。第一步:把全部滤波器系数转化为Q.15定点数第二步:把乘累加转化为整数乘法,Q.15乘以整数的小数点位置在第14位和第15位之间,累加结果为32位整数,其中最高两位为符号位,接着15位为整数,低15位为小数第三步:舍去低15位小数,取一位符号位和15位整数位作为滤波输出结果在下面有符号数乘法中小数点位置:const int coef15=158, 264, -290, -1406, -951, 3187, 9287, 12272, 9287, 3187, -951, -1406, -290, 264 158;void fir(int *x, int *y)int i, j;for (i = 0; i 1024; i+)long accumulator = 0;for (j = 0; j 15);3. 解决图像编码中常见的8x8离散余弦变换在VC5402 DSP上定点运算问题。 用C语言写出定点运算实现的程序,并且把最后结果存放到16位整型变量r中。数据类型见前面题3的表格。的Q15定点数是23170的Q15定点数是30274const int x2=153,221;const int y2=23170,30274;long a;int r;a=x0*y0+x1*y1;r=(int)(a15);或者C程序也可写成:long a;int r;a=153*23170+221*30274;r=(int)(a15);在下面有符号数乘法中小数点位置: 用C54x汇编指令写出定点运算实现的代码,并且把最后结果转换为16位整数存放到1102H的地址中。1000H存放153,1001H存放2211002H存放23170,1003H存放30274SSBX FRCTSTM #1000H,AR2STM #1002H,AR3STM #1102H,AR1RPTZ A,#1MAC *AR2+,*AR3+,ASTH A, *AR1在下面有符号数乘法中小数点位置: 现有一个8位无符号字符数118,对其执行浮点运算,VC5402 汇编指令代码段如下:SSBX FRCTMPY *(1000H),#118,AMPYA *(1001H)STH B,*(1002H) 运算前数据页1000H和1001H的地址存放的数据是多少?运算后数据页1002H的地址存放的结果是多少?运算前数据页1000H的地址存放的数据是=23170运算前数据页1001H的地址存放的数据是=30274运算后数据页1002H的地址存放的结果是76,得出过程见于(4)在下面有符号数乘法中小数点位置: 上面的代码段求出的结果是多少?118*23170,乘积取1位符号和高15位得83,再乘以30274,乘积取1位符号和高15位得76写出83和76,得3分写出76,得2分写出77,得1分用计算器,分两步,第一步算取整数得83;第二步算取整数得76用计算器一步算出77,得1分连77都算不出,便不如中学生4. 在VC5402汇编语言程序中需要连续读取散布于数据页地址0A06H,0A27H,0A3AH,0A53H,0A65H,0A92H,0ACAH,0AE0H中的8个数据。要求以最少指令和最快速度读入这8个地址的数据。写出执行指令。注意读入8个地址数据的次序不能改变。如全写成16位地址的直接寻址形式,得一半分LD *(0A06H), ALD *(0A27H), ALD *(0A3AH), ALD *(0A53H), ALD *(0A65H), ALD *(0A92H), ALD *(0ACAH), ALD *(0AE0H), A注意,读用LD *(), A,写用STL A, *()满分答案:7位地址的直接寻址形式RSBX CPL或者CPL=0时LD #14H,DPLD 06H,ALD 27H,ALD 3AH,ALD 53H,ALD 65H,ALD #15H,DPLD 12H,ALD 4AH,ALD 60H,A5. 现在需要对16位整型音频信号数据执行512点FFT,待处理数据放在数据页首地址为0A00H,长度为512的缓冲区内。在按时间抽取基2 FFT碟形运算中输入数据倒序,输出数据顺序。 写出在一个512次循环中以降序ARx-0B读入数据页0BFFH0A00H的512个输入数据的汇编指令代码。STM #0BFFH, AR1STM #256, AR0STM #511, AR2loop:LD *AR1-0B, ABANZ loop, *AR2-或者STM #0BFFH, AR1STM #256, AR0STM #511, BRCRPTB end_loop 1LD *AR1-0B, Aend_loop:或者STM #0BFFH, AR1STM 256, AR0RPT #511LD *AR1-0B, AFFT基2碟形运算,时间抽取时输入乱序、输出顺序;频域抽取时输入顺序、输出乱序AR0数值设为FFT点数一半。循环计数器初值设为循环次数-1也就是FFT点数-1。升序时,AR1数值设为缓冲区首地址,乱序读LD *AR1+0B, A,乱序写STL A, *AR1+0B降序时,AR1数值设为缓冲区尾地址,乱序读LD *AR1-0B, A,乱序写STL A, *AR1-0B 在中已经读取0A65H地址的数据后,随后连续8次读取的输入数据的地址是多少?要求写出详细计算过程,光写对答案不能得满分。第1次:0000,1010,0110,0101-1,0000,0000B=0000,1011,1010,0101=0BA5H第2次:0000,1011,1010,0101-1,0000,0000B=0000,1010,1010,0101=0AA5H第3次:0000,1010,1010,0101-1,0000,0000B=0000,1011,0010,0101=0B25H第4次:0000,1011,0010,0101-1,0000,0000B=0000,1010,0010,0101=0A25H第5次:0000,1010,0010,0101-1,0000,0000B=0000,1011,1100,0101=0BC5H第6次:0000,1011,1100,0101-1,0000,0000B=0000,1010,1100,0101=0AC5H第7次:0000,1010,1100,0101-1,0000,0000B=0000,1011,0100,0101=0B45H第8次:0000,1011,0100,0101-1,0000,0000B=0000,1010,0100,0101=0A45H位倒序加减法必须展开成二进制运算。正常加法,从最右开始,向左进位;正常减法,从最右开始,从左借位。位倒序加法,从最左开始,向右进位;位倒序减法,从最左开始,从右借位。6. 使用VC5402 DSP芯片对一无限长的16位整型音频信号序列执行103阶FIR带通滤波。需要分配滤波数据缓冲区FIR_DATA和滤波系数缓冲区FIR_COEF。现有的在C54x DSP和CCS2.2环境下的C语言程序fir.c和相应的链接命令文件fir.cmd如下:fir.c文件:int fir_data103;int fir_coef103;main()fir(fir_data, fir_coef, signal_len, fp_in, fp_out); /执行FIR滤波的汇编函数fir.cmd文件:MEMORYPAGE 0: /* program space */VECS: origin = 0x0080, length = 0x0080 /* vector table space */PROG: origin = 0x0100, length = 0x2B00 /* program memory space */PAGE 1: /* data space */DAT1: origin = 0x2C00, length = 0x1400 /* application data */DAT2: origin = 0x4000, length = 0x4000 /* application data */SECTIONS .vectors : VECS PAGE 0 /* interrupt vector table */.text : PROG PAGE 0 /* program code */.data : PROG PAGE 0 /* initialized data */.coeffs : PROG PAGE 0 /* initialized parameters */.stack : DAT1 PAGE 1 /* software stack section */.variable : DAT2 PAGE 1 /* uninitialized vars for DSP&AIC10 */.bss : DAT2 PAGE 1 /* uninitialized vars for applications */于是滤波数据缓冲区FIR_DATA和滤波系数缓冲区FIR_COEF 都在片外SRAM中。现在为了提高执行效率尤其在汇编函数中使用双操作数寻址,需要令滤波数据缓冲区FIR_DATA和滤波系数缓冲区FIR_COEF 在片内DARAM中。在上面的C语言程序fir.c和相应的链接命令文件fir.cmd中需要做出哪些改动?写出所有改动的地方。fir.cmd文件:SECTIONS .internal: DAT1 PAGE 1fir.c文件:#pragma DATA_SECTION(fir_data , .internal);#pragma DATA_SECTION(fir_coef , .internal);7. 使用VC5402芯片对一无限长的16位整型音频信号序列执行43阶Hamming低通滤波。每生成一个输出值,线性缓冲区法需要执行43次移动,而循环缓冲区法不需要这样的43次移动,省略43次数据搬移操作,执行效率更高。汇编代码如下:FIR_FILTERING:STM #DATA_PTR+FILTER_LEN-1, STM #COEF_PTR, STM #SIGNAL_LEN-1, AR2 STM #TEMPBUFF,AR1 STM #1, AR0SSBX FRCTloop2:STM , BKPORTR PA1, *AR4+%;PA1为输入端口号LD #0, ASTM , AR3loop1:MAC , , ABANZ loop1, *AR3-STH , *AR1 PORTW *AR1,PA2;PA2为输出端口号BANZ loop2, *AR2-其中DATA_PTR指向输入缓冲区,COEF_PTR指向滤波系数缓冲区。试写出下面问题的答案: 对上面汇编指令代码段中的7个空填入正确答案,使得程序完善并且正确运行。AR4, AR5, #43, #42, *AR4+0%,*AR5+0%,A 为获得正确的滤波结果,对滤波数据缓冲区FIR_DATA和滤波系数缓冲区FIR_COEF有何要求?要求滤波数据缓冲区fir_data和滤波系数缓冲区fir_coef的首地址能被64整除,即首地址的低6位为0。 C程序在VC5402片内DARAM中定义了一段连续内存空间。其它任务分配完后整型指针变量LoopBufHead指向这段内存空间的未分配空间的顶部,具体数值不详。现使用LoopBufHead分配滤波数据缓冲区FIR_DATA和滤波系数缓冲区FIR_COEF。要求在循环缓冲区法的FIR滤波中取得正确滤波结果。写出设置FIR_DATA_PTR和FIR_COEF_PTR的C程序代码。fir_data_ptr=(LoopBufHead+63)&(63);fir_coef_ptr=(LoopBufHead+63)&(63)+64;对于任意地址Address,(Address+63)&(63)求得一个大于等于Address且满足低6位全零的地址 在上面MAC指令循环执行中读出指向输入缓冲区的辅助寄存器内容为12A3H,再执行86次MAC指令后是多少?读出指向滤波系数缓冲区的辅助寄存器内容为12E9H,再执行4次MAC指令所访问的4个内存地址是多少?执行完43次MAC指令后仍然是12A3H在模43的环(集合)内,任意数加上43仍然为原数连续执行4次MAC指令所访问的4个内存地址分别是12EAH, 12C0H, 12C1H循环寻址是以BK寄存器内容(滤波器点数)为模的取模递增运算,环(集合)元素为BK个顺序地址,首地址低N位为0,尾地址低N位为BK-1。且最接近于BK。在本题BK=43,N= 6,集合首地址低6位为零,尾地址低6位为42。12E9H最低6位全零为首地址12C0H,尾地址12C0H+42=12EAH8. 在题7标示为FIR_FILTERING的使用循环缓冲区法完成FIR滤波的汇编指令代码段中存在两重循环嵌套。现有代码采用根据辅助寄存器进行条件跳转的方法实现循环。C54x DSP还提供另外一种执行效率更高的实现循环的方法,即重复和块重复。试写出下面问题的答案: 重复指令RPT和RPTZ使用C54x DSP内核什么专门的寄存器或者标志位?把他们全部列举出来。重复指令RPT和RPTZ使用C54x DSP内核RC寄存器 块重复指令RPTB使用C54x DSP内核什么专门的寄存器或者标志位?把他们全部列举出来。块重复指令RPTB使用C54x DSP内核BRC、RSA、REA寄存器和ST1寄存器的BRAF位 对题7标示为FIR_FILTERING的使用循环缓冲区法完成FIR滤波的汇编指令代码段进行优化,用重复指令和块重复指令完全消除根据辅助寄存器进行条件跳转的指令。FIR_FILTERING:STM #FIR_DATA_PTR+FILTER_LEN-1, AR4STM #FIR_COEF_PTR, AR5STM #SIGNAL_LEN-1, BRC ;循环次数-1 STM #TEMPBUFF,AR1STM #1,AR0STM #43,BKRPTB end_loop - 1PORTR PA1, *AR4+% ;PA1为输入端口号 RPTZ A,#42 ;循环次数-1MAC *AR4+0%, *AR5+0%, A ;双操作数指令,不能用*AR4+%和*AR5+%STH A, *AR1 PORTW *AR1,PA2;PA2为输出端口号end_loop9. 上题7标号为FIR_FILTERING的滤波代码段必须封装成为如下形式的函数方能被C语言主程序调用。void fir(int *fir_ptr, int *coeff_ptr, int len, int *tmpbuff)其中第一形参为指向输入缓冲区的16位整型指针变量data_ptr,第二形参为指向滤波系数缓冲区的16位整型指针变量coef_ptr,第三形参为信号长度,第四形参为指向暂存区的16位整型指针变量tmpbuff。从C语言主函数进入汇编子函数时ST1状态寄存器的CPL位为1。试写出下面问题的答案: 在跳入汇编子程序fir并且执行如下现场保护后,写出把上述fir函数4个形参传递至题7标号为FIR_FILTERING的滤波代码段内相应辅助寄存器的指令。此处可忽略参数的偏移运算。PSHM AR0PSHM AR1PSHM AR2PSHM AR3PSHM AR4PSHM AR5PSHM AR6PSHM AR7FRAME #-12C语言调用汇编子程序时C编译器规则:从C主程序一进入汇编子程序,SP指向返回地址,累加器A存放第一个形参,SP+1指向第二个形参,SP+2指向第三个形参,。由此类推在汇编子程序开头,用pshm保护现场,每条pshm指令使SP递减1。接着使用frame指令为子程序内局部变量分配内存空间。子程序返回时通过累加器A向主程序输出返回值。本题中,新SP=旧SP-20,第一形参传递至AR4,第二形参传递至AR5,第三形参传递至AR2或者BRC,第四形参传递至AR1。STLM A, AR4LD 21, BSTLM B, AR5LD 22, BSTLM B, AR2或者STLM B, BRCLD 23, BSTLM B, AR1使用辅助寄存器的堆栈指针直接寻址指令,每次读入仅需要用一条指令完成。辅助寄存器的堆栈指针直接寻址指令MVKD和MVDK与课内的累加器的堆栈指针直接寻址指令LD和STL/STH之间唯一区别在于操作数由累加器A/B变为*(ARx)。其余完全一致,包括使能标志位CPL。注意不能写为*ARx。否则编译器报错。如MVKD *(AR1), 6指令把AR1内容1234H传递至SP+6地址内存中,使所存数据为1234H。MVDK 8, *(AR2)指令则把SP+8地址的存放数据5678H传递至AR2,使得AR2内容变为5678H。STLM A, AR4MVDK 21, *(AR5)MVDK 22, *(AR2)或者MVDK 22, *(BRC)MVDK 23, *(AR1) 写出返回C语言主函数前执行现场恢复的汇编指令代码。FRAME #12POPM AR7POPM AR6POPM AR5POPM AR4POPM AR3POPM AR2POPM AR1POPM AR0堆栈后进先出。10. 现在需要对信号缓冲区的256个16位有符号整数的音频信号数据减去其均值(直流分量),成为交流信号。信号缓冲区在数据页,首地址2C00H。均值存放于数据页2D00H地址中。去直流分量的汇编指令代码如下:STM #2C00H, AR1LD *(2D00H), BSTM #255, AR0loop:LD *AR1,ASUB B,ASTL A,*AR1+BANZ loop, *AR0-现在要求对上述代码进行优化以提高执行效率,措施包括双16位读写和减法运算、重复或者块重复等。其中仅改写为双16位操作便可使循环次数减半。写出在上述代码基础上经过优化达到最高执行效率的汇编指令代码。STM #2C00H, AR1LD *(2D00H), TSTM #127, BRCSSBX C16RPTB L1-1DSUBT *AR1,ADST A, *AR1+L1:单16位运算改为双16位运算,加ADD改为DADD,减SUB可改为DSUB、DRSUB和DSUBT中最适合于具体应用的一种11. 现在需要在()共8个乘积中取最小值并且存放到数据页1020H的内存中去。和分别存放于首地址为1000H和1010H的长度为8的内存区中,十进制数值如下所示: 在下面所出现的C54x DSP汇编指令中,LD *ar2+, T指令, MPY *AR3+, A/B指令, MIN A指令, STL A, *AR1+指令均是单字指令,MIN A指令的操作是比较两个累加器A和B的数值然后取其中最小值送至累加器A。试写出下面问题的答案:1 写出执行完以下汇编指令后,AR1-1(即AR1所指向的上一个地址)的地址是多少?其中十进制数值是多少?STM #1000H, AR2STM #1010H, AR3STM #1020H, AR1STM #6, AR0LD *AR2+, TMPY *AR3+, Aloop: LD *AR2+, T MPY *AR3+, B MIN A BANZ loop, *AR0- STL A, *AR1+地址是1020H,其中十进制数值是-19252 写出执行完以下汇编指令后,AR1-1(即AR1所指向的上一个地址)的地址是多少?其中十进制数值是多少?STM #1000H, AR2STM #1010H, AR3STM #1020H, AR1STM #6, AR0LD *AR2+, TMPY *AR3+, Aloop: LD *AR2+, T BANZD loop, *AR0- MPY *AR3+, B MIN A STL A, *AR1+地址是1020H,其中十进制数值是-19253 写出执行完以下汇编指令后,AR1-1(即AR1所指向的上一个地址)的地址是多少?其中十进制数值是多少?STM #1000H, AR2STM #1010H, AR3STM #1020H, AR1STM #6, AR0LD *AR2+, TMPY *AR3+, Aloop: LD *AR2+, T BANZ loop, *AR0- MPY *AR3+, B MIN A STL A, *AR1+地址是1020H,其中十进制数值是-6754 写出执行完以下汇编指令后,AR1-1(即AR1所指向的上一个地址)的地址是多少?其中十进制数值是多少?STM #1000H, AR2STM #1010H, AR3STM #1020H, AR1STM #6, AR0LD *AR2+, TMPY *AR3+, Aloop: BANZD loop, *AR0- LD *AR2+, T MPY *AR3+, B MIN A STL A, *AR1+地址是1020H,其中十进制数值是-10355 最后,上面哪段代码正确(与本题第一句话的要求一致)?哪段代码的执行效率最高?第(1)和第(2)段代码正确。第(2)段代码执行效率最高。12. 下面的汇编代码段实现视频编码的16x16方块运动估计。用VC5402的ABDST指令计算当前16x16图像块与参考帧带运动补偿的16x16图像块之间的绝对值和差。其中省略了计算出当前块与参考块指针的部分代码。每行汇编指令后面都标出了指令周期数。试用重复、块重复、跳转延迟等优化措施改写这段代码,使得运算结果相同的情况下执行效率最高。SSBX SXM (1) LD *(pos_size),A (1) STLM A,AR3 (1)L1: (省略) LD *(width),A (1) STLM A,AR0 (1) LD #0,B (1) STM #15,AR2 (1)L2: MVMM AR6,AR4 (1) MVMM AR7,AR5 (1) LD #0,A (1) STM #16,AR1 (1)L3: ABDST *AR4+,*AR5+ (1) BANZ L3,*AR1- (4) MAR *AR6+0 (1) MAR *AR7+0 (1) BANZ L2,*AR2- (4) LD *(BL),A (1) SUB *(min_sad),A (1) BC L4,AGEQ (5) STL B,*(min_sad) (1) LD *(current_pos),A (1) STL A,*(best_pos) (1)L4: ADDM #1,*(current_pos) (2)BANZ L1,*AR3- (4)对此三重循环嵌套改写如下:SSBX SXM (1) LD *(pos_size),A (1) STLM A,AR3 (1)L1: (省略) LD *(width),A (1) STLM A,AR0 (1) LD #0,B (1)STM #15,BRC (1)RPTB L2-1 MVMM AR6,AR4 (1) MVMM AR7,AR5 (1)RPTZ A, #16 ABDST *AR4+,*AR5+ (1) MAR *AR6+0 (1) MAR *AR7+0 (1)L2: LD *(BL),A (1) SUB *(min_sad),A (1) BC L4,AGEQ (5) STL B,*(min_sad) (1) LD *(current_pos),A (1) STL A,*(best_pos) (1)L4: BANZD L1,*AR3- (4)ADDM #1,*(current_pos) (2)13. 根据教材P162的C54x DSP片内定时器的定义与设置回答以下问题: 已知工一407实验室的C5402实验板上晶振10MHz,PRD=4E1FH,TCR=0420H,则定时时间是多少? 现在

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论