dsp浮点数运算程序(精)

合集下载

DSP中浮点转定点运算--举例及编程中的心得

DSP中浮点转定点运算--举例及编程中的心得

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];}主程序与浮点的完全⼀样。

FFT浮点的DSP实现精

FFT浮点的DSP实现精

1前言DSP结构可以分为定点和浮点型两种。

其中,定点型DSP可以实现整数、小数和特定的指数运算,它具有运算速度快、占用资源少、成本低等特点;灵活地使用定点型DSP进行浮点运算能够提高运算的效率。

目前对定点DSP结构支持下的浮点需求也在不断增长,主要原因是:实现算法的代码往往是采用C/C++编写,如果其中有标准型的浮点数据处理,又必须采用定点DSP器件,那么就需要将浮点算法转换成定点格式进行运算。

同时,定点DSP结构下的浮点运算有很强的可行性,因为C语言和汇编语言分别具有可移植性强和运算效率高的特点,因此在定点DSP中结合C语言和汇编语言的混合编程技术将大大提高编程的灵活度,以及运算速度。

大多数DSP的开发工具只是在C语言的基础上支持标准的浮点运算,而定点DSP硬件一般都是面向定点的运算,不支持标准的浮点运算,缺乏硬件的支持极大地限制了浮点的应用,因而标准的浮点运算在实际定点DSP应用中并不多见。

C5509是一款16位定点DSP。

在本文中,对C5509输入FTSK信号,用C语言和汇编语言混合编程的方式对输入浮点型的FTSK信号进行相关运算,并输出浮点运算结果。

