DSP中的浮点小数与定点小数
关于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数的表示:定点小数Q格式表示和加法

DSP数的表示:定点小数Q格式表示和加法•DSP数的表示:定点小数Q 格式表示和加法o在低开销DSP上表示小数o Q格式o小数点位置选择o Q格式举例o符号扩展o Q格式加法o使用保护位(guard bit)防止溢出o总结本文翻译自定点表示是的我们可以在低开销的整数硬件上使用小数运算。
本文首先介绍小数表示方法Q格式,然后给一些定点加法的例子。
在低开销DSP上表示小数为了降低开销,很多数字信号处理器都设计成只能进行整数算术运算。
为了在这些处理器上表示小数,我们可以使用隐含小数点。
例如,8bit字a=010101102a=010101102,单被当做整数时表示86108610。
然而,我们可以假设存在一个隐含的小数点,并把该数理解为一个小数。
假设小数点在第4和第5个bit之间,例如,a=0101.01102a=0101.01102。
我们可以通过以下公式得到该数等价的十进制的值:a=0×23+1×22+0×21+1×20+0×2−1+1×2−2+1×2−3+0×2−4=5.375a=0×23+1×22+0×21+1×20+0×2−1+1×2−2+1×2−3+0×2−4=5.375在这个例子中,我们用4bit表示整数部分,4bit表示小数部分。
从这个例子我们可以看到,小数点右边第一个bit的系数为0.5,第二个为0.25,以此类推。
需要注意这个隐含的小数点并没有在硬件上表达,程序猿需要假设一个合适的缩放因子来正确的解释计算结果。
在上面的例子中,硬件上只存储8bit数a=010101102a=010101102。
如果程序员想要用a表示5.375,就需要记住使用a进行的任何运算结果,都需要乘以一个缩放因子2−42−4。
Q格式小数点位置不同,同一个二进制数可以表示不同的值。
第7章DSP定点数和浮点数(重要)

第7章D S P定点数和浮点数(重要)本期教程主要跟大家讲解一下定点数和浮点数的基础知识,了解这些基础知识对于后面学习ARM官方的DSP库大有裨益。
特别是初学的一定要理解这些基础知识。
7.1 定点数和浮点数概念7.2 IEEE浮点数7.3 定点数运算7.4总结7.1定点数和浮点数概念如果小数点的位置事先已有约定,不再改变,此类数称为“定点数”。
相比之下,如果小数点的位置可变,则称为“浮点数”(定点数的本质是小数,整数只是其表现形式)。
7.1.1定点数常用的定点数有两种表示形式:如果小数点位置约定在最低数值位的后面,则该数只能是定点整数;如果小数点位置约定在最高数值位的前面,则该数只能是定点小数。
7.1.2浮点数在计算机系统的发展过程中,曾经提出过多种方法表达实数。
典型的比如相对于浮点数的定点数(Fixed Point Number)。
在这种表达方式中,小数点固定的位于实数所有数字中间的某个位置。
货币的表达就可以使用这种方式,比如 99.00 或者 00.99 可以用于表达具有四位精度(Precision),小数点后有两位的货币值。
由于小数点位置固定,所以可以直接用四位数值来表达相应的数值。
SQL 中的 NUMBER 数据类型就是利用定点数来定义的。
还有一种提议的表达方式为有理数表达方式,即用两个整数的比值来表达实数。
定点数表达法的缺点在于其形式过于僵硬,固定的小数点位置决定了固定位数的整数部分和小数部分,不利于同时表达特别大的数或者特别小的数。
最终,绝大多数现代的计算机系统采纳了所谓的浮点数表达方式。
这种表达方式利用科学计数法来表达实数,即用一个尾数(Mantissa ),一个基数(Base),一个指数(Exponent)以及一个表示正负的符号来表达实数。
比如 123.45 用十进制科学计数法可以表达为 1.2345 × 102,其中 1.2345 为尾数,10 为基数,2 为指数。
浮点数利用指数达到了浮动小数点的效果,从而可以灵活地表达更大范围的实数。
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之后的定点数了。
剖析DSP编程优化的7个方法

