西工大DSP大作业
发布时间:2020-05-05 05:30:42
发布时间:2020-05-05 05:30:42
实验1 基于CCS的简单的定点DSP程序
一、实验要求
1、自行安装CCS3.3版本,配置和运行CCS
2、熟悉CCS开发环境,访问读写DSP的寄存器AC0-AC3, ARO-AR7, PC, T0-T3
3、结合C5510的存储器空间分配,访问DSP的内部RAM
4、编写一个最简单的定点DSP程序,计算下面式子 y=0.1*1.2+35*20+15*1.6
5、采用定点DSP进行计算,确定每个操作数的定点表示方法, 最后结果的定点表示方法,并验证结果
6、对编写的程序进行编译、链接、运行、断点执行、单步抽 并给出map映射文件
二、实验原理
DSP芯片的定点运算---Q格式(转) 2008-09-03 15:47 DSP芯片的定点运算
1.数据的溢出:
1>溢出分类: 上溢(overflow): 下溢(underflow)
2>溢出的结果: Max Min
Min Max unsigned char 0 255 signed char -128 127 unsigned int 0 65535 signed int -32768 32767
上溢在圆圈上按数据逆时针移动;下溢在圆圈上顺时钟移动。 例:signed int :32767+1=-32768; -32768-1=32767 unsigned char:255+1=0; 0-1=255
3>为了避免溢出的发生,一般在DSP中可以设置溢出保护功能。当发生溢出时,自动将结果设置为最大值或最小值。
2.定点处理器对浮点数的处理:
1> 定义变量为浮点型(float,double),用C语言抹平定点处理器和浮点处理器 的区别,但是程序的代码庞大,运算速度也慢。
2> 放大若干倍表示小数。比如要表示精度为0.01的变量,放大100倍去运算, 运算完成后再转化。但是这个做法比较僵硬,如要将上面的变量重新定义成0.001精度,又需要放大1000倍,且要重新编写整个程序,考虑溢出等问题。
3>定标法:Q格式:通过假定小数点位于哪一位的右侧,从而确定小数的精度。 Q0:小数点在第0位的后面,即我们一般采用的方法 Q15 小数点在第15位的后面,0~14位都是小数位。 转化公式:Q=(int)(F×pow(2,q)) F=(float)(Q×pow(2,-q))
3. Q格式的运算
1>定点加减法:须转换成相同的Q格式才能加减
2>定点乘法:不同Q格式的数据相乘,相当于Q值相加
3>定点除法:不同Q格式的数据相除,相当于Q值相减
4>定点左移:左移相当于Q值增加
5> 定点右移:右移相当于Q减少
4.Q格式的应用格式
实际应用中,浮点运算大都时候都是既有整数部分,也有小数部分的。所以要选择一个适当的定标格式才能更好的处理运算。一般用如下两种方法:
1> 使用时使用适中的定标,既可以表示一定的整数复位也可以表示小数复位,如 对于2812的32位系统,使用Q15格式,可表示-65536.0~65535.999969482区间内的数据。
三、实验步骤
1. 双击,启动CCS的仿真平台的配着选项。选择C5410 Device Simulator。
2.点击project菜单栏的new选项,新建一个LAB的工程注意存储的路径。
3. 把下图中用到的文件拷到工程文件目录的文件路径下。
4.在ccs平台中将用到的程序导入到平台中,点击project—>add project。选择多个文件时,可以按住ctrl键。
5.将程序中的start改为_main,INT_2改为_int_2。然后点击保存。
源程序代码
*****************************************************
* example.asm y=0.1*x1.2+35*20+15*x1.6 *
*****************************************************
.title “example.asm” ;为汇编源程序取名
.mmregs ;定义存储器映象寄存器
STACK .usect “STACK”,10h ;分配10个单元的堆栈空间
.bss a,4 ;为系数a分配4个单元的空间
.bss x,4 ;为变量x分配4个单元的空间
.bss y,1 ;为结果y 分配1个单元的空间
.def _c_int00 ;定义标号_c_int00
.data ;定义数据代码段
table: .word 1,2,3,4 ;在标号table开始的8个单元中
.word 8,6,4,2 ;为这8个单元赋初值
.text ;定义文本代码段
_c_int00 :
STM #0,SWWSR ;软件等待状态寄存器置0,不设等待
STM #STACK+10h,SP ;设置堆栈指针初值
STM #a,AR1 ;AR1 指向 a的地址
RPT #7 ;从程序存储器向数据存储器
MVPD table,*AR1+ ;重复传送 8个数据
CALL SUM ;调用 SUM 实现乘法累加和的子程序
end: B end ;循环等待
SUM:STM #a,AR3 ;将系数a的地址赋给AR3
STM #x,AR4 ;将变量x的地址赋给AR3
RPTZ A,#3 ;将A清0,并重复执行下条指令4次
MAC *AR3+,*AR4+,A ;执行乘法并累加,结果放在A中
STL A,@y ;将A的低字内容送结果单元y
RET ;结束子程序
.end ;结束全部程序
Map文件
*****************************************************************************
TMS320C55x COFF Linker PC Version 3.83
******************************************************************************
>> Linked Mon May 31 11:03:33 2010
OUTPUT :
ENTRY POINT SYMBOL: "_main" address: 0000e000
MEMORY CONFIGURATION
name origin length used attr fill
---------------------- -------- --------- -------- ---- --------
PAGE 0: EPROM 0000e000 00000100 0000001d RWIX
vecs 0000ff80 00000004 00000000 RWIX
PAGE 1: SPRAM 00000060 00000020 0000000b RWIX
DARAM 00000080 00000100 0000001a RWIX
SECTION ALLOCATION MAP
output attributes/
section page origin length input sections
-------- ---- ---------- ---------- ----------------
.text 0 0000e000 0000001d
0000e000 0000001d LAB4A.obj (.text)
.bss 1 00000060 0000000b UNINITIALIZED
四、心得体会
经过这次实验,我更加熟悉CCS开发环境,访问读写DSP的寄存器AC0-AC3, ARO-AR7, PC, T0-T3 。
实验2 CCS下的FFT算法程序设计
一、 实验目的
CCS下的FFT算法程序设计
二、 实验要求
提供一个CCS下的C语言例程,在CCS下,仿照例程,任选雨中FIR滤波、IIR滤波、FFT算法,采用C语言完成代码的编写、编译、链接、下载和运行,输入数据,滤波器系数任选,并给出运算结果。
1)目的
2)工程文件的构成,并附图
3)打印源代码
4)打印编译成功的信息
5)打印map文件
6)程序下载的截图过程
三) 运行结果
三、 实验步骤
1、在ccs平台中将用到的程序导入到平台中,点击project—>add project。选择多个文件时,可以按住ctrl键。
2.将所有的程序段中的start改为_main,将fft.Asm中的
K_FFT_SIZE .set 32 ;N
K_LOGN .set 5 ;LOG(N)
改为
K_FFT_SIZE .set 64 ;N
K_LOGN .set 6 ;LOG(N)
3、对源文件进行编译(注意先对每个.asm文件先进行编译,以防止程序有错误),没有错误时进行链接。
4.点击菜单 program。装载.out文件
四、 实验结果
五、 源程序代码
***************************************************************** 函数原型:void FFT(struct compx *xin,int N) 函数功能:对输入的复数组进行快速傅里叶变换(FFT) 输入参数:*xin复数结构体组的首地址指针,struct型 *****************************************************************/ void FFT(struct compx *xin) { int f,m,nv2,nm1,i,k,l,j=0;
struct compx u,w,t;
nv2=FFT_N/2; //变址运算,即把自然顺序变成倒位序,采用雷德算法
nm1=FFT_N-1;
for(i=0;i
{ if(i
xin[j]=xin[i];
xin[i]=t; }
k=nv2; //求j的下一个倒位序 while(k<=j) //如果k<=j,表示j的最高位为1 {
j=j-k; //把最高位变成0
k=k/2; //k/2,比较次高位,依次类推,逐个比较,直到某个位为0 }
j=j+k; //把0改为1 } { int le,lei,ip; //FFT运算核,使用蝶形运算完成FFT运算
f=FFT_N;
for(l=1;
(f=f/2)!=1;l++) //计算l的值,即计算蝶形级数 ;
for(m=1;m<=l;m++) // 控制蝶形结级数
{ //m表示第m级蝶形,l为蝶形级总数
l=log(2)N le=2<<(m-1); //le蝶形结距离,即第m级蝶形的蝶形结相距le点
lei=le/2; //同一蝶形结中参加运算的两点的距离
u.real=1.0; //u为蝶形结运算系数,初始值为1
u.imag=0.0;
w.real=cos(PI/lei); //w为系数商,即当前系数与前一个系数的商
w.imag=-sin(PI/lei);
for(j=0;j<=lei-1;j++) //控制计算不同种蝶形结,即计算系数不同的蝶形结
{
for(i=j;i<=FFT_N-1;i=i+le) //控制同一蝶形结运算,即计算系数相同蝶形结
{
ip=i+lei; //i,ip分别表示参加蝶形运算的两个节点
t=EE(xin[ip],u); //蝶形运算,详见公式 xin[ip].real=xin[i].real-t.real; xin[ip].imag=xin[i].imag-t.imag; xin[i].real=xin[i].real+t.real; xin[i].imag=xin[i].imag+t.imag;
}
u=EE(u,w); //改变系数,进行下一个蝶形运算
}
}
}
}
Map文件
******************************************************************************
TMS320C55x COFF Linker PC Version 3.3
******************************************************************************
>> Linked Sat May 30 23:48:27 2015
OUTPUT :
ENTRY POINT SYMBOL: "_main" address: 0000e000
MEMORY CONFIGURATION
name origin length used attr fill
---------------------- -------- --------- -------- ---- --------
PAGE 0: EPROM 0000e000 00000100 00000019 RWIX
PAGE 1: SPRAM 00000060 00000020 0000000a RWIX
DARAM 00000080 00000100 00000000 RWIX
SECTION ALLOCATION MAP
output attributes/
section page origin length input sections
-------- ---- ---------- ---------- ----------------
.text 0 0000e000 00000012
0000e000 00000012 LAB2B.obj (.text)
.data 0 0000e012 00000005
0000e012 00000005 LAB2B.obj (.data)
.vectors 0 0000e017 00000002
0000e017 00000002 VECTORS.obj (.vectors)
.bss 1 00000060 0000000a UNINITIALIZED
00000060 0000000a LAB2B.obj (.bss)
GLOBAL SYMBOLS: SORTED ALPHABETICALLY BY Name
address name
-------- ----
00000060 .bss
0000e012 .data
0000e000 .text
00000060 ___bss__
ffffffff ___cinit__
0000e012 ___data__
0000e017 ___edata__
0000006a ___end__
0000e012 ___etext__
ffffffff ___pinit__
0000e000 ___text__
00000000 __lflags
UNDEFED _c_int00
0000e000 _main
ffffffff cinit
0000e017 edata
0000006a end
0000e012 etext
ffffffff pinit
GLOBAL SYMBOLS: SORTED BY Symbol Address
address name
-------- ----
00000000 __lflags
00000060 ___bss__
00000060 .bss
0000006a ___end__
0000006a end
0000e000 .text
0000e000 ___text__
0000e000 _main
0000e012 .data
0000e012 etext
0000e012 ___data__
0000e012 ___etext__
0000e017 edata
0000e017 ___edata__
ffffffff pinit
ffffffff ___pinit__
ffffffff ___cinit__
ffffffff cinit
UNDEFED _c_int00
[19 symbols]
六、 心得体会
经过这次实验,我更加熟悉CCS开发环境,CCS下的C语言例程下的 FFT算法,采用C语言完成代码的编写、编译、链接、下载和运行的方法。