DSP原理及应用实验四:浮点运算程序
- 格式:ppt
- 大小:46.00 KB
- 文档页数:4
DSP中浮点转定点运算--举例及编程中的⼼得5.举例及编程中的⼼得5.1举例 “第3章 DSP芯⽚的定点运算.doc”这篇⽂章中给了⼀个很简单有能说明问题的例⼦,不想动⼤脑了,直接引⽤过来如下。
这是⼀个对语⾳信号(0.3kHz~3.4kHz)进⾏低通滤波的C语⾔程序,低通滤波的截⽌频率为800Hz,滤波器采⽤19点的有限冲击响应FIR滤波。
语⾳信号的采样频率为8kHz,每个语⾳样值按16位整型数存放在insp.dat⽂件中。
例3.7 语⾳信号800Hz 19点FIR低通滤波C语⾔浮点程序复制代码代码如下:#include <stdio.h>const int length = 180 /*语⾳帧长为180点=22.5ms@8kHz采样*/void filter(int xin[ ],int xout[ ],int n,float h[ ]); /*滤波⼦程序说明*//*19点滤波器系数*/static float h[19]={0.01218354,-0.009012882,-0.02881839,-0.04743239,-0.04584568,-0.008692503,0.06446265,0.1544655,0.2289794,0.257883,0.2289794,0.1544655,0.06446265,-0.008692503,-0.04584568,-0.04743239,-0.02881839,-0.009012882,0.01218354};static int x1[length+20];/*低通滤波浮点⼦程序*/void filter(int xin[ ],int xout[ ],int n,float h[ ]){int i,j;float sum;for(i=0;i<length;i++) x1[n+i-1]=xin[i];for (i=0;i<length;i++){sum=0.0;for(j=0;j<n;j++) sum+=h[j]*x1[i-j+n-1];xout[i]=(int)sum;}for(i=0;i<(n-1);i++) x1[n-i-2]=xin[length-1-i];}/*主程序*/void main( ){FILE *fp1,*fp2;int frame,indata[length],outdata[length];fp1=fopen(insp.dat,"rb"); /*输⼊语⾳⽂件*/fp2=fopen(outsp.dat,"wb"); /*滤波后语⾳⽂件*/frame=0;while(feof(fp1)==0){frame++;printf("frame=%d/n",frame);for(i=0;i<length;i++) indata[i]=getw(fp1); /*取⼀帧语⾳数据*/filter(indata,outdata,19,h); /*调⽤低通滤波⼦程序*/for(i=0;i<length;i++) putw(outdata[i],fp2); /*将滤波后的样值写⼊⽂件*/}fcloseall( ); /*关闭⽂件*/return(0);}例3.8 语⾳信号800Hz 19点FIR低通滤波C语⾔定点程序复制代码代码如下:#include <stdio.h>const int length=180;void filter(int xin[ ],int xout[ ],int n,int h[ ]);static int h[19]={399,-296,-945,-1555,-1503,-285,2112,5061,7503,8450,7503,5061,2112,-285,-1503,-1555,-945,-296,399}; /*Q15*/static int x1[length+20];/*低通滤波定点⼦程序*/void filter(int xin[ ],int xout[ ],int n,int h[ ]){int i,j;long sum;for(i=0;i<length;i++) x1[n+i-1]=xin[i];for (i=0;i<length;i++){sum=0;for(j=0;j<n;j++) sum+=(long)h[j]*x1[i-j+n-1];xout[i]=sum>>15;}for(i=0;i<(n-1);i++) x1[n-i-2]=xin[length-i-1];}主程序与浮点的完全⼀样。
;/*=============================================================== =============*/;/* Copyright (C 2004 YINXING TECHNOLOGY CO., LTD */;/* All Rights Reserved. */;/* ----------------------------------------------------------------------------*/;/*=============================================================== =============*/;---------------------------------------------------------------;; USER Program Demo !; It Start At 0x1800,and interrupt vector don't changed,; At 200h !;; Please Don't modify PMST !;; Some data put in 080h DP=1; SP may use system stack,so user needn't setup SP !;;------------------------------------------------------------------.title "for test user program ... ".mmregs.global _c_int00.ref fs_start,errnoop1valh .set 4140h ;floating point number 12.0op1vall .set 0000hop2valh .set 4140h ;floating point number 12.0op2vall .set 0000hinitst0 .set 1800h ;set st0 initial numberinitst1 .set 2900h ;set st1 initial number.bss rlthm,1 ;result high mantissa,address is 80h .bss rltlm,1 ;result low mantissa,address is 81h.bss rltsign,1 ;ressult sigh,address is 82h.bss rltexp,1 ;result exponent,address is 83h.bss op1hm,1 ;op1 high mantissa,address is 84h.bss op1lm,1 ;op1 low mantissa,address is 85h.bss op1se,1 ;op1 sigh and exp,address is 86h.bss op2se,1 ;op2 sigh and exponent,address is 87h .bss op2hm,1 ;op2 high mantissa,address is 88h.bss op2lm,1 ;op2 low mantissa,address is 89h.bss op1_hsw,1 ;op1 packed high,address is 8ah .bss op1_lsw,1 ;op1 packed low,address is 8bh.bss op2_hsw,1 ;op2 packed high,address is 8ch .bss op2_lsw,1 ;op2 packed low,address is 8dh_c_int00:stm #initst0,st0stm #initst1,st1rsbx C16ld #op1lm,dpld #op1valh,a ;load float numberstl a,op1_hswld #op1vall,astl a,op1_lswld #op2valh,a ;load float numberstl a,op2_hswld #op2vall,astl a,op2_lswnopnopnop ;1st breakpoint in CCS!;----------- conversion of floating point format - unpack ------- dld op1_hsw,a ;load OP1 to acc asfta a,8sfta a,-8bc op1_zero,AEQ ;if op1 is 0,jump to special casesth a,-7,op1se ;store sign and exponent to stackstl a,op1lm ;store low mantissaand #07Fh,16,a ;mask off sign and exp to get high mantissa add #080h,16,a ;add implied 1 to mantissasth a,op1hm ;store mantissa to stackdld op2_hsw,a ;load OP2 to acc asfta a,8sfta a,-8bc op2_zero,AEQ ;if op2 is 0,jump to special casesth a,-7,op2se ;store sign and exponent to stackstl a,op2lm ;store low mantissaand #07Fh,16,a ;mask off sign and exp to get high mantissa add #080h,16,a ;add implied 1 to mantissasth a,op2hm ;store mantissa to stacknopnopnop ;2nd breakpoint in CCS !;---------- judge the sign----------------bitf op1se,#100h ;test the sign bitbc testop2,NTC ;if is not negative jump to testop2ld #0,a ;change the experssion todsub op1hm,adst a,op1hm ;store changed op1testop2:bitf op2se,#100h ;test the sign bitbc compexp,NTC ;if is not negative jump to compexpld #0,a ;change the expression todsub op2hm,adst a,op2hm ;store changed op2;--------- Exponent Comparison ------------compexp:ld op1se,aand #00ffh,a ;mask off the sign bitld op2se,band #00ffh,b ;mask off the sign bitsub a,b ;exp op2-exp op1 -> bbc op1_gt_op2,BLT ;process op1 > op2bc op2_gt_op1,BGT ;process op2 > op1a_eq_bdld op1hm,adadd op2hm,a ;add mantissabc res_zero,AEQ ;if result is zero process special caseld op1se,b ;load exponent in preparation for normalizing normalizesth a,rltsign ;Save signed mantissa on stackabs a ;Create magnitude value of mantissasftl a,6 ;Pre–normalize adjustment of mantissaexp a ;Get amount to adjust exp for normalizationnorm a ;Normalize the resultst t,rltexp ;Store exp adjustment valueadd #1,b ;Increment exp to account for implied carrysub rltexp,b ;Adjust exponent to account for normalization normalizedstl b,rltexp ;Save result exponent on stackbc underflow,BLEQ ;process underflow if occurssub #0ffh,b ;adjust to check for overflowbc overflow,BGEQ ;process overflow if occurssftl a,-7 ;Shift right to place mantissa for splittingstl a,rltlm ;Store low mantissaand #07f00h,8,a ;Eliminate implied onesth a,rlthm ;Save result mantissa on stack;----------- Conversion of Floating Point Format- Pack --------- ld rltsign,9,aand #100h,16,a ;Get the sign valueadd rltexp,16,a ;Add the result exponent togethersftl a,7 ;shift the value to right placedadd rlthm,a ;Add the result mantissa togetherreturn_valuenopnopnopnop ; 3th breakpoint in CCS !b fs_startop1_gt_op2abs b ;if exp OP1 >= exp OP2 + 24 then return OP1sub #24,bbc return_op1,BGEQadd #23,b ;restore exponent difference valuestl b,rltsign ;store exponent difference to be used as RPCdld op2hm,a ;load OP2 mantissarpt rltsign ;normalize OP2 to match OP1sfta a,-1bd normalize ;delayed branch to normalize resultld op1se,b ;load exponentvalue to prep for normalization dadd op1hm,a ;add OP1 to OP2op2_gt_op1sub #24,b ;if exp OP2 >= exp OP1 + 24 then return OP1 bc return_op2,BGEQadd #23,b ;Restore exponent difference valuestl b,rltsign ;Store exponent difference to be used as RPC dld op1hm,a ;Load OP1 mantissarpt rltsign ;Normalize OP1 to match OP2sfta a,-1bd normalize ;Delayed branch to normalize resultld op2se,b ;Load exponent value to prep for normalization dadd op2hm,a ;Add OP2 to OP1op1_zero:return_op2:bd return_valuedld op2_hsw,a ;Put OP2 as result into Aop2_zero:return_op1:dld op1hm,a ;Load signed high mantissa of OP1bc op1_pos,AGT ;If mantissa is negative .neg a ;Negate it to make it a positive valueaddm #100h,op1se ;Place the sign value back into op1_se op1_possub #80h,16,a ;Eliminate implied one from mantissald op1se,16,b ;Put OP1 back together in acc A as a result bd return_valuesftl b,7add b,aoverflowst #2,errno ;load error nold rltsign,16,a ;pack sign of result and #8000,16,aor #0ffffh,a ;result low mantissa bd return_valueadd #07f7fh,16,a ;result exponent underflowst #1,errno ;load error nob return_valueres_zerobd return_valuesub a,anop。
程序变量的Q值确定--定点DSP实现浮点运算时的定标问题2008-08-27 18:45在前面几节介绍的例子中,由于x,y,z的值都是已知的,因此从浮点变为定点时Q值很好确定。
在实际的DSP应用中,程序中参与运算的都是变量,那么如何确定浮点程序中变量的Q值呢?从前面的分析可以知道,确定变量的Q值实际上就是确定变量的动态范围,动态范围确定了,则Q值也就确定了。
设变量的绝对值的最大值为|max|,注意|max|必须小于或等于32767。
取一个整数n,使满足2n-1<|max|<2n则有2-Q=2-15*2n=2-(15-n)Q=15-n例如,某变量的值在-1至+1之间,即|max|<1,因此n=0,Q=15-n=15。
既然确定了变量的|max|就可以确定其Q值,那么变量的|max|又是如何确定的呢?一般来说,确定变量的|max|有两种方法。
一种是理论分析法,另一种是统计分析法。
1. 理论分析法有些变量的动态范围通过理论分析是可以确定的。
例如:(1)三角函数。
y=sin(x)或y=cos(x),由三角函数知识可知,|y|<=1。
(2)汉明窗。
y(n)=0.54一0.46cos[nπn/(N-1)],0<=n<=N-1。
因为-1<=cos[2πn/(N-1)]<=1,所以0.08<=y(n)<=1.0。
(3)FIR卷积。
y(n)=∑h(k)x(n-k),设∑|h(k)|=1.0,且x(n)是模拟信号12位量化值,即有|x(n)|<=2^11,则|y(n)|<=2^11。
(4)理论已经证明,在自相关线性预测编码(LPC)的程序设计中,反射系数ki满足下列不等式:|ki|<1.0,i=1,2,...,p,p为LPC的阶数。
2. 统计分析法对于理论上无法确定范围的变量,一般采用统计分析的方法来确定其动态范围。
所谓统计分析,就是用足够多的输入信号样值来确定程序中变量的动态范围,这里输入信号一方面要有一定的数量,另一方面必须尽可能地涉及各种情况。
Q格式有符号数的表示法,机器数(出现在电脑的二进位数值)有3个特点,无符号或符号转换成数值来表示,没有+10101这样的资料,而是以010101来表示,只表示单纯的整数或小数,小数点的位置预设在一定的位置而较少变动,它的长度受到电脑硬体的限制,而不能无限增长。
Q格式,就是将一个小数放大若干倍后,用整数来表示小数。
Q格式前提无符号数:当参与运算的数值没有负数且运算的结果也没有负数时,则所有字元都可以表示数值,这种没有符号的数,称为无符号数(如记忆体储存位址),有符号数:数值中有某位数值代表符号,通常最高位作为符号位,0代表正,1代表负。
真值:有符号数所代表的数值,例如:110所代表的值是-2 而非6,有符号数只要去除符号位就可以获得该数的大小,在运算时,它的符号位可参与运算。
但在加减运算时,必须将它分离出来,才能进行运算。
有时,还要确定哪个有符号数的真值比较大,才能确定结果的符号。
为了达到这些功能,电路的设计就相当复杂。
所以很多电脑系统不直接使用有符号数,而使用有符号数的1’s补数或2’s补数表示法作为编码系统正弦脉波宽度调变(SPWM)之控制方法经Q 格式乘法器转换成振幅与频率可变V/F 控制,当成其单相感应马达的输入信号,藉由控制责任周期的大小,以达到变电压相对改变频率的效果。
DSP1.实现数位系统的第一步在自然世界中,所有的物理量包括时间、电压、质量、位移等等,都是类比的、连续的。
可是在数位系统中,讯号是在不连续的时间点取样,物理量或讯号的大小也不再是连续,而是被量化(Quantized)。
在数位系统中,只能用有限字元长度的数字去表示数量的大小,而不能以无限精确的数值(实数)去表示。
为了实现数位系统;使用了定数数与浮点数的表示法。
a)定点数(Fixed Point Number):指一个数字的表示,其小数点是在固定的位置(位元)。
b)浮点数(Floating Point Number):使用假数以及指数两部分来表示数值。
DSP学习笔记(⼆)——DSP中浮点数与定点数格式与运算处理DSP学习笔记(⼆)——DSP中浮点数与定点数格式与处理1 DSP中的数据表述DSP中数据通常是有定点数与表⽰,其中可以对字长进⾏相关定义,可以选取字长为16位、24位、32位不同字长使⽤。
⽽格式与字长决定了数据的精度与动态范围,同时也⼀定程度上决定了DSP处理器的功耗、成本与编程难度。
定点数:⼩数点位置为确定的。
浮点数:⼩数点位置可以改变。
定点运算的硬件实现较为简单,功耗较⼩,主要注意的是数据的定标、溢出以及误差。
器减结构较为复杂,但是精度较⾼,⾼级语⾔容易⽀持。
2 定点数的格式与相关运算2.1 定点数格式定点数格式:Q n 格式,n为⼩数位数。
即Q15 ,⼩数点右边有15个⼩数位,如果我们定义了⼀个长度为32位的数字,那么⼩数位为15,1位符号位,16位为整数位。
整数⼩数点固定在最后,定点数⼩数位固定使⽤上⽂的Q n 格式表⽰,两者都使⽤⼆进制补码形式表⽰。
例: Q4格式:01010011b=1·22+1·20+1·2-3+1·2-4=83/24=5.1875对于负数(最⾼位MSB为1),要先把它转化为⽆符号⼆进制数,再进⾏计算,最后加上负号。
图2-1 ⼆进制Q格式表⽰定点数与浮点数转化时需要使⽤2n 的关系进⾏转化。
转化关系如下图:图2-2 定点数与浮点数转化关系浮点数转换为定点数时,由于⼩数点后的位数有限,会产⽣截断误差。
2.2 数值范围与精度Qn 格式,字长为N数值范围: -2N-12n~2N-1-12n精度:12n由于符号位占1位,所以数据位为N-1,n越⼤范围越⼩,但精度越⾼。
图2-3 数值范围与精度2.3 动态范围数据格式中最⼤值与最⼩值之⽐即为动态范围。
N位定点数动态范围:分贝表⽰:dsp⼤多采⽤16位定点数,动态范围为90.3db。
Dsp⼤多采⽤16为定点数,运算硬件实现较为简单,更⼤动态范围应⽤可以使⽤拓展字长⽅式。
dsp实验报告C54x的浮点数的算术运算(实验⼀)实验⽬的:1)了解TMS320C54x汇编语⾔程序的基本格式,以及汇编、链接的基本过程。
2)初步熟悉软件仿真器Simulator的⽤法。
实验内容:A.基础实验将两个⼩数相乘,分离尾数与指数,进⾏算术运算,最后归⼀化。
乘法运算时遵循指数相加尾数相乘的规则。
1)编写浮点乘法程序ex1.asm,完成X1*X2=0.3×(—0.8)运算。
2) 编写链接命令⽂件ex1.cmd。
B.提⾼实验:⽤汇编语⾔实现:y1=x1*a1-x2*a2y2=12/3+1y3=0.3*(-0.5)+1实验程序框图及清单:此次试验中,在⼀个程序⾥完成基础和提⾼部分,四个计算分别作为四个⼦程序。
具体程序及相关注释如下:.title "lab1.asm".mmregsSTACK .usect "STACK", 10H.bss x1,1 ;定点数操作数1.bss x2,1 ;定点数操作数2.bss e1,1 ;指数1.bss m1,1 ;尾数1.bss e2,1 ;指数2.bss m2,1 ;尾数2.bss ep,1 ;乘积的指数.bss mp,1 ;乘积的尾数.bss product,1 ;定点乘积.bss temp,1 ;暂存单元.bss a1,1.bss a2,1.bss b1,1.bss b2,1 ;提⾼实验y1=a1*b1-a2*b2.bss y1,1.bss c1,1 ;提⾼实验y2=12/3+1.bss c2,1.bss c3,1.bss y2,1.bss d1,1 ;提⾼实验y3=0.3*(-0.5)+1.bss d2,1.bss d3,1.bss y3,1.def start.datatable: .word 3*32768/10.word -8*32768/10.word 4*32768/10 ;.word 2*32768/10 ;提⾼实验y1=a1*b1-a2*b2数据.word 12,3,1 ;提⾼实验y2=12/3+1数据.word 3*32768/10.word -5*32768/10 ;提⾼实验y3=0.3*(-0.5)+1数据.word 1 .textstart: STM #0,SWWSRSTM #STACK+10H,SPMVPD table,@x1MVPD table+1,@x2LD @x1,16,A ;EXP AST T,@e1NORM ASTH A,@m1 ;将操作数x1转换成浮点数存⾄e1和m1中LD @x2,16,A ;EXP AST T,@e2NORM ASTH A,@m2 ;将操作数x2转换成浮点数存⾄e2和m2中CALL MULT ;调⽤浮点乘法⼦程序CALL LAB11 ;y1=x1*a1-x2*a2⼦程序CALL LAB12 ;y2=12/3+1⼦程序CALL LAB13 ;y3=0.3*(-0.5)+1⼦程序done: B doneMULT: SSBX FRCT ;设置⼩数相乘浮点乘法⼦程序SSBX SXM ;设置符号扩展LD @e1,A ;ADD @e2,A ;指数相加STL A,@ep ;LD @m1,T ;MPY @m2,A ;尾数相乘EXP A ;ST T,@temp ;NORM A ;将乘积浮点化STH A,@mp ;浮点乘积尾数存mp单元LD @temp,AADD @ep,ASTL A,@ep ;浮点乘积指数存ep单元NEG ASTL A,@tempLD @temp,TLD @mp,16,ANORM ASTH A,@productRETLAB11: STM #a1,AR1 y1=x1*a1-x2*a2⼦程序RPT #3MVPD table,*AR1+SSBX FRCTSSBX SXMLD @a1,TMPY @b1,ALD @a2,TMAS @b2,ASTH A,@y1RETLAB12: STM #c1,AR1 y2=12/3+1⼦程序RPT #2MVPD table+4,*AR1+RSBX FRCTRSBX SXMLD @c1,BRPT #15SUBC @c2,BADD @c3,BSTL B,@y2RETLAB13: STM #d1,AR1 y3=0.3*(-0.5)+1⼦程序RPT #2MVPD table+7,*AR1+SSBX FRCTSSBX SXMLD @d1,TMPY @d2,ALD A,-1,A ;q.15格式转换成q1.14格式ADD @d3,14,A ;与转换成q.14的1相加STH A,@y3 ;q1.14的结果存⼊y3RET.end实验中遇到的问题及解决⽅法主要是Dos命令的熟悉和语法错误的纠正运⾏结果:A.0x0148是基础部分的计算结果(q.15格式)换算回来是B.0x23d6是y1=x1*a1-x2*a2(0.3*0.4-(-0.8)*0.2)的结果0.28045654296875误差为0.28045654296875-0.28=0.00045654296875C.0x0005是y2=12/3+1的结果D.0x666是y3=0.3*(-0.5)+1的结果-0.150146484375误差为-0.150146484375-(-0.15)=-0.00014648375⼩结通过本次试验熟悉并掌握了部分dos命令以及dsp的⼤部分汇编指令,并能在dos调试环境下调程序,检查变量以验证结果正确与否。
在定点DSP上实现浮点运算
D5P结构可以分为定点型(FXP)和浮点型(FLP)。
虽然FXP型DSP只能实现整数运算,但是它运算速度快,占用资源少,比PLP型成本低。
而FXP型DsP使用FLP算法能够实现更高的精度和动态运算范围。
对FXPDSP结构支持下的FLP需求不断增长,这主要有以下原因:第一,实现算法代码通常用C/C++(采用浮点数形式)编写,将FLP算法转换成FXP格式是比较麻烦的。
而将浮点算法移植到DSP平台所花费的时间较少,因而FLP降低了研发成本。
另外,常用的算法得益于浮点运算提供的较大的运算范围。
最后,在某些情况下应用FXP算法无法获得期望的精度和动态范围。
DSP浮点处理器实验报告实验名称:DSP浮点处理器实验1姓名:班级:指导教师:完成时间:2012/05/23实验一实验系统的硬件连接以及中断控制LED一、实验系统的硬件连接1、设置仿真环境为Emulator模式;2、连接仿真器到PC和开发板;3、连接电源线,打开电源;4、进入CCS开发环境。
二、实验目的1、熟悉实验系统的硬件连接和使用方法。
2、熟悉Code Composer Studio (CCS3.3)集成开发环境及软硬件仿真方法。
3、掌握TMS320C6722的GPIO和定时中断的具体使用。
三、实验内容及原理1、使用定时中断的方式通过程序控制实验系统使LED按一定的频率闪烁。
2、TMS320C6722定时器每1/8192秒产生一次中断,每次中断时中断服务程序向计数变量加1,加满1024后程序将LED的亮灭状态改变一次。
最终实现LED以1Hz的频率闪烁(即每秒亮1次)。
四、实验要求基本要求:1、熟悉使用Code Composer Studio (CCS3.3)集成开发环境,能够进行程序的编辑、编译和硬件仿真,掌握软件的基本操作。
2、熟悉编写程序的基本结构和简单编写方法。
3、能够修改程序,使LED按照指定的频率闪烁。
扩展要求:1、修改实验参考程序,采用完全使用中断而不再在主程序循环中计数的方式控制LED闪烁,且保持闪烁频率不变。
2、继续修改程序,使LED闪烁频率为1Hz(每秒亮一次)。
五、实验系统的内部结构框图六、实验硬件连接示意图七、实验参考程序的流程图八、拓展要求程序改动思路1.拓展一:将main中的程序转到timer0中,应注意在转移main的内容前面加上一个标志如aa。
2.拓展二:由定时参数的计算公式,外部时钟频率X10/8/采样频率。
比较400h,可知将FS定义为808h同404h进行比较。
只要了解循环进行的频率和比照的频率就可以改变灯闪烁的频率。
将727h 改成8196即可。
3.总结TMS320VC33初始化内容步骤首先要对重要寄存器和总线初始化init: ldp 0,dpldi @STCK,spldi 1800h,st 状态指针寄存器ldi @MCTL,ar0ldi MBUS1,r0 主计数sti r0,*ar0MCTL .word 808064H ;;主总线控制寄存器地址单元STCK .word 809E00H ; ;堆栈寄存器地址单元MBUS1 .set 01038H ; ;0等待标志字.end定时中断初始化initt0: ldi 0,r0ldi 808h,ar0lsh 12,ar0addi 20h,ar0 ; ;指向808020单元即全局控制寄存器sti r0,*+ar0(4) ;;计数寄存器ldi FS,r0 ;sti r0,*+ar0(8) ;;周期寄存器ldi 3c1h,r0sti r0,*ar0 ;retsFS .set 727H ; ;FS的计算.data4.总结TMS320VC33定时器使用方法main:ldi @TNUM,ar0ldi *ar0,r0absi r0cmpi 400h,r0 ; ;比较判断是否循环blt mainldi 0,r0 ;;计数到则清零则进行翻转sti r0,*ar0ldi @LEDS,ar0 ; ;接着进行LED灯状态的翻转ldi *ar0,r0cmpi 0,r0ldieq 1,r0ldine 0,r0sti r0,*ar0ldi @LED,ar0sti r0,*ar0br main;------------------------------5.总结TMS320VC33中断的使用方法timer0: push st 发生中断回到此处复位回归push ar0push r0 先保存低32位pushf r0 再保存高32位ldi @TNUM,ar0 时钟中断,完成一次操作。
实验报告本
课程名称:DSP 实验二四则运算实验
指导老师:
班级:
姓名:
学号:
2011 ~2012 学年度第二学期广东石油化工学院计算机与电子信息学院
实验二四则运算实验
一实验目的
1.进一步熟悉CCS5000 2.0版本软件的使用;
2、掌握DSP汇编程序的编写;
3.熟悉和掌握软件初始化、断点设置、单步运行、MEMORY内容的查看、图表的使用、变量的查看以及快捷键的使用等。
二实验设备
计算机、CCS软件仿真平台
三实验内容
1、编写自定义的算术运算式子(需包括加法、减法、乘法等运算)的程序;
2、编写CMD汇编命令文件;
3、编译、连接、下载及运行程序;
4、熟悉CCS的操作
四、实验步骤
1.运行CCS软件。
2.编写程序,观察存储器的值,设置断点,单步执行,修改和观察寄存器的值。
3.运行客户软件DSP程序,观察变量的值,数组的值以及观察图形的显示等。
实现y1=a1+b1,y2=a2-B2,y3=a3*b3.
实验心得:
通过本次实验,大致了解了CCS软件的使用,及如何查看寄存器、数据等。
在实验过程中,如果出现了这个警告>> warning: entry point other than _c_int00 specified 这是因为用了_c_int00被定义为程序的入口地址,也是c启动程序的入口地址,如果在编译中使用了-c选项(如图),编译器就自动地把_c_int00作为程序的入口地址。
将-C删掉就可以了。
北京信息科技大学自动化学院实验报告课程名称 DSP控制技术实验名称简单的浮点运算实验仪器 PC机一台专业自动化班级/学号自控1105/2011010865 学生姓名黄洁艳实验日期实验地点教七楼102 成绩指导教师艾红实验一 CCS调试环境熟悉以及简单程序的软件调试一.实验目的1.了解 F28335 简单的浮点运算。
2.熟悉浮点运算的编程。
二.实验原理TMS320F28335是一款32 位浮点通用数字信号处理芯片,它具有存储空间大、运算精度高等特点。
三.实验要求1.设置 Code Composer Studio 3.3在硬件仿真方式下运行2.启动 Code Composer Studio 3.33.打开工程文件,打开源程序Example_2833xFPU.c阅读程序,理解程序内容。
4.编译、下载程序。
5.把 y1和 y2 添加到观察窗。
6.运行程序,观察 y1和 y2结果。
7. 修改 x1 和 x2 值,重新执行程序,观察 y1和 y2结果。
8.退出 CCS。
四. 实验程序如下:#include "DSP2833x_Device.h" // DSP2833x Headerfile Include File#include "DSP2833x_Examples.h" // DSP2833x Examples Include Filefloat y1, y2;float m1, m2;float x1, x2;float b1, b2;void main(void){ // Step 1. Initialize System Control:// PLL, WatchDog, enable Peripheral Clocks// This example function is found in the DSP2833x_SysCtrl.c file.InitSysCtrl();// Step 2. Initalize GPIO:// This example function is found in the DSP2833x_Gpio.c file and// illustrates how to set the GPIO to it's default state.// InitGpio(); // Skipped for this example// Step 3. Clear all interrupts and initialize PIE vector table:// Disable CPU interruptsDINT;// Initialize the PIE control registers to their default state.// The default state is all PIE interrupts disabled and flags// are cleared.// This function is found in the DSP2833x_PieCtrl.c file.InitPieCtrl();// Disable CPU interrupts and clear all CPU interrupt flags:IER = 0x0000;IFR = 0x0000;// Initialize the PIE vector table with pointers to the shell Interrupt // Service Routines (ISR).// This will populate the entire table, even if the interrupt// is not used in this example. This is useful for debug purposes.// The shell ISR routines are found in DSP2833x_DefaultIsr.c.// This function is found in DSP2833x_PieVect.c.InitPieVectTable();// Interrupts that are used in this example are re-mapped to// ISR functions found within this file.// Step 5. User specific code, enable interrupts:// Calculate two y=mx+b equations.y1 = 0;y2 = 0;m1 = 10;m2 = .6;x1 = 7;x2 = 7.3;b1 = 4.2;b2 = 8.9;y1 = m1/x1 + b1;y2 = m2*x2 + b2;ESTOP0; // This is a software breakpoint}五.实验结果分析程序设计实现了简单的浮点乘法和加法运算,y1和y2是实验结果。
定点DSP如何做浮点运算2008-10-16 08:46许多DSP芯片只支持整数运算,如果现在这些芯片上进行小数运算的话,定点小数运算应该是最佳选择了,此外即使芯片支持浮点数,定点小数运算也是最佳的速度选择。
在DSP 世界中,由于DSP芯片的限制,经常使用定点小数运算。
所谓定点小数,实际上就是用整数来进行小数运算。
下面先介绍定点小数的一些理论知识,然后以C 语言为例,介绍一下定点小数运算的方法。
在TI C5000 DSP系列中使用16比特为最小的储存单位,所以我们就用16比特的整数来进行定点小数运算。
先从整数开始,16比特的储存单位最多可以表示0x0000到0xffff,65536种状态,如果它表示C语言中的无符号整数的话,就是从0到 65535。
如果需要表示负数的话,那么最高位就是符号位,而剩下的15位可以表示32768种状态。
这里可以看出,对于计算机或者DSP芯片来说,符号并没有什么特殊的储存方式,其实是和数字一起储存的。
为了使得无论是无符号数还是符号数,都可以使用同样的加法减法规则,符号数中的负数用正数的补码表示。
我们都知道-1 + 1 =0,而0x0001表示1,那么-1用什么来表示才能使得-1 + 1 =0呢?答案很简单:0xffff。
现在就可以打开Windows的计算器,用16进制计算一下0xffff+0x0001,结果是0x10000。
那么 0x10000和0x0000等价麽,我们刚才说过用16比特来表达整数,最高位的1是第17位,这一位是溢出位,在运算寄存器中没有储存这一位,所以结果是低16位,也就是0x0000。
现在我们知道负数的表达方式了。
举个例子:-100。
首先我们需要知道100的16进制,用计算器转换一下,可以知道是0x0064,那么-100就是0x10000 - 0x0064,用计算器算一下得0xff9c。
还有一种简单的转换符号的方法,就是取反加一:把数x写成二进制格式,每位0变1,1变0,最后把结果加1就是-x了。
SH99F100 DSP浮点运算应用指南SH99F100 DSP 浮点运算应用指南1.基本数据格式DSP 的四则运算系统中,都是以fraction (16位)和exponent (16位)两部分形式进行数据传递的。
小数部分是1.15格式,指数部分是通常的定点数值,所以在DSP 的四则运算中,用两个寄存器传递的32位二进制数表示的十进制数值计算方法如下:设指数十进制表示为n ,小数十进制表示为a ,存储在处理器中的小数实际上同一般的16位定点数值没有区别,所以我们看到的a 值实际上是一个十进制整数,它所代表的小数为a ,那么由以上两部分表示的十进制数值为152−×152−×n a 2. 数据的规格化处理四则运算的输入输出数据都是规格化的数据,规格化是指小数部分的二进制表达式中跟在符号位后边的第一位非符号位值,这以目标数据是通过数据移位得到的,为保证数值大小不变,应该对指数做相应调整,移位n 位,则指数值减n,例如:对于小数0010000000000000,规格化操作后的数据为0100000000000000,同时在指数部分做减1操作,如果原来指数是1,现在则是0。
对于负值小数1110000000000000,规格化后的数据为1000000000000000,同时指数部分做减2操作,原指数为1,现在则为-1。
该操作的实现,是由指令EXP 和NORM 完成的。
具体应用将在数据格式转换部分详述。
3. 精度与表示范围根据第二部分指出的数据规格化,为保证数据规格化后不超出数据表示范围,在考量数据范围与精度时,直接以规格化后的数据为观察对象,各部分的数据范围表示如下:Hexadecimal Signed Integer指数 0x80~0x7F -128~127 小数(负)0x8000~0xbfff (正)0x4000~0x7fff-32768~ -16385 16384~ 32767数据范围 -2.9387358770557187699218413430556e-39~1.7013599116361069690405877321955e+38 (数据范围很大) (0是数据中的特殊值,规格化后指数为-15,小数部分为0)关于数据精度:根据实际数据的表达式,在常用的16位数据范围内,数据精度为(0.000000001)。
实验四 FIR 数字滤波器一、实验目的:1.学习数字滤波器的DSP 实现原理和C54X 编程技巧;2.通过CCS 的图形显示工具观察输入/输出信号波形以及频谱的变化。
二、实验原理:在数字信号处理中,滤波占有极其重要的作用。
数字滤波是谱分析、通信信号处理等应用中的基本处理算法,数字滤波是DSP 最基本的应用领域。
1. FIR 滤波器的基本原理数字滤波是将输入的信号序列,按规定的算法进行处理,从而得到所期望的输出序列。
一个线性位移不变系统的输出序列[]y n 和输入序列[]x n 之间的关系,应满足常系数线性差分方程。
FIR 滤波器的差分方程为:10()()N i i y n b x n i -==-∑FIR 滤波器的传递函数为: 10()()()N i i i Y z H z b z X z --===∑由上面的公式可知,FIR 滤波算法实际上是一种乘法累加运算。
它不断地从输入端读入样本值x [n ],经延时(1z -)后做乘法累加,输出滤波结果y [n ]。
2. FIR 滤波器的设计FIR 滤波器的设计方法主要有窗函数法和频率采样法,其中,窗函数法是最基本的方法。
具体设计方法可参见《数字信号处理》。
DSP 设计者可以利用功能强大的MATLAB 工具很方便的设计出逼近理想特性的FIR 滤波器,然后将此FIR 系数放入DSP 程序中。
3. FIR 滤波器的DSP 实现FIR 滤波器的输出表达式为011[][][1][1]n-y n b x n b x n b x n N =+-++-+式中,i b 为滤波器系数;[]x n 为滤波器在n 时刻的输入;[]y n 为n 时刻的输出。
可见,FIR 滤波器不断地对输入样本[]x n 进行n -1延时后,再进行乘法累加,最后输出滤波结果[]y n ,因此FIR 滤波器实际上是一种乘法累加运算。
在DSP 中FIR 是将待滤波的数据序列与滤波系数序列相乘后再相加,同时要模仿FIR 结构中的延迟线将数据在存储器中滑动。
实验四 小数运算一、实验目的1.掌握TMS320C54X 中小数的表示和处理方法;2.掌握用汇编语言编写DSP 程序的方法;3.熟悉CCS 软件进行软件仿真。
二、实验内容编写计算41i i i y a x==∑的程序。
其中数据均为小数:a 1=0.1 a 2=0.2 a 3=-0.3 a 4=0.2x 1=0.8 x 2=0.6 x 3=-0.4 x 4=-0.2三、实验说明许多D S P 芯片只支持整数运算,如果现在这些芯片上进行小数运算的话,定点小数运算应该是最佳选择了。
两个16位整数相乘,乘积总是“相左增长”的,这意味着多次相乘后乘积将会很快超出定点器件的数据范围。
而且要将32位乘积保存到数据存储器,就要开销2 个机器周期以及2个字的程序和R A M 单元。
并且由于乘法器都是16位相乘,因此很难在后续的递推运算中,将32位乘积作为乘法器的输入。
然而,小数相乘,乘积总是“相右增长”的,这就合得超出定点器件数据范围的部分是我们不太感兴趣的部分。
在小数乘法下,既可以存储32位乘积,也可以存储16位乘积,这就允许用较少的资源保存结果,也方便用于递推去处中。
T M S 320C 54X 用用2的补码表示小数,其最高位为符号位,数值范围为(-1-1)。
2的补码小数表示方法: 将十进制小数乘以32 768,并将整数乘积转换成16进制数。
正数:乘以32 768,整数转换成16进制数;负数:其绝对值乘以32 768,整数转换成16进制数后取反加1。
如0.5:乘以32768得16384,再转换成十六进制就得到4000H ,这就是0.5的补码形式。
如-0.5:绝对值乘以32768得16384,再转换成十六进制就得到C 000H ,这就是0.5的补码形式。
在汇编语言程序中,由于不能直接写入十进制小数,因此若要定义一个小数0.707,则应该写成32768*707/1000。
在进行小数乘法时,应事先设置状态寄存器S T 1中的F R C T 位(小数方式位)置1,这样在乘法器将结果传送至累加器时就能自动地左移1位,从而自动消除两个带符号数相乘时产生的冗余符号位。