剖析DSP编程优化的7个方法方法一把浮点运算改成定点运算因为C6x DSP板并不支持浮点运算,但我们的原始程序代码是浮点运算的格式,所以必须改成定点运算,而其修改后的执行速度也会加快很多。
我们采用Q-format 规格来表示浮点运算。
以下将介绍其相关原理。
定点DSP使用固定的小数点来表示小数部份的数字,这也造成了使用上的限制,而为了要分类不同范围的小数点,我们必须使用Q-format的格式。
不同的Q-format表示不同的小数点位置,也就是整数的范围。
Q15数字的格式,要注意在小数点后的每一位,表示下一位为前一位的二分之一,而MSB (most-significant-bit ) 则被指定成有号数( Sign bit )。
当有号数被设成0而其余位设成1时,可得到最大的正数(7FFFH ) ;而当有号数被设成1而其余位设成0时,可得到最大的负数( 8000H ) 。
所以Q15格式的范围从-1到0.9999694 (@1) ,因此我们可以藉由把小数点向右移位,来增加整数部份的范围,Q14格式的范围增为-2.0到1.9999694 (@2) ,然而范围的增加却牺牲了精确度。
方法二建立表格( table )原来程序的设计是除了要读AAC的档案外,在译码时,还要再另外读取一些C语言程序代码的内容再做计算,如读取一些数值做sin、cos、exp的运算,但是为了加快程序的执行速度,故将这这些运算的结果建成表格,内建在程序中,可以不必再做额外的计算动做,以加速程序。
方法三减短程序的长度1.去除Debug的功能原本程序在Debug的阶段时,就加了许多用来侦测错误的部份,程序Debug完后,已经没有错误发生,所以就可以把这些部份给去除,以减少程序的长度,也可以减少程序执行时的时脉数,加快程序的速度。
2.去除计算时脉( clock ) 功能原本程序可以计算执行程序所需的时脉数,我们也可以把这些部份给去除,如果有需要计。
定点DSP实现浮点运算时的定标问题

程序变量的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. 统计分析法对于理论上无法确定范围的变量,一般采用统计分析的方法来确定其动态范围。
所谓统计分析,就是用足够多的输入信号样值来确定程序中变量的动态范围,这里输入信号一方面要有一定的数量,另一方面必须尽可能地涉及各种情况。
DSP定点与浮点的区别

DSP定点与浮点的区别可能对于入门级的dsp开发者有所帮助。
本文关注定点dsp与浮点dsp的对比,主要从三个方面来分析。
感谢我所引用的资料的作者。
一般来说,定点dsp处理器具有速度快,功耗低,价格便宜的特点;而浮点dsp处理器则计算精确,动态范围大,速度快,易于编程,功耗大,价格高。
1、宏观上的区别从宏观上讲,浮点dsp比定点dsp的动态范围大得多。
定点运算中,程序员必须时刻关注溢出的发生,为了防止溢出,要么不断进行移位定标,要么做截尾。
前者耗费大量时间和空间,后者则带来精度的损失。
相反,浮点运算dsp扩大了动态范围,提高了精度,节省了运算时间和存储空间,因为大大减少了定标,移位和溢出检查。
举个例子(来自/s/blog_518dfe5b0100e17w.html)定点的计算不过是把一个数据当作整数来处理,通常AD采样来的都是整数,这个数相对于真实的模拟信号有一个刻度因子,大家都知道用一个16位的AD去采样一个0到5V的信号,那么AD输出的整数除以2^16再乘以5V就是对应的电压。
在定点DSP中是直接对这个16位的采样进行处理,并不将它转换成以小数表示的电压,因为定点DSP无法以足够的精度表示一个小数,它只能对整数进行计算。
而浮点DSP的优势在于它可以把这个采样得到的整数转换成小数表示的电压,并不损失精度(这个小数用科学记数法来表示),原因在于科学记数法可以表示很大的动态范围的一个信号,以IEEE754浮点数为例,单精度浮点格式: [31] 1位符号 [30-23]8位指数 [22-00]23位小数这样的能表示的最小的数是+-2^-149,最大的数是+-(2-2^23)*2^127.(这里不去研究这个最小最大范围是如何计算出来的)动态范围为20*log(最大的数/最小的数)=1667.6dB 这样大的动态范围使得我们在编程的时候几乎不必考虑乘法和累加的溢出,而如果使用定点处理器编程,对计算结果进行舍入和移位则是家常便饭,这在一定程度上会损失是精度。
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-定点和浮点数格式解析

