广东工业大学DSP原理课练习题通信参考答案Word格式文档下载.docx
《广东工业大学DSP原理课练习题通信参考答案Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《广东工业大学DSP原理课练习题通信参考答案Word格式文档下载.docx(24页珍藏版)》请在冰豆网上搜索。
float
double
现在利用一个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程序。
第一步:
把滤波器系数转化为Q15定点数
第二步:
把乘累加转化为整数乘法,Q15乘以整数的小数点位置在第14位和第15位之间,累加结果为32位整数,其中最高两位为符号位,接着15位为整数,低15位为小数
第三步:
舍去低15位小数,取一位符号位和15位整数位作为滤波输出结果
constintcoef[15]={158,264,-290,-1406,-951,3187,9287,12272,9287,3187,-951,-1406,-290,264158};
longaccumulator=0;
y[i]=(int)(accumulator>
>
15);
3.解决图像编码中常见的8x8离散余弦变换在VC5402DSP上定点运算问题。
⑴用C语言编写VC5402上用定点运算实现
的程序,并且把最后结果存放到16位整型变量r中。
数据类型见前面题3的表格。
的Q15定点数是23170,5A82H
的Q15定点数是30274,7642H
constintx[2]={153,221};
constinty[2]={23170,30274};
longa;
intr;
a=x[0]*y[0]+x[1]*y[1];
r=(int)(a>
或者C程序也可写成:
a=153*23170+221*30274;
⑵用C54x汇编指令写出用定点运算实现
的代码,并且把最后结果转换为16位整数存放到1102H的地址中。
1000H存放153,1001H存放221
1002H存放23170,1003H存放30274
SSBXFRCT
STM#1000H,AR2
STM#1002H,AR3
STM#1004H,AR1
RPTZA,#1
MAC*AR2+,*AR3+,A
STHA,AR1
⑶现有一个8位无符号字符数216,对其执行浮点运算
。
在VC5402上的汇编指令代码段如下:
SSBXFRCT
MPY*(1000H),#216,A
MPYA*(1001H)
STHB,*(1002H)
运算前数据页1000H和1001H的地址存放的数据是多少?
运算后数据页1002H的地址存放的结果是多少?
用CCS可以算出140,与笔算一致
笔算方法:
216*23170=5004720,取1位符号和15位得152,乘以27246后再取1位符号和15位得140
运算前数据页1000H的地址存放的数据是
=23170=7642H
运算前数据页1001H的地址存放的数据是
=30274=7642H
运算后数据页1002H的地址存放的结果是8CH=140
⑷上面⑶的运算精度偏低。
如何在⑶中插入移位指令提高运算精度?
写出完整的指令代码。
在第一次乘法后果把A右移8位,接着在第二次乘法后左移8位
SFTAA,#8
SFTAB,#-8
STHB,*(1002H)
这样可得141
⑸在以上⑴~⑷的基础上简述如何在VC5402上使用MAC指令通过双重循环嵌套的16位定点乘累加运算求出一个图像数据的8x8离散余弦变换系数?
忽略常数项的8x8离散余弦变换为:
用
后取整的方法,求出8个余弦常数的Q15数,存放到内存。
把FRCT置1
在内循环用MAC指令计算
与Q15余弦常数的乘累加,32位结果存放A累加器
在外循环用MAC指令计算A的高16位与Q15余弦常数的乘累加,高16位为最后结果。
4.在VC5402汇编语言程序中需要连续读取散布于数据页地址0A06H,0A27H,0A3AH,0A53H,0A65H,0A92H,0ACAH,0AE0H中的8个数据。
要求以最少指令和最快速度读入这8个地址的数据。
写出执行指令。
注意读入8个地址数据的次序不能改变。
如全写成绝对寻址,得一半分
LD*(0A06H),A
LD*(0A27H),A
LD*(0A3AH),A
LD*(0A53H),A
LD*(0A65H),A
LD*(0A92H),A
LD*(0ACAH),A
LD*(0AE0H),A
满分答案:
RSBXCPL或者CPL=0时
LD#14H,DP
LD@06H,A
LD@27H,A
LD@3AH,A
LD@53H,A
LD@65H,A
LD#15H,DP
LD@12H,A
LD@4AH,A
LD@60H,A
5.当VC5402内部ST1状态寄存器第14位CPL=1同时数据页指针寄存器DP=1000H,堆栈指针寄存器SP=0275H时,指令LD2AH,A和LD82H,A所读取的数据页地址是多少?
当CPL=1同时DP=0480H,SP=1C22H时,指令LD40H,A和LD2A6H,A所读取的数据页地址又是多少?
CPL=1,指令LD2AH,A和LD82H,A所读取的数据页地址分别是029FH和0277H
CPL=1,指令LD40H,A和LD2A6H,A所读取的数据页地址分别是1C62H和1C48H
注意,DP有效位数9位,直接寻址位数7位
6.现在需要对16位整型音频信号数据执行512点FFT,待处理数据放在数据页首地址为0A00H,长度为512的缓冲区内。
在按时间抽取基2FFT碟形运算中输入数据倒序,输出数据顺序。
⑴写出在一个512次循环中以降序ARx-0B读入数据页0BFFFH~0A00H的256个输入数据的汇编指令代码。
STM#0BFFH,AR1
STM#256,AR0
STM#511,AR2
loop:
LD*AR1-0B,A
BANZloop,*AR2-
或者
STM#511,BRC
RPTBend_loop–1
end_loop:
RPT#511
⑵在⑴中已经读取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
0000,1011,0100,0101-1,0000,0000B=0000,1010,0100,0101=0A45H
7.现在需要对16位整型音频信号数据执行128点FFT,待处理数据放在数据页首地址为1200H,长度为128的缓冲区内。
⑴写出在一个128次循环中以升序ARx+0B读入数据页1200H~127FH的128个输入数据的汇编指令代码。
STM#1200H,AR1
STM#64,AR0
STM#127,AR2
LD*AR1+0B,A
STM#127,BRC
RPT#127
⑵在⑴中已经读取1239H地址的数据后,随后连续8次读取的输入数据的地址是多少?
计算过程,光写对答案不能得满分。
0001,0010,0011,1001+0100,0000B=0001,0010,0111,1001=1279H
0001,0010,0111,1001+0100,0000B=0001,0010,0000,0101=1205H
0001,0010,0000,0101+0100,0000B=0001,0010,0100,0101=1245H
0001,0010,0100,0101+0100,0000B=0001,0010,0010,0101=1225H
0001,0010,0010,0101+0100,0000B=0001,0010,0110,0101=1265H
0001,0010,0110,0101+0100,0000B=0001,0010,0001,0101=1215H
0001,0010,0001,0101+0100,0000B=0001,0010,0101,0101=1255H
0001,0010,0101,0101+0100,0000B=0001,0010,0011,0101=1235H
8.使用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中需要做出哪些改动?
写出所有改动的地方。
.internal:
DAT1PAGE1
#pragmaDATA_SECTION(fir_data,"
.internal"
);
#pragmaDATA_SECTION(fir_coef,"
9.使用VC5402芯片对一无限长的16位整型音频信号序列执行43阶Hamming低通滤波。
每生成一个输出值,线性缓冲区法需要执行43次移动,而循环缓冲区法不需要这样的43次移动,省略43次数据搬移操作,执行效率更高。
汇编代码如下:
FIR_FILTERING:
STM#FIR_DATA_PTR+FILTER_LEN-1,①
STM#FIR_COEF_PTR,②
STM#SIGNAL_LEN-1,AR2
STM#TEMPBUFF,AR1
STM#1,AR0
loop2:
STM③,BK
PORTRPA1,*AR4+%;
PA1为输入端口号
LD#0,A
STM④,AR3
loop1:
MAC⑤,⑥,A
BANZloop1,*AR3-
STH⑦,*AR1
PORTW*AR1,PA2;
PA2为输出端口号
BANZloop2,*AR2-
其中FIR_DATA_PTR指向输入缓冲区FIR_DATA,FIR_COEF_PTR指向滤波系数缓冲区FIR_COEF。
⑴对上面汇编指令代码段中的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位全零的地址
⑷在上面的汇编指令代码段执行过程中,读出指向输入缓冲区的辅助寄存器在loop1标号前为12A3H,执行完43次MAC指令后是多少?
读出指向滤波系数缓冲区的辅助寄存器为12E8H,然后连续执行8次MAC指令所访问的8个内存地址分别是多少?
执行完43次MAC指令后仍然是12A3H在模43的环内,任意数加上43仍然为原数
连续执行8次MAC指令所访问的8个内存地址分别是12E9H,12EAH,12C0H,12C1H,12C2H,12C3H,12C4H,12C5H首地址是12E8H的最低6位全零的地址,即12C0H
10.在上面题9标示为FIR_FILTERING的使用循环缓冲区法完成FIR滤波的汇编指令代码段中存在两重循环嵌套。
现有代码采用根据辅助寄存器进行条件跳转的方法实现循环。
C54xDSP还提供另外一种执行效率更高的实现循环的方法,即重复和块重复。
⑴重复指令RPT和RPTZ使用C54xDSP内核什么专门的寄存器或者标志位?
把他们全部列举出来。
重复指令RPT和RPTZ使用C54xDSP内核RC寄存器
⑵块重复指令RPTB使用C54xDSP内核什么专门的寄存器或者标志位?
块重复指令RPTB使用C54xDSP内核BRC、RSA、REA寄存器和ST1寄存器的BRAF位
⑶对上面题10标示为FIR_FILTERING的使用循环缓冲区法完成FIR滤波的汇编指令代码段进行优化,用重复指令和块重复指令完全消除根据辅助寄存器进行条件跳转的指令。
写出完整的FIR滤波的汇编指令代码段。
STM#FIR_DATA_PTR+FILTER_LEN-1,AR4
STM#FIR_COEF_PTR,AR5
STM#SIGNAL_LEN-1,BRC
STM#1,AR0
STM#43,BK
RPTBend_loop-1
RPTZA,#42
MAC*AR4+0%,*AR5+0%,A
STHA,*AR1
end_loop
11.上面10题由C语言主函数调用汇编子函数fir,形式如下:
voidfir(int*fir_ptr,int*coeff_ptr,longlen,FILE*fp_in,FILE*fp_out)
其中第一形参为指向输入缓冲区的16位整型指针变量fir_data,第二形参为指向滤波系数缓冲区的16位整型指针变量fir_coef,第三形参为32位的信号长度,第四、第五形参分别为16位的输入、输出磁盘文件指针。
从C语言主函数进入汇编子函数时ST1状态寄存器的CPL位为1。
C语言调用汇编子程序时C编译器规则:
从C主程序一进入汇编子程序,SP指向返回地址,累加器A存放第一个形参,SP+1指向第二个形参,SP+2指向第三个形参,。
由此类推
在汇编子程序开头,用pshm保护现场,每条pshm指令使SP递减1。
还使用frame指令为子程序内局部变量分配内存空间。
子程序返回时通过累加器A向主程序输出返回值
⑴在跳入汇编子函数fir并且执行如下现场保护后,写出把这五个形参数值传输至累加器B的指令。
其中16位形参传输至B的低16位,32位形参(在堆栈中已经偶地址对齐)传输至B的32位。
PSHMAR1
PSHMAR6
PSHMAR7
PSHMAR0
PSHMST1
FRAME#-13
注意FRAME#