资源描述
《DSP原理与应用》练习题参考答案
24学时版本
用于通信方向
注意:红色字体文字为解题注解与说明,万万不可作为答题内容
1. Q.15表示是16位数据中第15位为符号位,第14~0位为小数位。试写出下面问题的答案:
⑴ 分别写出十进制正数0.68和十进制负数-0.245的Q.15表示。
0.68*32768=570AH
-0.245*32768=-1F5CH=E0A4H
⑵ 分别写出Q.15表示的A200H和5A00H的十进制数值。
A200H/32768=-5E00H/32768=- 0.734375
5A00H/32768=0.703125
上面两小题使用教材P7两条公式,公式中Q为数据中的小数位数,digits<->data。取补码的正规方法是按位取反得到的反码加上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.31,也非Q.30
解法一,写出小数点后二进制位数值,乘积为-16000000H,小数点后的二进制为01011B,得2-2+2-4+2-5=-11/25=-0.34375
解法二,运用教材P7公式,EA000000/230=-16000000//230=-11/25=-0.34375
FRCT=1时累加器A低31位为小数位
乘积为Q.31,其中高16位为Q.15
解法一,写出小数点后二进制位数值,乘积7D000000H小数点后的二进制为1111101B,得2-1+2-2+2-3+2-4+2-5+2-7=125/27= 0.9765625
解法二,运用教材P7公式,7D000000H/231=125/27= 0.9765625
解法三,取乘积Q.15形式,乘积Q.15形式为7D00H=32000/32768=0.9765625
2. 解决图像编码中常见的8x8离散余弦变换在VC5402 DSP上定点运算问题。
⑴ 用VC5402指令写出定点运算实现的代码。其中定点乘法精度16位。最后结果保留整数部分。可以利用首地址1000H的128字长数据缓存区存放数据。(10分)
数据页1000H的地址存放的数据是=27246
数据页1001H的地址存放的数据是=12540
1000H存放27246,1001H存放12540,结果存放1002H
SSBX FRCT
MPY *(1000H), #192, A
MPYA *(1001H)
STH B, *(1002H)
以上有符号数乘法中小数点位置:
⑵ 写出用上面(1)的指令段计算出的数值。(6分)
192*27246乘积取1位符号和高15位得159,159*12540乘积取1位符号和高15位得60。
用计算器,分两步,第一步算取整数得159;第二步算取整数得60
61.0924 得0分
61 得1分
60 得2分
159和60 得3分
3. 现在需要对16位整型音频信号数据执行512点FFT,待处理数据放在数据页首地址为0A00H,长度为512的缓冲区内。在按时间抽取基2 FFT碟形运算中输入数据倒序,输出数据顺序。写出在一个512次循环中以降序ARx-0B读入数据页0BFFH~0A00H的512个输入数据的汇编指令代码。
STM #0BFFH, AR1
STM #256, AR0
STM #511, AR2
loop:
LD *AR1-0B, A
BANZ loop, *AR2-
或者
STM #0BFFH, AR1
STM #256, AR0
STM #511, BRC
RPTB end_loop – 1
LD *AR1-0B, A
end_loop:
或者
STM #0BFFH, AR1
STM 256, AR0
RPT #511
LD *AR1-0B, A
FFT基2碟形运算,时间抽取时输入乱序、输出顺序;频域抽取时输入顺序、输出乱序
AR0数值设为FFT点数一半。循环计数器初值设为循环次数-1也就是FFT点数-1。
升序时,AR1数值设为缓冲区首地址,乱序读LD *AR1+0B, A,乱序写STL A, *AR1+0B
降序时,AR1数值设为缓冲区尾地址,乱序读LD *AR1-0B, A,乱序写STL A, *AR1-0B
4. 在VC5402芯片上对无限长16位整型音频信号执行分段实时采集、滤波、输出至功放。其中滤波使用51阶Hamming窗低通滤波以及循环缓冲区方法。汇编指令代码段如下:
LOOP_FILTERING:
STM #DATA_BUF_PTR+50, ①AR3或者AR4
STM #COEF_BUF_PTR, ②AR4或者AR5
STM # LEN -1, AR7
STM #IN_BUF_PTR, AR2
STM #OUT_BUF_PTR, AR1
STM ③#1 , AR0
SSBX ④FRCT
loop2:
STM ⑤#51 , BK
MVDD *AR2+, ⑥AR3+0%或者AR4+0%
LD #0, A
STM ⑦#50 , AR6
loop1:
MAC ⑧AR3+0%或者AR4+0% , ⑨AR4+0%或者AR5+0% , A
BANZ loop1, *AR6-
STH A, *AR1+
BANZ loop2, *AR7-
其中COEF_PTR指向滤波系数缓冲区,DATA_PTR指向输入缓冲区,IN_BUF指向音频采集缓冲区,OUT_BUF指向音频功放输出缓冲区。
试写出下面问题的答案:
(1) 在上面汇编指令代码段中9个标有序号的空中填空,使程序完整并且正确运行。
①AR3或者AR4, ②AR4或者AR5, ③#1, ④#FRCT, ⑤#51,⑥AR3+0%或者AR4+0%,⑦#50,⑧AR3+0%或者AR4+0%, ⑨AR4+0%或者AR5+0%
(2) 在上面代码段跟踪过程中,读出指向滤波系数缓冲区的辅助寄存器内容为10AFH,随后连续执行4次MAC指令所访问的4个内存地址分别是多少?又读出指向输入缓冲区的辅助寄存器内容为10F1H,随后同一辅助寄存器对同一缓冲区访问102次后读数是多少?
循环寻址运算是*ARx+%BK,在BK个地址的集合内循环递增。缓冲区尾地址+1=首地址的条件是首地址低N位全零,N为的最小整数。任意给出一个循环寻址的缓冲区内地址,可唯一确定该缓冲区(首、尾地址)。
本题BK=51,N=6。
第1问,10B0,10B1,10B2,1080
地址10AFH二进制展开后,低6位全零时得首地址1080H,尾地址=1080H+51-1=10B2H
第2问,10F1H
循环寻址的缓冲区内任一地址a+51n=a
5. 在题7标示为LOOP_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标示为LOOP_FILTERING的使用循环缓冲区法完成FIR滤波的汇编指令代码段进行优化,用重复指令和块重复指令完全消除根据辅助寄存器进行条件跳转的指令。
LOOP_FILTERING:
STM #DATA_BUF_PTR+50, AR3
STM #COEF_BUF_PTR, AR4
STM # LEN -1, BRC
STM #IN_BUF_PTR, AR2
STM #OUT_BUF_PTR, AR1
STM #1, AR0
SSBX FRCT
STM #51, BK
RPTB end_loop - 1
MVDD *AR2+, AR3+0%
RTPZA, #50
MAC *AR3+0%, *AR4+0%, A
STH A, *AR1+
end_loop:
6. 上题4标号为LOOP_FILTERING的滤波代码段必须封装成为如下形式的函数方能被C语言主程序调用。
void fir(int *in_buf, int *data_buf, int *coeff_buf, int len, int *out_buf)
其中第一形参为指向音频采集缓冲区的指针in_buf,第二形参为指向输入缓冲区的指针data_buf,第三形参为指向滤波系数缓冲区的指针coeff_buf,第四形参为滤波长度(不等于信号分段长度)len,第五形参为指向音频功放输出缓冲区的指针out_buf。从C主程序跳入汇编子函数时ST1状态寄存器的CPL位自动为1。试写出下面问题的答案:
⑴ 在跳入汇编子程序fir并且执行如下现场保护后,写出把上述fir函数五个形参传递至累加器B的指令。
PSHM AR0
PSHM AR1
PSHM AR2
PSHM AR3
PSHM AR4
PSHM AR5
PSHM AR6
PSHM AR7
FRAME #-12
LDM AL, B或者STLM A, BL
LD @21, B
LD @22, B
LD @23, B
LD @24, B
C语言调用汇编子程序时C编译器规则:
从C主程序一进入汇编子程序,SP指向返回地址,累加器A存放第一个形参,SP+1指向第二个形参,SP+2指向第三个形参,。。。。。。由此类推
在汇编子程序开头,用PSHM保护现场,每条PSHM指令使SP递减1。接着使用FRAME指令为子程序内局部变量分配内存空间。
子程序返回时通过累加器A向主程序输出返回值。
本题中,8条PSHM指令使SP-8,FRAME指令使SP-12,总共减去20,新SP=旧SP-20,第一形参在累加器A,第二形参在SP+21(旧SP=新SP+20,旧SP+1=新SP+20+1),第三形参在SP+22,第四形参在SP+23,第五形参在SP+24
⑵ 写出返回C语言主函数前执行现场恢复的汇编指令代码。
FRAME #12
POPM AR7
POPM AR6
POPM AR5
POPM AR4
POPM AR3
POPM AR2
POPM AR1
POPM AR0
堆栈后进先出。
7. 由美国国家科学奖章获得者、美国高通公司创始人之一兼首席科学家、被誉为CDMA之父的Andrew J. Viterbi发明的Viterbi译码是卷积码的译码方法之一,因运算复杂度最低而广泛用于3G移动通信系统和卫星通信系统的信道纠错与检错。其运算核心为循环执行的加比选ACS碟形运算,VC5402汇编代码如下:
LD *AR2, B ;本地码间汉明距离→BL
ADD *AR5, B, A ;AL=Old_Met(2*j)+BL
SUB *AR5(1), B, B ;BL=Old_Met(2*j+1)-BL
MAX A ;A=max(A, B)
STL A, *AR4+
LD *AR2, B
SUB *AR5+, B, A ;AL=Old_Met(2*j)-BL
ADD *AR5+, B, B ;BL=Old_Met(2*j+1)+BL
MAX A ;A=max(A, B)
STL A, *AR3+
以下优化过程必须用SSBX C16指令设置C16
LD *AR2, T
DADST *AR5, A
DSADT *AR5+, B
CMPS A, *AR4+
CMPS B, *AR3+
以上代码源自文献[SPRA071A , Viterbi Decoding Techniques for the TMS320C54x DSP Generation, P13]。相关汇编指令注释如下:
DADST *ARx, A或者B 累加器高16位=ARx指向的32位数据的高16位+T暂存器,同时累加器低16位=ARx指向的32位数据的低16位-T暂存器
DSADT *ARx, A或者B 累加器高16位=ARx指向的32位数据的高16位-T暂存器,同时累加器低16位=ARx指向的32位数据的低16位+T暂存器
CMPS A或者B, *ARx ARx指向的16位数据=max(累加器低16位, 累加器高16位)
8. 现在需要对信号缓冲区的256个16位有符号整数的音频信号数据减去其均值(直流分量),成为交流信号。信号缓冲区在数据页,首地址2C00H。均值存放于数据页2D00H地址中。去直流分量的汇编指令代码如下:
STM #2C00H, AR1
LD *(2D00H), B
STM #255, AR0
loop:
LD *AR1,A
SUB B,A
STL A,*AR1+
BANZ loop, *AR0-
现在要求对上述代码进行优化以提高执行效率,措施包括双16位读写和减法运算、重复或者块重复等。其中仅改写为双16位操作便可使循环次数减半。写出在上述代码基础上经过优化达到最高执行效率的汇编指令代码。
STM #2C00H, AR1
LD *(2D00H), T
STM #127, BRC 256次SUB变成128次DSUBT
SSBX C16
RPTB L1-1
DSUBT *AR1,A
DST A, *AR1+
L1:
单16位运算改为双16位运算,加ADD改为DADD,减SUB可改为DSUB、DRSUB和DSUBT中最适合于具体应用的一种
9. 实验六A/D转换(输入数据)实验和实验七D/A转换(输出数据)实验利用VC5402 DSP的片内外设第1号多通道缓冲串行口McBSP#1分别接收和发送数据。McBSP的结构方框图如图1所示。在EL-DSP-EXPⅠ教学实验系统中,VC5402的McBSP#1与位于语音处理单元的TLC320AD50C芯片相连,分别完成一维音频信号的输入、A/D转换、DSP采集和DSP输出、D/A转换、输出。
图1 VC5402芯片的片内外设多通道缓冲串行口McBSP的结构方框图
接收数据时,自DR进入的数据最后到达McBSP#1内部16位寄存器DRR1,DDR1在VC5402的数据存储区映像地址是0x0041,同时发生三个动作:①第1号串行口控制寄存器SPCR1的第1bit接收就绪位RRDY(Receive Ready)显1;②RINT线向C5402的CPU发出中断;③REVT线向VC5402的DMA控制器发出事件激励信号。一旦VC5402的CPU或者DMA控制器把DRR1的16位数据读出,1号串行口控制寄存器SPCR1的第1bit接收设备就绪位(Receiver Ready)显0。这样VC5402的CPU或者DMA控制器就逐个读出DRR1的16位数据并且转存到数据缓存区中。实验六的数据缓存区首地址1000H,长度256个16位字。数据缓存区填满后,便可进行数字信号处理。
发送数据时,一旦上一个数据自McBSP#1内部16位寄存器DXR1(DXR1在C5402的数据存储区映像地址是0x0043)复制到发送部件上去(最后从DX发送出去),相当于DXR1被清空,就同时发生三个动作::①第2号串行口控制寄存器SPCR2的第1bit发送设备就绪位XRDY(Transmitter Ready)显1;②XINT线向VC5402的CPU发出中断;③XEVT线向VC5402的DMA控制器发出事件激励信号。一旦VC5402的CPU或者DMA控制器向DXR1写入16位数据,2号串行口控制寄存器SPCR2的第1bit发送设备就绪位XRDY(Transmitt Ready)显0。这样VC5402的CPU或者DMA控制器就把数据缓冲区中经过数字信号处理的数据逐个写入到DXR1。实验七的数据缓存区首地址3000H,长度40个16位字。
实验六和实验七的指导程序都是用CPU查询方式分别完成数据接收和数据发送。现在要求用效率较高的中断方式完成数据接收与发送的方案。相关中断系统参数如图2和图3所示。
图2
图3
如图2所示,VC5402的McBSP#1的接收数据中断位是第10bit,发送数据中断位是第11bit。其中断向量表的偏移量如图3所示,分别是68H和6CH。
试写出把实验六指导程序的查询方式改为中断方式的所有程序代码。
展开阅读全文