① 小数乘小数(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、浮点数的格式与运算
定点与浮点数

《例二》:x1=0.5,x2=3.1,求y=x1+x2之數值。 同樣的例子,但是把x1、x2 乘以2倍,則變成下面 的算式。 y2=(x1 × 2)+(x2 × 2)=1+6.2=7.2, 取整數為7=0111b。 ∴y=y2 >> 1=3。 >> ,右移,除2
定點數字表示法 (Conti.)
定點運算的小數點位置完全設計者的心 中,位置取決於乘上的整數值,至於要 選擇多大的整數乘上浮點數呢? 如果乘上2n的倍數,相當於將浮點數往 左位移n個位元,通常一個數字向左或向 右移動幾個位元,在運算上最為快速。 表示法
表示法所能涵蓋的範圍 -32768 ≦ x ≦ 32767 -16384 ≦ x ≦ 16383.5 -8192 ≦ x ≦ 8191.75 -4096 ≦ x ≦ 4095.875 -2048 ≦ x ≦ 2047.9375 -1024 ≦ x ≦ 1023.96875 -512 ≦ x ≦ 511.984375 -256 ≦ x ≦ 255.9921875 -128 ≦ x ≦ 127.99609375 -64 ≦ x ≦ 63.998046875 -32 ≦ x ≦ 31.9990234375 -16 ≦ x ≦ 15.99951171875 -8 ≦ x ≦ 7.999755859375 -4 ≦ x ≦ 3.9998779296875 -2 ≦ x ≦ 1.99993896484375 -1 ≦ x ≦ 0.999969482421875
減法運算
《範例》:兩個運算元都是以Q13為定點數字的表示法, x1=3.5,x2=3.1,求y=x1﹣x2之定點數值。 x1=3.5 × 8192=28672(Q13) x2=3.1 × 8192=25395(Q13) 因為兩個運算元都為相同的定點表示法,直接作減法運算。 y=x1 ﹣ x2=3277(Q13)≒0.40算元為相同的定點表示法, x1=0.5(Q15),x2=0.25(Q15),求y=x1 × x2之定點數 值,x1、x2都宣告為有號數的short。 x1=0.5 × 32768=16384(Q15) x2=0.25 × 32768=8192(Q15) y=x1 × x2=134217728(Q30), 兩個有號數的short整數相乘, 結果變成一個定點為Q30 有號數int。
定点DSP与浮点DSP的比较

声明:本文章系转载并稍加整理标注,可能对于入门级的dsp开发者有所帮助。
本文关注定点dsp与浮点dsp的对比,感谢我所引用的资料的作者。
定点dsp与浮点dsp的比较(1)DSP数字信号处理器是一种特别适合于进行数字信号处理的微处理器,主要用于实时快速地实现各种数字信号处理算法定点运算DSP数字信号处理器在应用中已取得了极大的成功,而且仍然是DSP应用的主体。
然而,随着对DSP处理速度与精度、存储器容量、编程的灵活性和方便性要求的不断提高、自80年代中后期以来,各DSP生产厂家陆续推出了各自的32bit浮点运算DSP。
定点DSP指令集定点DSP指令集是按两个目标来设计的:·使处理器能够在每个指令周期内完成多个操作,从而提高每个指令周期的计算效率。
·将存贮DSP程序的存储器空间减到最小(由于存储器对整个系统的成本影响甚大,该问题在对成本敏感的DSP应用中尤为重要)。
和定点运算DSP相比,浮点运算DSP具有许多优越性:浮点运算DSP比定点运算DSP的动态范围要大很多。
定点DSP的字长每增加1bit,动态范围扩大6dB。
16bit字长的动态范围为96dB。
程序员必须时刻关注溢出的发生。
例如,在作图像处理时,图像作旋转、移动等,就很容易产生溢出。
这时,要么不断地移位定标,要么作截尾。
前者要耗费大量的程序空间和执行时间,后者则很快带来图像质量的劣化。
总之,是使整个系统的性能下降。
在处理低信噪比信号的场合,例如进行语音识别、雷达和声纳信号处理时,也会发生类似的问题。
而32bit浮点运算DSP的动态范围可以作到1536dB,这不仅大大扩大了动态范围,提高了运算精度,还大大节省了运算时间和存储空间,因为大大减少了定标,移位和溢出检查。
由于浮点DSP的浮点运算用硬件来实现,可以在单周期内完成,因而其处理速度大大高于定点DSP。
这一优点在实现高精度复杂算法时尤为突出,为复杂算法的实时处理提供了保证。
DSP-定点和浮点数格式

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中有一些低端或者高速的DSP 设计中往往只有整数运算单元。
但是在现实世界中,不仅存在整数运算,还存在着浮点数的运算。
论文讨论了在定点DSP中如何用定点运算模拟浮点运算(32位计算机)的方法。
关键字:定点DSP 浮点数运算定点运算转换在定点DSP芯片中,采用定点数进行数值运算,其操作数一般采用整型数来表示。
一个整型数的最大表示范围取决于DSP芯片所给定的字长,一般为16位或32位。
显然。
字长越长。
所能表示的数的范围越大。
精度也越高。
定点DSP芯片的数以2的补码形式表示。
符号位为最高位,0表示正数,1表示负数。
其余的位表示数值的大小。
在一个字长为32位定点DSP中。
二进制数00000010000010000000000011111110b=34078974二进制数11111111111111111111111111111000b=-8为了在定点DSP表示浮点数,我们必须把除符号位外的剩余位进一步划分为整数位,小数位。
整数位的多少决定了所能表示的浮点数的动态范围.小数位的多少决定了所表示的浮点数精度的高低。
对定点DSP芯片而言,参与数值运算的数就是32位的整型数。
但在许多情况下.数学运算过程中的数不一定都是整数。
所以说对于浮点数的运算DSP芯片本身是无能为力。
可这并不能说明DSP芯片不能处理这种的运算,因为这样的芯片会被时代所淘汰,不能应用到现实中来使用。
所以DSP芯片就要将浮点数转换为整数来进行各种的运算,这其中的关键就是由程序员来确定一个数的小数点处于32位中的哪一位。
这就是数的定标。
通过设定小数点在32位数中的不同位置,就可以表示不同大小和不同精度的小数了。
数的定标有Q表示法和S表示法两种。
同样一个32位数,若小数点设定的位置不同,它所表示的数也就不同。
例如:16进制数20000000H=536870912(用Q0表示);16进制数20000000H=0.25(用Q31表示)。
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中的浮点与定点比较

Q8
S7.8
-128 ≤ X ≤ 127.996 093 8
Abstract:This paper introduces the fixed-point data format and floating-point data format commonly used in DSP, compares the advantages and disadvantages of the two data formats,and puts forward some suggestions on the applicable scenarios and format selection.
1 浮点数据格式与定点数据格式
1.1 浮点数据格式
在计算机系统的发展过程中提出过多种方法表
示实数,但是目前为止使用最广泛的是浮点表示法。
IEEE(Institute of Electrical and Electronics Engineers, 电子电气工程师协会)在 I985 年制定的 IEEE 754(IEEE Standard for Binary Floating-Point Arithmetic,ANSI/IEEE Std 754-1985)二进制浮点运算规范,是浮点运算部件 的工业标准 [1]。
采用以下浮点表示格式表示 16 位浮点数,该格式
为 IEEE 745 标准的子集,除了能够完成要求的实数表 示外,处理上也更为简洁。总位宽 m=16 bit,格式如图 1 所示,用一个三元组 {S,E,M} 来表示一个数 N。
15 14
10 9
0
S
E
M
1 bit
n bit
(m-n-1) bit
图 1 三元组表示法举例
定点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了。
DSP中浮点转定点运算--浮点与定点概述

DSP中浮点转定点运算--浮点与定点概述⼀:浮点与定点概述1.1相关定义说明 定点数:通俗的说,⼩数点固定的数。
以⼈民币为例,我们⽇常经常说到的如123.45¥,789.34¥等等,默认的情况下,⼩数点后⾯有两位⼩数,即⾓,分。
如果⼩数点在最⾼有效位的前⾯,则这样的数称为纯⼩数的定点数,如0.12345,0.78934等。
如果⼩数点在最低有效位的后⾯,则这样的数称为纯整数的定点数,如12345,78934等。
浮点数:⼀般说来,⼩数点不固定的数。
⽐较容易的理解⽅式是,考虑以下我们⽇常见到的科学记数法,拿我们上⾯的数字举例,如123.45,可以写成以下⼏种形式:12.345x1011.2345 x1020.12345 x103……为了表⽰⼀个数,⼩数点的位置可以变化,即⼩数点不固定。
1.2定点数与浮点数的对⽐为了简单的把问题描述清楚,这⾥都是⼗进制数字举例,详细的分析,⼤家可以在后⾯的⽂章中看到。
(1)表⽰的精度与范围不同例如,我们⽤4个⼗进制数来表达⼀个数字。
对于定点数(这⾥以定点整数为例),我们表⽰区间[0000,9999]中的任何⼀个数字,但是如果我们要想表⽰类似1234.3的数值就⽆能为⼒了,因为此时的表⽰精度为1/100=1;如果采⽤浮点数来表⽰(以归整的科学记数法,即⼩数点前有⼀位有效位,为例),则可以表⽰[0.000,9.999]之间的任何⼀个数字,表⽰的精度为1/103=0.001,精度⽐上⼀种⽅式提⾼了很多,但是表⽰的范围却⼩了很多。
也就是说,⼀般的,定点数表⽰的精度较低,但表⽰的数值范围较⼤;⽽浮点数恰恰相反。
(2)计算机中运算的效率不同⼀般说来,定点数的运算在计算机中实现起来⽐较简单,效率较⾼;⽽浮点数的运算在计算机中实现起来⽐较复杂,效率相对较低。
(3)硬件依赖性⼀般说来,只要有硬件提供运算部件,就会提供定点数运算的⽀持(不知道说的确切否,没有听说过不⽀持定点数运算的硬件),但不⼀定⽀持浮点数运算,如有的很多嵌⼊式开发板就不提供浮点运算的⽀持。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
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了。
好,复习了整数的相关知识之后,我们进入定点小数运算环节。
所谓定点小数,就是小数点的位置是固定的。
我们是要用整数来表示定点小数,由于小数点的位置是固定的,所以就没有必要储存它(如果储存了小数点的位置,那就是浮点数了)。
既然没有储存小数点的位置,那么计算机当然就不知道小数点的位置,所以这个小数点的位置是我们写程序的人自己需要牢记的。
先以10进制为例。
如果我们能够计算12+34=46的话,当然也就能够计算1.2+3.4 或者0.12+0.34了。
所以定点小数的加减法和整数的相同,并且和小数点的位置无关。
乘法就不同了。
12*34=408,而1.2*3.4=4.08。
这里1.2的小数点在第1位之前,而4.08的小数点在第2位之前,小数点发生了移动。
所以在做乘法的时候,需要对小数点的位置进行调整?!可是既然我们是做定点小数运算,那就说小数点的位置不能动!!怎么解决这个矛盾呢,那就是舍弃最低位。
也就说
1.2*3.4=4.1,这样我们就得到正确的定点运算的结果了。
所以在做定点小数运算的时候不仅需要牢记小数点的位置,还需要记住表达定点小数的有效位数。
上面这个例子中,有效位数为2,小数点之后有一位。
现在进入二进制。
我们的定点小数用16位二进制表达,最高位是符号位,那么有效位就是15位。
小数点之后可以有0 - 15位。
我们把小数点之后有n位叫做Qn,例如小数点之后有12位叫做Q12格式的定点小数,而Q0就是我们所说的整数。
Q12的正数的最大值是0 111.111111111111,第一个0是符号位,后面的数都是1,那么这个数是十进制的多少呢,很好运算,就是0x7fff / 2^12 =
7.999755859375。
对于Qn格式的定点小数的表达的数值就它的整数值除以2^n。
在计算机中还是以整数来运算,我们把它想象成实际所表达的值的时候,进行这个运算。
反过来把一个实际所要表达的值x转换Qn型的定点小数的时候,就是x*2^n 了。
例如0.2的Q12型定点小数为:0.2*2^12 = 819.2,由于这个数要用整数储存,所以是819 即0x0333。
因为舍弃了小数部分,所以0x0333不是精确的
0.2,实际上它是819/2^12 =0.199951171875。
我们用数学表达式做一下总结:
x表示实际的数(*一个浮点数),q表示它的Qn型定点小数(一个整数)。
q = (int)(x * 2^n)
x = (float)q/2^n
由以上公式我们可以很快得出定点小数的+-*/算法:
假设q1,q2,q3表达的值分别为x1,x2,x3
q3 = q1 + q2 若x3 = x1 + x2
q3 = q1 - q2 若x3 = x1 - x2
q3 = q1 * q2 / 2^n若x3 = x1 * x2
q3 = q1 * 2^n / q2若x3 = x1 / x2
我们看到加减法和一般的整数运算相同,而乘除法的时候,为了使得结果的小数点位不移动,对数值进行了移动。
用c语言来写定点小数的乘法就是:
short q1,q2,q3;
....
q3=((long q1) * (long q2)) >> n;
由于/ 2^n和* 2^n可以简单的用移位来计算,所以定点小数的运算比浮点小数要快得多。
下面我们用一个例子来验证一下上面的公式:
用Q12来计算2.1 * 2.2,先把2.1 2.2转换为Q12定点小数:
2.1 * 2^12 = 8601.6 = 8602
2.2 * 2^12 = 9011.2 = 9011
(8602 * 9011) >> 12 = 18923
18923 的实际值是18923/2^12 = 4.619873046875 和实际的结果4.62相差
0.000126953125,对于一般的计算已经足够精确了。