浮点转定点方法总结
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];}主程序与浮点的完全⼀样。
浮点转定点方法总结

浮点转定点方法总结CII Technologies, Inc. 浮点转定点方法总结浮点转定点方法总结—孔德琦1CII Technologies, Inc. 目录目录定点运算方法...................................................................... ............................................................. 3 1.1 数的定标 ..................................................................... (3)1.2 C语言:从浮点到定点 ..................................................................... . (4)1.2.1 加法...................................................................... .. (4)1.2.2乘法...................................................................... (6)1.2.3除法...................................................................... (7)1.2.4 三角函数运算 ..................................................................... .. (8)1.2.5 开方运算 ..................................................................... .................................................... 9 1.3 附录 ..................................................................... .. (10)1.3.1 附录1:定点函数库 ..................................................................... . (10)1.3.2附录2:正弦和余弦表 ..................................................................... . (19)2CII Technologies, Inc. 浮点转定点方法总结定点运算方法1.1 数的定标对某些处理器而言,参与数值运算的数就是16位的整型数。
浮点转定点方法总结

浮点转定点方法总结—孔德琦目录定点运算方法................................................ 错误!未定义书签。
数的定标 ............................................... 错误!未定义书签。
C语言:从浮点到定点 ................................. 错误!未定义书签。
加法.................................................... 错误!未定义书签。
乘法..................................................... 错误!未定义书签。
除法..................................................... 错误!未定义书签。
三角函数运算............................................ 错误!未定义书签。
开方运算................................................ 错误!未定义书签。
附录...................................................... 错误!未定义书签。
附录1:定点函数库...................................... 错误!未定义书签。
附录2:正弦和余弦表..................................... 错误!未定义书签。
定点运算方法数的定标对某些处理器而言,参与数值运算的数就是16位的整型数。
但在许多情况下,数学运算过程中的数不一定都是整数。
那么,如何处理小数的呢?应该说,处理器本身无能为力。
那么是不是就不能处理各种小数呢?当然不是。
这其中的关键就是由程序员来确定一个数的小数点处于16位中的哪一位。
浮点运算转定点运算

浮点运算转定点运算与afreez⼀起学习DSP中浮点转定点运算⼀:浮点与定点概述1.1相关定义说明定点数:通俗的说,⼩数点固定的数。
以⼈民币为例,我们⽇常经常说到的如123.45¥,789.34¥等等,默认的情况下,⼩数点后⾯有两位⼩数,即⾓,分。
如果⼩数点在最⾼有效位的前⾯,则这样的数称为纯⼩数的定点数,如0.12345,0.78934等。
如果⼩数点在最低有效位的后⾯,则这样的数称为纯整数的定点数,如12345,78934等。
浮点数:⼀般说来,⼩数点不固定的数。
⽐较容易的理解⽅式是,考虑以下我们⽇常见到的科学记数法,拿我们上⾯的数字举例,如123.45,可以写成以下⼏种形式:12.345x1011.2345 x1020.12345 x103xi……为了表⽰⼀个数,⼩数点的位置可以变化,即⼩数点不固定。
1.2定点数与浮点数的对⽐为了简单的把问题描述清楚,这⾥都是⼗进制数字举例,详细的分析,⼤家可以在后⾯的⽂章中看到。
(1)表⽰的精度与范围不同例如,我们⽤4个⼗进制数来表达⼀个数字。
对于定点数(这⾥以定点整数为例),我们表⽰区间[0000,9999]中的任何⼀个数字,但是如果我们要想表⽰类似1234.3的数值就⽆能为⼒了,因为此时的表⽰精度为1/100=1;如果采⽤浮点数来表⽰(以归整的科学记数法,即⼩数点前有⼀位有效位,为例),则可以表⽰[0.000,9.999]之间的任何⼀个数字,表⽰的精度为1/103=0.001,精度⽐上⼀种⽅式提⾼了很多,但是表⽰的范围却⼩了很多。
也就是说,⼀般的,定点数表⽰的精度较低,但表⽰的数值范围较⼤;⽽浮点数恰恰相反。
(2)计算机中运算的效率不同⼀般说来,定点数的运算在计算机中实现起来⽐较简单,效率较⾼;⽽浮点数的运算在计算机中实现起来⽐较复杂,效率相对较低。
(3)硬件依赖性⼀般说来,只要有硬件提供运算部件,就会提供定点数运算的⽀持(不知道说的确切否,没有听说过不⽀持定点数运算的硬件),但不⼀定⽀持浮点数运算,如有的很多嵌⼊式开发板就不提供浮点运算的⽀持。
模型代码生成时浮点到定点的转换转

