DSP原理课练习题参考答案信卓.docx
《DSP原理课练习题参考答案信卓.docx》由会员分享,可在线阅读,更多相关《DSP原理课练习题参考答案信卓.docx(27页珍藏版)》请在冰豆网上搜索。
DSP原理课练习题参考答案信卓
《DSP原理与应用》练习题参考答案
34学时版本
注意:
红色字体文字为解题注解与说明,万万不可作为答题内容
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为数据中的小数位。
取补码的正规方法是按位取反得到的反码加上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位为小数位
解法一,写出小数点后二进制位数值,注意何时按1写数值,乘积为-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
解法一,写出小数点后二进制位数值,注意何时按1写数值,乘积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
解法三,取高16位为Q.15,乘积Q.15形式为7D00H=32000/32768=0.9765625
2.在C54xDSP的C语言开发环境中,数据类型与通常的C语言开发环境的数据类型不同,主要数据类型如下表所示:
数据类型
位长
char,unsignedchar
16
short,unsignedshort,signedshort
16
int,unsignedint,signedint
16
long,unsignedlong,signedlong
32
float
32
double
32
现在利用一个15阶Hamming低通滤波器对16位音频信号进行FIR滤波。
在C54xDSP和CCS2.2上的C语言程序如下:
constdoublecoef[15]={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};
voidfir(int*x,int*y)
{
inti,j;
for(i=0;i<1024;i++)
{
doubleaccumulator=0.0;
for(j=0;j<15;j++)
{
accumulator+=x[i-j]*coef[j];
}
y[i]=(int)accumulator;
}
}
以上表达式中,
分别是低通滤波输入、输出的16位整型数组变量。
现在要求把以上过程优化为在C54x平台上运行的精度最高、执行效率最高的16位定点运算形式。
试写出在C54xDSP和CCS2.2环境下完成16位相乘和32位累加的定点运算的C程序。
第一步:
把滤波器系数转化为Q.15定点数
第二步:
把卷积运算从浮点乘加转化为整数乘加,Q.15乘以整数的小数点位置在第14位和第15位之间,累加结果为32位整数,其中最高两位为符号位,接着15位为整数,低15位为小数
第三步:
右移15位,取低16位,得到包含一位符号位和15位整数位的滤波输出结果
卷积运算中小数点位置如下:
[参考答案]
constintcoef[15]={158,264,-290,-1406,-951,3187,9287,12272,9287,3187,-951,-1406,-290,264158};
voidfir(int*x,int*y)
{
inti,j;
for(i=0;i<1024;i++)
{
longaccumulator=0;
for(j=0;j<15;j++)
{
accumulator+=x[i-j]*coef[j];
}
y[i]=(int)(accumulator>>15);
}
}
3.解决图像编码中常见的8x8离散余弦变换在VC5402DSP上定点运算问题。
⑴用C语言写出定点运算实现
的程序,并且把最后结果存放到16位整型变量r中。
数据类型见前面题3的表格。
[参考答案]
的Q15定点数是
32768=23170
的Q15定点数是
32768=30270
longa;
intr;
a=153*23170+221*30274;
r=(int)(a>>15);
以上有符号数乘加运算中小数点位置:
⑵用C54x汇编指令写出定点运算实现
的代码,并且把最后结果转换为16位整数存放到1102H的地址中。
[参考答案]
16位整数存放到1102H的地址中。
1000H存放153,1001H存放221
1002H存放23170,1003H存放30274
SSBXFRCT
STM#1000H,AR2
STM#1002H,AR3
STM#1102H,AR1
RPTZA,#1
MAC*AR2+,*AR3+,A
STHA,*AR1
以上有符号数乘加运算中小数点位置:
⑶现有一个8位无符号字符数118,对其执行浮点运算
,VC5402汇编指令代码段如下:
SSBXFRCT
MPY*(1000H),#118,A
MPYA*(1001H)
STHB,*(1002H)
运算前数据页1000H和1001H的地址存放的数据是多少?
运算后数据页1002H的地址存放的结果是多少?
[参考答案]
运算前数据页1000H的地址存放的数据是
=23170
运算前数据页1001H的地址存放的数据是
=30274
运算后数据页1002H的地址存放的结果是76
以上有符号数乘法中小数点位置:
⑷上面⑶的代码段求出
的结果是多少?
[参考答案]118*23170乘积取高16位得83,83*30274乘积取高16位得76。
用计算器,分两步,第一步算
取整数得83;第二步算
取整数得76
77.0872得0分
77得1分
76得2分
83和76得3分
4.现在需要对16位整型音频信号数据执行512点FFT,待处理数据放在数据页首地址为0A00H,长度为512的缓冲区内。
在按时间抽取基2FFT碟形运算中输入数据倒序,输出数据顺序。
⑴写出在一个512次循环中以降序ARx-0B读入数据页0BFFH~0A00H的512个输入数据的汇编指令代码。
[参考答案]
STM#0BFFH,AR1
STM#256,AR0
STM#511,AR2
loop:
LD*AR1-0B,A
BANZloop,*AR2-
或者
STM#0BFFH,AR1
STM#256,AR0
STM#511,BRC
RPTBend_loop–1
LD*AR1-0B,A
end_loop:
或者
STM#0BFFH,AR1
STM256,AR0
RPT#511
LD*AR1-0B,A
FFT基2碟形运算的两种结构造成读/写乱序。
*ARx
0B指令通过FFT点数/2为增量的位倒序加/减运算实现自动抽取,有效提高代码效率和执行效率。
时间抽取时输入乱序、输出顺序;频域抽取时输入顺序、输出乱序
AR0数值设为FFT点数一半。
循环计数器初值设为循环次数-1也就是FFT点数-1。
升序时,AR1数值设为缓冲区首地址,乱序读LD*AR1+0B,A,乱序写STLA,*AR1+0B
降序时,AR1数值设为缓冲区尾地址,乱序读LD*AR1-0B,A,乱序写STLA,*AR1-0B
⑵在⑴中已经读取0A65H地址的数据后,随后连续8次读取的输入数据的地址是多少?
要求写出详细计算过程,光写对答案不能得满分。
FFT乱序寻址为以FFT点数一半作增/减量的位倒序加/减法运算:
从最左位开始二进制加/减运算,向右进/借位。
[参考答案]
第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
5.使用VC5402DSP芯片对一无限长的16位整型音频信号序列执行103阶FIR带通滤波。
需要分配滤波数据缓冲区FIR_DATA和滤波系数缓冲区FIR_COEF。
现有的在C54xDSP和CCS2.2环境下的C语言程序fir.c和相应的链接命令文件fir.cmd如下:
fir.c文件:
intfir_data[103];
intfir_coef[103];
main()
{
fir(fir_data,fir_coef,signal_len,fp_in,fp_out);//执行FIR滤波的汇编函数
}
fir.cmd文件:
MEMORY
{
PAGE0:
/*programspace*/
VECS:
origin=0x0080,length=0x0080/*vectortablespace*/
PROG:
origin=0x0100,length=0x2B00/*programmemoryspace*/
PAGE1:
/*dataspace*/
DAT1:
origin=0x2C00,length=0x1400/*applicationdata*/
DAT2:
origin=0x4000,length=0x4000/*applicationdata*/
}
SECTIONS
{
.vectors:
{}>VECSPAGE0/*interruptvectortable*/
.text:
{}>PROGPAGE0/*programcode*/
.data:
{}>PROGPAGE0/*initializeddata*/
.coeffs:
{}>PROGPAGE0/*initializedparameters*/
.stack:
{}>DAT1PAGE1/*softwarestacksection*/
.variable:
{}>DAT2PAGE1/*uninitializedvarsforDSP&AIC10*/
.bss:
{}>DAT2PAGE1/*uninitializedvarsforapplications*/
}
于是滤波数据缓冲区FIR_DATA和滤波系数缓冲区FIR_COEF都在片外SRAM中。
现在为了提高执行效率尤其在汇编函数中使用双操作数寻址,需要令滤波数据缓冲区FIR_DATA和滤波系数缓冲区FIR_COEF在片内DARAM中。
在上面的C语言程序fir.c和相应的链接命令文件fir.cmd中需要做出哪些改动?
写出所有改动的地方。
[参考答案]
fir.cmd文件:
SECTIONS
{
.internal:
{}>DAT1PAGE1
}
fir.c文件:
#pragmaDATA_SECTION(fir_data,".internal");
#pragmaDATA_SECTION(fir_coef,".internal");
6.在VC5402芯片上对无限长16位整型音频信号执行分段实时采集、滤波、输出至功放。
其中滤波使用51阶Hamming窗低通滤波以及循环缓冲区方法。
汇编指令代码段如下:
LOOP_FILTERING:
STM#DATA_PTR+50,①
STM#COEF_PTR,②
STM#LEN-1,AR7
STM#IN_PTR,AR1
STM#OUT_PTR,AR2
STM③,AR0
SSBX④
loop2:
STM⑤,BK
MVDD*AR1+,⑥
LD#0,A
STM⑦,AR6
loop1:
MAC⑧,⑨,A
BANZloop1,*AR6-
STHA,*AR2+
BANZloop2,*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次后读数是多少?
[参考答案]
循环缓冲区法相对于线性缓冲区法省去R-1(R为滤波系数数目)次数据搬移的关键在于循环寻址:
尾地址+1=首地址。
数学方法是取余运算(%)。
C5000系列实现方法是旧版教材图3-5的位操作结合条件判断。
循环缓冲区的位置,即缓冲区首地址必须满足一定条件,循环寻址方正确执行。
采用取余运算时,首地址必须被R(滤波系数数目)整除;采用旧版教材图3-5的位操作结合条件判断时,首地址必须低N位全零,N为
的最小整数。
其中N最小的意义是尽可能减小两个缓冲区之间间隔。
滤波系数数目R存放于BK寄存器中。
任意给出一个循环寻址的缓冲区内地址,可唯一确定该缓冲区(首、尾地址)。
本题BK=51,N=6。
第1问,10B0H,10B1H,10B2H,1080H
地址10AFH二进制展开后,低6位全零时得首地址1080H,尾地址=1080H+51-1=10B2H
第2问,10F1H
循环寻址的缓冲区内任一地址a+51n=a
7.在题6标示为LOOP_FILTERING的使用循环缓冲区法完成FIR滤波的汇编指令代码段中存在两重循环嵌套。
现有代码采用根据辅助寄存器进行条件跳转的方法实现循环。
C54xDSP还提供另外一种执行效率更高的实现循环的方法,即重复和块重复。
试写出下面问题的答案:
⑴重复指令RPT和RPTZ使用C54xDSP内核什么专门的寄存器或者标志位?
把他们全部列举出来。
[参考答案]重复指令RPT和RPTZ使用C54xDSP内核RC寄存器
⑵块重复指令RPTB使用C54xDSP内核什么专门的寄存器或者标志位?
把他们全部列举出来。
[参考答案]块重复指令RPTB使用C54xDSP内核BRC、RSA、REA寄存器和ST1寄存器的BRAF位
⑶对题6标示为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
SSBXFRCT
STM#51,BK
RPTBend_loop–1循环体尾地址赋给REA寄存器,写法是循环体外后一条指令地址-1
MVDD*AR2+,AR3+0%
RPTZA,#50
MAC*AR3+0%,*AR4+0%,A
STHA,*AR1+
end_loop:
8.题6标号为LOOP_FILTERING的滤波代码段必须封装成为如下形式的函数方能被C语言主程序调用。
voidfir(int*in_buf,int*data_buf,int*coeff_buf,intlen,int*out_buf)
其中第一形参为指向音频采集缓冲区的指针in_buf,第二形参为指向输入缓冲区的指针data_buf,第三形参为指向滤波系数缓冲区的指针coeff_buf,第四形参为滤波长度(不等于信号分段长度)len,第五形参为指向音频功放输出缓冲区的指针out_buf。
从C主程序跳入汇编子函数时ST1状态寄存器的CPL位自动为1。
试写出下面问题的答案:
(1)在跳入汇编子程序fir并且执行如下现场保护后,写出把上述fir函数五个形参传递至累加器B的指令。
PSHMAR0
PSHMAR1
PSHMAR2
PSHMAR3
PSHMAR4
PSHMAR5
PSHMAR6
PSHMAR7
FRAME#-12
[参考答案]
LDMAL,B或者STLMA,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
(2)写出返回C语言主程序前执行现场恢复的汇编指令代码。
[参考答案]
FRAME#12
POPMAR7
POPMAR6
POPMAR5
POPMAR4
POPMAR3
POPMAR2
POPMAR1
POPMAR0
堆栈后进先出。
9.现在需要对信号缓冲区的256个16位有符号整数的音频信号数据减去其均值(直流分量),成为交流信号。
信号缓冲区在数据页,首地址2C00H。
均值存放于数据页2D00H地址中。
去直流分量的汇编指令代码如下:
STM#2C00H,AR1
LD*(2D00H),B
STM#255,AR0
loop:
LD*AR1,A
SUBB,A
STLA,*AR1+
BANZloop,*AR0-
现在要求对上述代码进行优化以提高执行效率,措施包括双16位读写和减法运算、重复或者块重复等。
其中仅改写为双16位操作便可使循环次数减半。
写出在上述代码基础上经过优化达到最高执行效率的汇编指令代码。
[参考答案]
STM#2C00H,AR1
LD*(2D00H),T
STM#127,BRC256次SUB变成128次DSUBT
SSBXC16双16位运算才有意义
RPTBL1-1
DSUBT*AR1,A
DSTA,*AR1+
L1:
单16位运算改为双16位运算,加ADD改为DADD,减SUB可改为DSUB、DRSUB和DSUBT中最适合于具体应用的一种。
注意双16位优化中要求数组首地址必须为偶数的问题。
10.由美国国家科学奖章获得者、美国高通公司创始人之一兼首席科学家、被誉为CDMA之父的AndrewJ.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
MAXA;A=max(A,B)
STLA,*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
MAXA;A=max(A,B)
STLA,*AR3+
现在要求用双16位运算指令对以上汇编代码进行优化以提高一倍运算效率。
写出经过双16位运算优化后达到最高执行效率的汇编指令代码。
已知每次ACS碟形运算开始时AR5内容为偶数。
[参考答案]
以下优化过程必须用SSBXC16指令设置C16
LD*AR2,T
DADST*AR5,A
DSADT*AR5+,B
CMPSA,*AR4+
CMPSB,*AR3+
以上代码源自文