这里叶变换(FFT是一种高效实现离散傅里叶变换(DFT的快速算法,是数字信号处理中最为重要的工具之一,它在声学,语音,电信和信号处理等领域有着广泛的应用。

2方案设计2.1方案的提出DSP (数字信号处理器与一般的微处理器相比有很大的区别,它所特有的系统结构、指令集合、数据流程方式为解决复杂的数字信号处理问题提供了便利本文选用TMS320C54X作为DSP处理芯片通过对其编程来实现FFT的浮点DSP 实现。

DSP应用系统设计的一般流程如下图所示:■<又热纯tff毎術杯实碣W汎砺九I,山ft也刖FF机来址詞试仃1*1能测试图2.1 DSP系统流程图2.2方案的论证旋转因子W N有如下的特性。

对称性:/2 k k N N N W W +=-周期性:kW W +=利用这些特性,既可以使DFT中有些项合并,减少了乘法积项,又可以将长序列的DFT分解成几个短序列的DFT。

关于dsp中程序定点数和浮点数转换问题(Q15格式)

关于dsp中程序定点数和浮点数转换问题(Q15格式)

关于dsp中程序定点数和浮点数转换问题(Q15格式)看ti的逆变器程序,看到采集后的ADBUF数据全部都是《5,这就搞不明白了,为什么要左移5呀?然后看到上面说是兼容Q15,在QQ群里也问了高手,说是用于DSP小数运算,于是在网上找了下Q15的定义,下面把Q15整理下。

许多DSP都是定点DSP,处理定点数据会相当快,但是处理浮点数据就会非常慢。

可以利用Q格式进行浮点数据到定点的转化,节约CPU时间。

实际应用中,浮点运算大都时候都是既有整数部分,也有小数部分的。

所以要选择一个适当的定标格式才能更好的处理运算。

Q格式表示为:Qm.n,表示数据用m比特表示整数部分,n比特表示小数部分,共需要m+n+1位来表示这个数据,多余的一位用作符合位。

假设小数点在n位的左边(从右向左数),从而确定小数的精度例如Q15表示小数部分有15位,一个short型数据,占2个字节,最高位是符号位,后面15位是小数位,就假设小数点在第15位左边,表示的范围是:-1<X<0.9999695 。

浮点数据转化为Q15,将数据乘以2^15;Q15数据转化为浮点数据,将数据除以2^15。

例如:假设数据存储空间为2个字节,0.333×2^15=10911=0x2A9F,0.333的所有运算就可以用0x2A9F 表示,同理10911×2^(-15)=0.332977294921875,可以看出浮点数据通过Q格式转化后是有误差的。

例:两个小数相乘,0.333*0.414=0.1378620.333*2^15=10911=0x2A9F,0.414*2^15=13565=0x34FDshort a = 0x2A9F;short b = 0x34FD;short c = a * b >> 15; //两个Q15格式的数据相乘后为Q30格式数据,因此为了得到Q15的数据结果需要右移15位这样c的结果是0x11A4=0001000110100100,这个数据同样是Q15格式的,它的小数点假设在第15位左边,即为0.001000110100100=0.1378173828125...和实际结果0.137862差距不大。

DSP编程技巧之22详解浮点运算的定点编程

DSP编程技巧之22详解浮点运算的定点编程

DSP编程技巧之22详解浮点运算的定点编程我们使用的处理器一般情况下,要么直接支持硬件的浮点运算,比如某些带有FPU的器件,要么就只支持定点运算,此时对浮点数的处理需要通过编译器来完成。

在支持硬件浮点处理的器件上,对浮点运算的编程最快捷的方法就是直接使用浮点类型,比如单精度的float来完成。

但是在很多情况下,限于成本、物料等因素,可供我们使用的只有一个定点处理器时,直接使用float类型进行浮点类型的运算会使得编译器产生大量的代码来完成一段看起来十分简单的浮点数学运算,造成的后果是程序的执行时间显著加长,且其占用的资源量也会成倍地增加,这就涉及到了如何在定点处理器上对浮点运算进行高效处理的问题。

本文引用地址:/article/263475.htm 既然是定点处理器,那么其对定点数,或者说字面意义上的“整数”进行处理的效率就会比它处理浮点类型的运算要高的多。

所以在定点处理器上,我们使用定点的整数来代表一个浮点数,并规定整数位数和小数位数,从而方便地对定点数和浮点数进行转换。

以一个32位的定点数为例,假设转换因子为Q,即32位中小数的位数为Q,整数位数则为31-Q(有符号数的情况),则定点数与浮点数的换算关系为:定点数=浮点数×2^Q例如,浮点数-2.0转换到Q为30的定点数时,结果为:定点数=-2×2^30=-2147483648 32位有符号数的表示范围是:-2147483648到2147483647。

如果我们把有符号定点数的最大值2147483647转换为Q为30对应的浮点数,则结果为:浮点数2147483647/2^30=1.999999999 从上面的两个计算例子中也可以看出,在Q30格式的情况下,最大的浮点数只能表示到1.999999999,如果我们想把浮点数2.0转换为Q30的定点数,则产生了溢出,即造成了1e-9的截断误差。

在此我们列出Q0到Q30对应的范围和分辨率如下表所示:如果你嫌自己计算麻烦的话,可以借助Matlab的命令来求取它们的转换,例如,在Matlab的命令窗口中输入:q = quantizer('fixed', 'ceil', 'saturate', [32 30]);FixedNum=bin2dec(num2bin(q,1.999999999)); 回车之后就可以看到1.999999999转成Q30之后的定点数了。

Q格式_dsp定点和浮点数学运算规则

Q格式_dsp定点和浮点数学运算规则

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中浮点数与定点数格式与运算处理

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 处理浮点数

定点 DSP 处理浮点数

定点DSP处理浮点数BG6RDFTMS320C5509A是16位定点数处理器,其累加器是32位/40位的。

在定点处理器中处理浮点数需要对定点数进行定标。

下面所说的定点数都是指有符号数。

通常采用的定标有Q15和Q31,分别表示小数点后有二进制15位和二进制16位。

因此16位Q15最大能表示的数是1 2 ,32位Q31最大能表示的数是1 2 。

定标不同的数可以直接相乘,例如Q13*Q15=Q28。

两个定标不同的数不能直接相加,比如Q13+Q15,通常要将Q15右移两位,转换为Q13后再相加,当然这样损失了两位的精度。

DSP进行的乘累加操作常常Q15的数,这样结果为Q30,存储在累加器中。

为了将累加器的结果转换为更为常用的Q31定标,55x系列DSP在状态寄存器ST1_55中设置了FRCT 控制位,FRCT=1时,乘积自动左移一位,这样乘积变成了Q31。

对于累加器中Q31定标的数,直接取累加器中高16位,就能获得结果的Q15定标数。

很多时候Q15不能解决问题,比如IIR滤波器num, den系数中通常有大于等于1的系数,超过了Q15的范围,只能用Q14,Q13等定标。

这时乘累加操作就需要进行修正了,比如IIR滤波器中系数用Qx定标,输入数据和输出数据用Qy定标,Q Q Q ,为获得Qy的输出数据必须将累加器中的乘积右移x位,另外在乘累加操作开始前必须将输入数据在累加器中左移y位,进行对齐后才能进行乘累加。

当然,这种修正都是在没有考虑FRCT 的情况下。

在C5500 DSPLIB中iircas51函数中,FRCT设置为1,输入输出数据采用Q15定标,如果系数也是Q15定标,则程序运行无误,如果系数采用Q14及以下定标则会产生严重的问题。

以下是其代码片段:MOV *AR0+ << #16, AC1 ; HI(AC1) = x(n)||RPTBLOCAL loop2‐1 ;inner loop: process a bi‐quadMPYM *AR1+, AC1, AC0 ; AC0 = b0*x(n)MACM *AR1+, *(AR3+T0), AC0 ; AC0 += b1*x(n‐1)MACM *AR1+, *AR3, AC0 ; AC0 += b2*x(n‐2)MOV HI(AC1), *AR3 ; x(n) replaces x(n‐2)||AADD T1, AR3 ; point to next x(n‐1)MASM *AR1+, *(AR4+T0), AC0 ; AC0 ‐= a0*y(n‐1)MASM *AR1+, *AR4, AC0 ; AC0 ‐= a1*y(n‐2)MOV rnd(HI(AC0)), *AR4 ; y(n) replaces y(n‐2)||AADD T1, AR4 ;point to next y(n‐1)MOV AC0, AC1 ;input to next biquad从代码片段可以看出,累加器AC0为Q31定标,输出数据是累加器高16位。

DSP-定点和浮点数格式解析

DSP-定点和浮点数格式解析

① 小数乘小数(n、m≠0,m≤ n) ② 整数乘小数(n≠0、m=0) ③ 整数乘整数(n=m=0)
① 小数乘小数(n、m≠0,m≤ n)
例:两个8位数相加,有溢出 进位位与最高位(MSB)不同 运算结果发生溢出,8位字长已不能正确地表示结果
10110000b( -80) + 10111111b( -65) 非饱和模式:101101111bቤተ መጻሕፍቲ ባይዱ-145)
00101001b( 41) + 01110011b(115) 非饱和模式:010011100b(156)
2)数值范围与精度
给定字长N,采用Qn格式表示小数
2 N 1 2 N 1 1 数值范围: n ~ 2 2n

度:
1
2n
16位字长Qn格式的数值范围与精度
Qn格式 Q15 数值范围 -1~0.999969482421875 精度 0.000030517578125
Q14
饱和模式:110000000b(-128)
饱和模式:001111111b(127)
溢出是由于字长有限,运算结果超出数值的表示范围引 起的
饱和模式
定点数减法运算的原理与加法运算相同
2)定点数的乘法运算
DSP处理器都有硬件乘法器和乘法指令,可实现单周期乘 法运算 二进制乘法运算包含一系列的移位和加法运算 定点数乘法运算不要求相乘数有相同的Qn格式 两个相乘数分别为Qn和Qm格式,字长为N,结果为 Q(n+m)格式,字长为2N 根据n和m的不同取值,定点数乘法运算可以分成三种情况
DSP 运算基础
• 1、 DSP的数据表示
• 2、定点数的格式与运算 • 3、浮点数的格式与运算