模型代码生成时浮点到定点的转换转浮点转换为定点是嵌入式软件开发中的一个重要步骤,这项工作非常繁琐,需要大量人力并且容易产生错误。
用浮点数学设计的算法表示理想的算法行为,经常必须转换为定点数学,才能用于更加经济的、只支持整数的大规模生产的硬件。
转换后,位精确的定点仿真使您在将该设计嵌入到硬件之前就能够研究定点数据类型的行为。
本文使用具有容错能力的燃料系统模型作为示例,描述了将浮点模型定点化并生成产品级代码的工具和工作流程。
涵盖的主题包括:*准备模型和数据*分析、改进以及优化定点定标*生成优化代码此处描述的方法采用Simulink Fixed Point中的两种工具:Fixed-Point Advisor和Fixed-Point Tool。
准备模型和数据进行转换容错燃料系统模型包含三个主要组件:ECU控制器、发动机气动力学设备以及几个传感器。
在本文中,我们着重讲述ECU控制器。
Fixed-Point Advisor是一个交互式工具,旨在加速模型准备过程图1:通过Fixed-Point Advisor准备模型。
使用Fixed-Point Advisor,我们可完成下列步骤(在下面会详细讨论):*替换不支持的模块。
*设置信号记录并创建初始参考数据。
*指定目标硬件特性。
*准备数据类型和定标。
*执行初始数据类型和定标。
*检查模型对于产品级代码部署的适宜性。
替换不支持的模块Fixed Point Advisor会检查模型里是否有不支持定点数据类型的模块。
连续的模块将被离散的模块替换。
Simulink模块支持的数据类型列表表明大多数模块支持定点数据类型。
与成百个嵌入式MATLAB函数(包括嵌入式算法设计中通常使用的函数)一样,Stateflow完全支持定点数据类型。
设置信号记录并创建初始参考数据在仿真过程中,会记录诸如输入和输出信号等感兴趣的信号,以用于与浮点模型的等值比较以及代码生成。
我们可以记录所有信号,或者从模型子系统层级中选择信号,包括未命名的信号。
定点数和浮点数课件

符号位
表示浮点数的正负,0表示正数,1 表示负数。
指数位
表示浮点数的指数部分,即小数点的 位置。
尾数位
表示浮点数的尾数部分,即小数点后 面的数字。
浮点数的范围和精度
范围
浮点数的范围取决于指数位的位 数和尾数位的位数,一般分为单 精度和双精度两种类型,单精度 范围较小,双精度范围较大。
精度
浮点数的精度取决于尾数位的位 数,位数越多,精度越高,能够 表示的数字越精确。
浮点数定义
浮点数是指小数点位置可以浮动的数 值表示方式,通常用于计算机内部运 算,其小数点位置可以根据需要移动。
浮点数的优点
浮点数的缺点
浮点数表示方式相对复杂,计算机内 部计算浮点数需要更多的时间和空间 资源,同时浮点数容易受到计算机内 部精度限制的影响。
浮点数表示方式的范围广泛,可以表 示非常大或非常小的数值,同时浮点 数精度高,能够准确表示小数。
具体实现可能会有所不同。
在定点数运算中,需要注意溢出、 舍入误差等问题。
一般来说,定点数运算的速度比 浮点数运算要快,因此在需要高 精度计算的情况下,定点数是一
种更好的选择。
2023
PART 03
浮点数的表示方法
REPORTING
浮点数的表示格式
IEEE 754标准
浮点数在计算机中采用IEEE 754标准 进行表示,包括符号位、指数位和尾 数位三个部分。
浮点数的运算规则
01
加减运算
浮点数的加减运算与普通加减运算类似,只需要对尾数位进行加减即可,
指数位不变。
02
乘除运算
浮点数的乘除运算需要将尾数位和指数位分开计算,然后组合得到结果。
乘法时尾数位需要左移一位,除法时尾数位需要右移一位。
matlab 定点数 浮点数 转换

