《浮点运算转定点运算.docx》由会员分享,可在线阅读,更多相关《浮点运算转定点运算.docx(16页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、-:浮点与定点概述相关定义说明定点数:通俗的说,小数点固定的数。以人民币为例,我们日常常常说到的如123.45 , 789.34 等等,默认的状况下,小数点后面有两位小数,即角,分。假如小数点在最 高有效位的前面,则这样的数称为纯小数的定点数,如0.12345,0.78934等。假如小数 点在最低有效位的后面,则这样的数称为纯整数的定点数,如12345,78934等。浮点数:一般说来,小数点不固定的数。比较简洁的理解方式是,考虑以下我们日常 见到的科学记数法,拿我们上面的数字举例,如123.45 ,可以写成以下几种形式:12.345X1011.2345 xlO20.12345 xl03xi为了
2、表示一个数,小数点的位置可以变化,即小数点不固定。1.1 定点数与浮点数的对比为了简洁的把问题描述清晰,这里都是十进制数字举例,具体的分析,大家可以在后 面的文章中看到。在运算个过程中,需要把该运算转换成定点运算。想了 2天,都没有想出怎么可以保证a的精度,由于a可能很小,假如简洁的a=6;b=8;a=l14-b/c; 相当于a14 ,保证了 a的精度分子不能左移太多位,分母右移,解决问题了。发散思维说起来很简洁,做起来不简洁呀!5.举例及编程中的心得1举例第3章DSP芯片的定点运算.doc这篇文章中给了一个很简洁有能说明问题的例子, 不想动大脑了,直接引用过来如下。这是一个对语音信号(0.3
3、kHz3.4kHz)进行低通滤波的C语言程序,低通滤波的截止 频率为800Hz,滤波器采纳19点的有限冲击响应FIR滤波。语音信号的采样频率为8kHz , 每个语音样值按16位整型数存放在insp.dat文件中。例3.7语音信号800Hz 19点FIR低通滤波C语言浮点程序#include const int length = 180/*语音帧长为 180 点= 22.5ms8kHz 采样*/void filter(int xin Jnt xout jnt n,float h);/*滤波子程序说明*/*19点滤波器系数*/static float h19 =0.01218354,-0.0090
4、12882,-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 xllength+20;/*低通滤波浮点子程序*/void filter(int xin Jnt xout zint njloat h)(int i,j;float sum;fo
5、r(i=0;ilength;i + +) xln + i-l=xini;for (i=O;ilength;i+)(sum=0.0;for(j=0;jn;j + +) sum + = hj*xli-j + n-l;xouti=(int)sum;)for(i=0;i(n-l);i+) xln-i-2=xinlength-l-i;/*主程序*/void main()(FILE *fpL*fp2;int framejndatallengthjutdatatlength;fpl=fopen(insp.dat,rb);/* 输入语音文件*/fp2=fopen(outsp.dat,wb);/* 滤波后语音文
6、件*/frame=0;while(feof(fpl) =0)(frame+;p r i n tf ( f ra m e=%dnHzf ra m e);for(i=0;ilength;i+) indatai=getw(fpl);/*取一帧语音数据*/filter(indata,outdata,19,h);/* 调用低通滤波子程序*/for(i=0;ilength;i + +) putw(outdatai,fp2); /*将滤波后的样值写入文件*/)fcloseall();/*关闭文件*/return(O);)例3.8语音信号800Hz 19点FIR低通滤波C语言定点程序#include cons
7、t int length = 180;void filter(int xin Jnt xout Jnt njnt h);static int h19=399,-296,-945,-1555,-1503,-285,2112,5061,7503,8450,7503,5061,2112,-285,-1503,-1555,-945,-296,399;/*Q15*/static int xllength+20;/*低通滤波定点子程序*/void filter(int xin Jnt xout Jnt njnt h)(int ij;long sum;for(i=0;ilength;i4-+) xln +
8、i-l=xini;for (i=O;ilength;i+)(sum=0;for(j=0;j15;for(i=0;i 23) & Oxff);if (exponent 0)ival 二(ival exponent);假如小于0,则将结果取反if (*(int *)&fval) & 0x80000000)ival = -ival;好好琢磨琢磨吧,看明白了,就说明你基本明白了浮点数的存储格式,假如没有看明 白,接着看,知道明白为止。3 .定点数的加减乘除运算简洁的说,各种运算的原则就是先把待运算的数据放大肯定的倍数,在运算的过程中 使用的放大的数据,在最终需要输出结果的时候再调整回去。举个例来说,有
9、如下运算:/ coefsl = 0.023423; coefs2=0.2131float coefsl,coefs2;int result;result = 34* coefsl+72* coefs2;代码的意思是,该模块需要输出一个整型的结果,但计算的过程中有浮点的运算。假 如在定点的DSP中,这段代码是无法运行的。为了解决这个问题,我们可以这样处理:首先,把coefsl , coefs2等类似的浮点数 据扩大肯定的倍数(具体扩大多少倍,依据精度要求不同),我们暂且把小数点向右移动4 位,也就是扩大的倍数为:*10000 ,在最终的输出的时候在缩小相同的倍数。修改后的代 码大致如下:/ co
10、efsl = 234; coefs2= 2131int coefsl,coefs2;int result;result = 34* coefsl+72* coefs2;result I- 10000;当然,上面的例子为了大家好理解,写的可能不是太正确,不过基本的精髓应当是这 些了。具体的处理过程,大家可以在网上搜寻第3章DSP芯片的定点运算.doc:这篇 文章,写的很具体,这里不再罗嗦了。4 .定点数模拟浮点数运算及常见的策略信任大家到现在已经大致明白了浮点数转换成定点数运算的概貌。其实,原理讲起来 很简洁,真正应用到实际的项目中,可能会遇到各种各样的问题。具我的阅历,常见的策有如下几条:1)
11、除法转换为乘法或移位运算我们知道,不管硬件平台假如变换,除法运算所需要的时钟周期都远远多于乘法运算 和加减移位运算,尤其是在嵌入式应用中,效率显得尤为重要。以笔者的阅历,其实, 项目中的很大一部分除法运算是可以转换成乘法和移位运算,效率还是有很大提升空间的。2)查表计算有些运算表达式可能牵扯到许多头疼的数学公式,尤其是在嵌入式硬件平台上,消失 这种公式很是头疼,由于硬件相关的软件平台供应的功能很有限,有的就没有许多常见 的开方等数学公式。假如该类运算在项目中很少消失,而且其取值的个数也不多,那么就 可以考虑对各种状况加以分析,把各种可能的结果制作成一个静态的表格(可以理解成数 组),再加以简洁的条件推断语句就可以解决该类问题。3)级数绽开该问题的背景同上面的问题。对于一些数学公式,假如取值范围不好处理,就可以采 纳级数绽开的方式。4)分子分母同时变化对于一些除法运算,为了保证精度,假如分子的扩大范围不够大的话,可以考虑缩小 分母,也可以达到预期效果。具体的例子可以参考我的另一篇文章解决了个困扰了 2天 的问题,定点运算问题”。分母变小了,相当于左移了a=l-b/c;|b|pow(2,23)|c| = pow(2,26)|a|l