专题八之二-浮点数的格式以及定点DSP实现

专题八之二-浮点数的格式以及定点DSP实现
C5400的浮点数的算术 运算
4.6.4小节以及5.1.5小节
浮点数的表示方法
在定点运算中,小数点是在一个特定的 固定位置。在定点运算系统中,虽然在 硬件上实现简单,但是表示的操作数的 动态范围要受到限制。使用浮点数,可 以避免这个困难。 一个浮点数由尾数m、基数b和指数e三 部分组成。即:
m * be
;存储低位的尾数
and #07f00h,8,a ;将最开始中小数点前的“1”省略
sth a,rlthm
;存储高位的尾数
;----------- Conversion of Floating Point Format to Pack --------
ld rltsign,9,a ;将rltsign左移9位后acc A中
尾数运用上面的公式进行运算:
ld op5lm,t mpyu op6lm,a mpyu op6hm,b add a,-16,b ld op5hm,t mpyu op6lm,a add b,a mpyu op6hm,b stl b,rlthm add rlthm,16,a
;将OP5的低位尾数装入T寄存器 ;RS*YZ ;RS*0X ;B=(RS*YZ)+(RS*0X) ;将OP5的高位尾数装入T寄存器 ;A=0Q*YZ ;A=(RS*YZ)+(RS*0X)+(0Q*YZ) ;B=0Q*0X ;得到0Q*0X的低16bit ;A=最后的结果
exp a norm a st t,rltexp add #1,b sub rltexp,b
;将带符号的尾数高位存入rltsign单元中 ;去掉符号位的影响 ;进行归一化的预处理,将acc中的值 ;左移6位 ;对acc A中的值进行规一化操作
;存储规一化时左移的数值到rltexp中 ;考虑到进位位所以要给指数加上“1” ;完成指数的归一化工作