matlab 定点数浮点数转换
Matlab中,定点数和浮点数的表示方式不同,需要进行相应的转换。
定点数是以固定的位数来表示数值,而浮点数则是根据 IEEE 754 标准来表示,可以表示更广泛的数值范围和精度。
定点数转换为浮点数,可以使用 fi 对象的 double 方法,将定点数转换为双精度浮点数。
例如:
a = fi(3, 1, 8); % 定点数,1 位整数,8 位小数
b = double(a); % 转换为双精度浮点数
浮点数转换为定点数,则需要先确定定点数的位数和精度,然后使用 fi 对象进行转换。
例如:
a = 3.14; % 浮点数
b = fi(a, 1, 8); % 转换为定点数,1 位整数,8 位小数
需要注意的是,在进行定点数和浮点数转换时,可能会存在精度损失的问题。
因此,在实际应用中,需要根据具体情况进行精度控制和误差分析。
- 1 -。
定点数与浮点数转

定点数与浮点数转小数点的表示为了节省内存,计算机中数值型数据的小数点的位置是隐含的,且小数点的位置既可以是固定的,也可以是变化的。
定点数与浮点数如果小数点的位置事先已有约定,不再改变,此类数称为"定点数"。
相比之下,如果小数点的位置可变,则称为"浮点数"。
⑴定点数。
常用的定点数有两种表示形式:如果小数点位置约定在最低数值位的后面,则该数只能是定点整数;如果小数点位置约定在最高数值位的前面,则该数只能是定点小数。
例如,假定用两个字节存放一个定点数,则以定点方式表示的十进制整数195为:这里,(-0.6876)10=(-0.10110000000001101…)2,转换为无限循环小数,存储时多余的位被截断。
如果知道一个定点数的小数点位置约定和占用存储空间大小,那么很容易确定其表示数的范围。
⑵浮点数。
浮点数表示法来源于数学中的指数表示形式,如193可以表示为0.193x103或1.93x102等。
一般地,数的指数形式可记作:N=M xRC其中,M称为"尾数",C称为"阶码"。
在存储时,一个浮点数所占用的存储空间被划分为两部分,分别存放尾数和阶码。
尾数部分通常使用定点小数方式,阶码则采用定点整数方式。
尾数的长度影响该数的精度,而阶码则决定该数的表示范围。
同样大小的空间中,可以存放远比定点数取值范围大得多的浮点数,但浮点数的运算规则比定点数更复杂。
1.什么是浮点数在计算机系统的发展过程中,曾经提出过多种方法表达实数。
典型的比如相对于浮点数的定点数(Fixed Point Number)。
在这种表达方式中,小数点固定的位于实数所有数字中间的某个位置。
货币的表达就可以使用这种方式,比如99.00或者00.99可以用于表达具有四位精度(Precision),小数点后有两位的货币值。
由于小数点位置固定,所以可以直接用四位数值来表达相应的数值。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
CII Technologies, Inc. 浮点转定点方法总结浮点转定点方法总结—孔德琦CII Technologies, Inc. 目录目录定点运算方法 (3)1.1数的定标 (3)1.2 C语言:从浮点到定点 (4)1.2.1 加法 (4)1.2.2乘法 (6)1.2.3除法 (7)1.2.4 三角函数运算 (8)1.2.5 开方运算 (9)1.3附录 (10)1.3.1 附录1:定点函数库 (10)1.3.2附录2:正弦和余弦表 (19)定点运算方法1.1 数的定标对某些处理器而言,参与数值运算的数就是16位的整型数。
但在许多情况下,数学运算过程中的数不一定都是整数。
那么,如何处理小数的呢?应该说,处理器本身无能为力。
那么是不是就不能处理各种小数呢?当然不是。
这其中的关键就是由程序员来确定一个数的小数点处于16位中的哪一位。
这就是数的定标。
通过设定小数点在16位数中的不同位置,就可以表示不同大小和不同精度的小数了。
数的定标用Q表示法。
表1.1列出了一个16位数的16种Q表示能表示的十进制数值范围和近似的精度。
Q表示精度(近似) 十进制数表示范围Q15 0.00002 -1≤X≤0.9999695Q14 0.00005 -2≤X≤1.9999390Q13 0.0001 -4≤X≤3.9998779Q12 0.0002 -8≤X≤7.9997559Q11 0.0005 -16≤X≤15.9995117Q10 0.001 -32≤X≤31.9990234Q9 0.002 -64≤X≤63.9980469Q8 0.005 -128≤X≤127.9960938Q7 0.01 -256≤X≤255.9921875Q6 0.02 -512≤X≤511.9804375Q5 0.04 -1024≤X≤1023.96875Q4 0.08 -2048≤X≤2047.9375Q3 0.1 -4096≤X≤4095.875Q2 0.25 -8192≤X≤8191.75Q1 0.5 -16384≤X≤16383.5Q0 1 -32768≤X≤32767表1.1 Q表示、S表示及数值范围从表1.1可以看出,同样一个16位数,若小数点设定的位置不同,它所表示的数也就不同。
例如:16进制数2000H=8192,用Q0表示16进制数2000H=0.25,用Q15表示从表1.1还可以看出,不同的Q所表示的数不仅范围不同,而且精度也不相同。
Q越大,数值范围越小,但精度越高;相反,Q越小,数值范围越大,但精度就越低。
例如,Q0的数值范围是-32768到+32767,其精度为1,而Q15的数值范围为-1到0.9999695,精度为1/32768 = 0.00003051。
因此,对定点数而言,数值范围与精度是一对矛盾,一个变量要想能够表示比较大的数值范围,必须以牺牲精度为代价;而想提高精度,则数的表示范围就相应地减小。
在实际的定点算法中,为了达到最佳的性能,必须充分考虑到这一点。
浮点数与定点数的转换关系可表示为:浮点数(x)转换为定点数(x q ):Qq x 2x (int)*=定点数(q x )转换为浮点数(x):Qq x -*=2)float (x例如,浮点数 x=0.5,定标 Q =15,则定点数q x =⎣⎦16384327685.0=⨯,式中⎣⎦表示下取整。
反之,一个用 Q =15 表示的定点数16384,其浮点数为16384×2-15=16384/32768=0.5。
1.2 c 语言:从浮点到定点下面所描述的几种基本运算是浮点到定点转换中经常遇到的,从中可以体会到一些基本的技巧和方法。
1.2.1 加法设浮点加法运算的表达式为:float x,y,z;z=x+y;将浮点加法/减法转化为定点加法/减法时最重要的一点就是必须保证两个操作数的定标值一样。
若两者不一样,则在做加法/减法运算前先进行小数点的调整。
为保证运算精度,需使Q 值小的数调整为与另一个数的Q 值一样大。
此外,在做加法/减法运算时,必须注意结果可能会超过16位表示,即数的动态范围。
如果加法/减法的结果超出16位的表示范围,则必须保留32位结果,以保证运算的精度。
1. 结果不超过16位表示范围设x 的Q 值为Qx ,y 的Q 值为Qy ,且Qx>Qy ,加法/减法结果z 的定标值为Qz ,则z =x+y ⇒yxzQ q Q q Q q y x z ---⋅+⋅=⋅222=xy x xQ Q Q q Q q y x ---⋅⋅+⋅222)(=xy x Q Q Q q q y x --⋅⋅+2]2[)( ⇒)()(2]2[x z y x Q Q Q Q q q q y x z --⋅⋅+=一般情况,我们取x,y 和z 的定标值相同,即Qx = Qy = Qz = Qa 。
所以定点加法可以描述为:short x, y , z ; //Qaz = add (x,y); //Qa函数add ( ) 有防饱和机制,如果可以确信x + y 不会溢出(-2^15 <= z < = 2^15-1),可以直接写为z = x + y .定点减法:short x, y, z ; //Qaz = sub (x,y);//Qa函数sub ( ) 有防饱和机制,如果可以确信x - y 不会溢出(-2^15 <= z < = 2^15-1),可以直接写为z = x - y .2.结果超过16位表示范围设x的Q值为Qx,y的Q值为Qy,且Qx>Qy,加法结果z的定标值为Qz,则定点加法为:int x,y;long temp,z;temp=y<<(Qx-Qy);temp=x+temp;z=temp>>(Qx-Qz),若Qx≥Qzz=temp<<(Qz-Qx),若Qx≤Qz一般情况,我们取x,y和z的定标值相同,即Qx = Qy = Qz = Qa 。
所以定点加法可以描述为:int x, y, z ; //Qaz = L_add (x,y);//Qa函数L_add ( ) 有防饱和机制,如果可以确信x + y 不会溢出(-2^31 <= z < = 2^31-1),可以直接写为z = x + y .定点减法:int x, y, z ; //Qaz = L_sub (x,y);//Qa函数L_sub ( ) 有防饱和机制,如果可以确信x - y 不会溢出(-2^31 <= z < = 2^31-1),可以直接写为z = x - y .3.结果超过32位表示范围这种情况下位数超出了标准c语言的数的表示范围,只能用数组来保存变量。
定点加法可以描述为:#define NN_DIGIT unsigned intNN_DIGIT x [digits], y [digits], z [digits] ;//QaNN_Add (z, x, y, digits) ; //Qa定点减法:NN_DIGIT x [digits], y [digits], z [digits] ; //Qa NN_Sub (z, x, y, digits) ; Qa应注意的是以上32位定点加减法都是无符号数操作。
1.2.2乘法1. 16位乘法设浮点乘法运算的表达式为:float x,y,z; z = xy;假设经过统计后x 的定标值为Qx ,y 的定标值为Qy ,乘积z 的定标值为Qz ,则z = xy ⇒zQ q z -⋅2=)(2y x Q Q q q y x +-⋅⋅ ⇒q z =)(2)(y x z Q Q Q q q y x +-所以定点表示的乘法为:short x; //Qx short y; //Qy int z ; //Qzz = L_mult(x, y) >> (Qx+Qy+1-Qz);上式中x 乘y 的定标本来应该是Qx + Qy, 但为了处理方便,函数L_mult( ) 多乘了一次2,因此要再加1。
函数L_mult ( ) 有防饱和机制,如果可以确信z = x y 不会溢出(-2^31 <= z < = 2^31-1),可以直接写为z = (xy) >>(Qx+Qy -Qz)。
2. 结果超过32位表示范围这种情况下位数超出了标准c 语言的数的表示范围,只能用数组来保存变量。
定点乘法可表示为: #define NN_DIGIT unsigned int NN_DIGIT x [digits]; NN_DIGIT y [digits];NN_DIGIT z [2* digits];NN_Mult (z, x, y , digits);应注意的是以上32位乘法都是无符号数操作,如果需要做有符号数乘法,则需要根据乘数的符号来判断。
例1设x = 18.4,y = 36.8,则浮点运算值为z =18.4×36.8 = 677.12; 设 Qx = 10,Qy = 9,Qz = 5,所以 int x = 18841;//Q10int y = 18841;//Q9z = L_mult(18841, 18841)>>(10+9+1-5) = 354983281L>>14 = 21666;因为z 的定标值为5,故定点 z = 21666即为浮点的 z = 21666/32 = 677.08。
例2设x = 18.4,y = 36.8,则浮点运算值为z =18.4×36.8 = 677.12; #define NN_DIGIT unsigned int 设Qx = 20, Qy = 20, Qy = 20, 所以 NN_DIGIT x = 18.4 * (1<<20); //Q20 NN_DIGIT y = 36.8 * (1<<20); //Q20NN_DIGIT z[2]; //Q20 NN_Mult(z, &x, &y, 1); //Q40 NN_Rshift(z, z, 20, 1); //Q(40-20)1.2.3除法1. 32位除法设浮点除法运算的表达式为:float x,y,z; z = x/y;假设经过统计后被除数x 的定标值为Qx ,除数y 的定标值为Qy ,商z 的定标值为Qz ,则z = x/y ⇒zQ q z -⋅2=yx Q q Q q y x --⋅⋅22 ⇒qQ Q Q q q y x z y x z )(2+-⋅=所以定点表示的除法为:int x,y,z;z = L_shl(x, (Qz -Qx+Qy) )/y; //Qz2. 32位以上的除法这种情况下位数超出了标准c 语言的数的表示范围,只能用数组来保存变量。