在定点DSP上实现浮点运算

在定点DSP上实现浮点运算

在定点DSP上实现浮点运算
D5P结构可以分为定点型(FXP)和浮点型(FLP)。

虽然FXP型DSP只能实现整数运算,但是它运算速度快,占用资源少,比PLP型成本低。

而FXP型DsP使用FLP算法能够实现更高的精度和动态运算范围。

对FXPDSP结构支持下的FLP需求不断增长,这主要有以下原因:第一,实现算法代码通常用C/C++(采用浮点数形式)编写,将FLP算法转换成FXP格式是比较麻烦的。

而将浮点算法移植到DSP平台所花费的时间较少,因而FLP降低了研发成本。

另外,常用的算法得益于浮点运算提供的较大的运算范围。

最后,在某些情况下应用FXP算法无法获得期望的精度和动态范围。

运用TMS320C54x汇编语言编写定点数运算、浮点数运算程.

运用TMS320C54x汇编语言编写定点数运算、浮点数运算程.

一、定点数的运算在定点 DSP 芯片中,采用定点数进行数值运算,其操作数一般采用整数来表示。

一个整数的最大表示范围取决于 DSP 芯片所给定的字长,一般为 16位或 24位。

显然,字长越长,所能表示的数的范围越大, 精度也越高。

在字长固定的前提下, 所需要达到的精度越高, 那么所能表示的浮点数的范围就会越小。

DSP 芯片的数以 2的补码形式表示。

每个 16位数用一个符号位来表示数的正负, 0表示数值为正, l 则表示数值为负。

其余 15位表示数值的大小。

如:二进制数 0010000000000011b=8195二进制数 1111111111111100b= -4为了使得无论是无符号数还是符号数, 都可以使用同样的加法减法规则, 符号数中的负数用正数的补码表示。

对 DSP 芯片而言,参与数值运算的数就是 16位的整数。

但在许多情况下,数学运算过程中的数不一定都是整数。

那么, DSP 芯片是如何处理小数的呢?这其中的关键就是数的定标, 由程序员来确定一个数的小数点处于 16位中的哪一位。

通过设定小数点在 16位数中的不同位置, 就可以表示不同大小和不同精度的小数了。

数的定标有 Q 表示法和 S 表示法两种。

定点数的加减法运算较为简单,只需遵循二进制数加减法运算规则相加减即可。

如:两个 8位数具有相同的 Qn 格式,保证隐含的小数点对齐。

下图中两个 8位数相加, 有溢出。

溢出是由于字长有限运算结果超出数值的表示范围引起的。

定点数的乘法运算DSP 处理器都有硬件乘法器和乘法指令,可实现单周期乘法运算,二进制乘法运算包含一系列的移位和加法运算。

定点数乘法运算不要求相乘数有相同的 Qn 格式。

两个相乘数分别为 Qn 和 Qm 格式,字长为 N ,结果为 Q(n+m格式,字长为2N 。

如:以下两个相乘数分别为 Q7和 Q6格式, 8位字长。

两个定点小数作乘法运算,结果左移一位,保存高位得到运算结果,结果为 Qm (m nm 格式。

DSP浮点运算

DSP浮点运算

(2)使用指令 ST
转 换 要 点
T,EXPONENT
将保存在 T 寄存器中的指数存放到数据存储 器的据存储器 ; e1所指定的单元中。
T,@e1
(3)使用指令NORM
A 。
按T寄存器中的内容对累加器A进行归一化处理。这里 的将定点数转换成浮点数所进行的归一化处理,指通过 左移或右移,使一个二进制数变为一个小数,且小数点 后的第一个数不为零,移动的位数用指数表示。
转 换 要 点
(1)先将定点数放在累加器A或B中, 然后用指令:EXP A 或EXP B。
这是一条提取指数的指令, 所提取的指数保存在 T寄存器中。如果累加器A=0,则0→T;否则,累 加器A的冗余符号位数减8→T。 累加器A中的内容 不变。
例 5-16 提取 A=FF FFFF FFCB 中的指数值。 执行指令: EXP A 执行前 执行后 A=FF FFFF FFCB A=FF FFFF FFCB T= 0000 T= 0019 (25) 本例中,由于 A≠0,需要先求出 A 的冗余符号位并减去 8。 A=F F F F F F F F C B 1111 1111 1111 1111 1111 1111 1111 1111 1100 1011 33 位冗余符号位 1, 33-8=25=0x0019 例 5-17 提取 B=07 8543 2105 中的指数值。 执行指令: EXP B 执行前 执行后 B=07 8543 2105 B=07 8543 2105 T= 0007 T= FFFC (-4) 本例中,由于 B≠0,需要先求出 B 的冗余符号位并减去 8。 A= 0 7 8 5 4 3 2 1 0 5 0000 0111 1000 0101 0100 0011 0010 0001 0000 0101 4 位冗余符号位 0, 4-8=-4=0xFFFC -4=-(0x0004)=(1111 1111 1111 1011+1)补=(0xFFFC) 补

DSP实验报告_百度文库(精)

DSP实验报告_百度文库(精)

实验0 实验设备安装才CCS调试环境实验目的:按照实验讲义操作步骤,打开CCS软件,熟悉软件工作环境,了解整个工作环境内容,有助于提高以后实验的操作性和正确性。

实验步骤:以演示实验一为例:1.使用配送的并口电缆线连接好计算机并口与实验箱并口,打开实验箱电源;2.启动CCS,点击主菜单“Project->Open”在目录“C5000QuickStart\sinewave\”下打开工程文件sinewave.pjt,然后点击主菜单“Project->Build”编译,然后点击主菜单“File->Load Program”装载debug目录下的程序sinewave.out;3.打开源文件exer3.asm,在注释行“set breakpoint in CCS !!!”语句的NOP处单击右键弹出菜单,选择“Toggle breakpoint”加入红色的断点,如下图所示;4.点击主菜单“View->Graph->Time/Frequency…”,屏幕会出现图形窗口设置对话框5.双击Start Address,将其改为y0;双击Acquisition Buffer Size,将其改为1;DSP Data Type设置成16-bit signed integer,如下图所示;6.点击主菜单“Windows->Tile Horizontally”,排列好窗口,便于观察7.点击主菜单“Debug->Animate”或按F12键动画运行程序,即可观察到实验结果:心得体会:通过对演示实验的练习,让自己更进一步对CCS软件的运行环境、编译过程、装载过程、属性设置、动画演示、实验结果的观察有一个醒目的了解和熟悉的操作方法。

熟悉了DSP实验箱基本模块。

让我对DSP课程产生了浓厚的学习兴趣,课程学习和实验操作结合为一体的学习体系,使我更好的领悟到DSP课程的实用性和趣味性。

实验二基本算数运算2.1 实验目的和要求加、减、乘、除是数字信号处理中最基本的算术运算。

DSP-定点和浮点数格式

DSP-定点和浮点数格式
0.0078125 0.015625 0.03125
0.0625 0.125 0.25
0.5 1
3)动态范围
动态范围:数据表示格式中可以表示的最大值与最小值之比
N位定点数的动态范围:
DR

fix
(2N
1
1
1) / 2n
/
2n
2N 1 1
用分贝表示为:
DRfix=20 log10 2N1 1 6.02(N 1) dB
00001000b - 00000110b 商数:00001101 余数:00000010b
⑥ ⑦
00000100b - 00000110b 余数(丢弃):11111110b 商数:00011010 余数:00000100b
00001000b - 00000110b 商数: 00110101 余数:00000010b
① 小数乘小数(n、m≠0,m≤ n)
例:两个相乘数分别为Q7和Q6格式,8位字长
两个定点小数作乘法运算,结果左移一位,保存高位得到 运算结果,结果为Qm(m≤ n)格式
0.1000000b(0.5 Q7 )
01.100000b(1.5 Q6 )
000.1100000000000b(0.75 Q13)
对于负数(最高位MSB为1),要先把它转化为无符号二进制数,再进 行计算,最后加上负号

7 MSB
6
5
4
3
2
1
0 LSB
二进制补码 0
1
0
1
0
0
1
1
Q0
符号 26
252423源自222120
Q4
符号 22
21
20

定点DSP如何做浮点运算

定点DSP如何做浮点运算

定点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了。

浮点数的加减乘除运算步骤

浮点数的加减乘除运算步骤

1、浮点加减法的运算步骤设两个浮点数X=Mx※2Ex Y=My※2Ey实现X±Y要用如下5步完成:①对阶操作:小阶向大阶看齐②进行尾数加减运算③规格化处理:尾数进行运算的结果必须变成规格化的浮点数,对于双符号位的补码尾数来说,就必须是001×××…×× 或110×××…××的形式, 若不符合上述形式要进行左规或右规处理。

④舍入操作:在执行对阶或右规操作时常用“0”舍“1”入法将右移出去的尾数数值进行舍入,以确保精度。

⑤判结果的正确性:即阶码是否溢出若阶码下溢(移码表示是00…0),要置结果为机器0;若阶码上溢(超过了阶码表示的最大值)置溢出标志。

例题:假定X=0 .0110011*211,Y=0.1101101*2-10(此处的数均为二进制)?? 计算X+Y;解:[X]浮:0 1010 1100110[Y]浮:0 0110 1101101符号位阶码尾数第一步:求阶差:│ΔE│=|1010-0110|=0100第二步:对阶:Y的阶码小,Y的尾数右移4位[Y]浮变为0 1010 0000110 1101暂时保存第三步:尾数相加,采用双符号位的补码运算00 1100110+00 000011000 1101100第四步:规格化:满足规格化要求第五步:舍入处理,采用0舍1入法处理故最终运算结果的浮点数格式为:0 1010 1101101,即X+Y=+0. 1101101*2102、浮点乘除法的运算步骤①阶码运算:阶码求和(乘法)或阶码求差(除法)即[Ex+Ey]移= [Ex]移+ [Ey]补[Ex-Ey]移= [Ex]移+ [-Ey]补②浮点数的尾数处理:浮点数中尾数乘除法运算结果要进行舍入处理例题:X=0 .0110011*211,Y=0.1101101*2-10求X※Y解:[X]浮:0 1 010 *******[Y]浮:0 0 110 1101101第一步:阶码相加※※2+000。

SH99F100DSP浮点运算应用指南

SH99F100DSP浮点运算应用指南

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)。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

;/*=============================================================== =============*/;/* 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。

相关文档
最新文档