定点数的定标

转自:http://blog.csdn.net/longxuekun1992/article/details/52895302

1. 选取合适的定标值(加载操作数)
定标的大小,影响着整数部分和小数部分的位数,定标的过程其实是在操作数动态范围和精度之间做权衡的过程。

设一个变量可能出现的最大绝对值为|max|,n为正整数,满足2^(n-1) < |max| < 2^n,则定标Q按如下规则选取最合适:

Q = 有效数据位 – n

对于32位的有符号数,数据有效位=31。如|max| = 2.75,选Q = 31 – 2 =29是最合适的。

2. 定点数之间的运算
两个定点数进行运算,它们的定标可能相同也可能不同,那该遵循怎样的规则来进行加减乘除等基本运算呢?

网上有些资料通过分别举加、减、乘、除实际运算的例子来说明这一问题,虽然很详细,但还是不够直观。

来看一看,平时我们用十进制做两个数的加减和乘除是怎么弄的。

加减法:先对位,后加减;
乘除法:先乘除,后取小数点。

而定点数之间的加减乘除,撇开符号位不谈,其过程是一样一样的:

加减法:先对标,后加减;
乘除法:先乘除,后定标。

3. 结果重新定标(返回结果)
两个定点数运算完成之后,所得结果的定标、动态范围、精度要求等都可能发生了变化,因此可能需要进行重新定标。

比如Q15*Q15 -> Q30,但我们依然希望得到一个Q15的数怎么办?其实只需做一个简单的右移15位操作就好,其它情况同理。

大家可以仔细体会下这里的意思,然后再找具体的例子对照感受下,看是不是觉得简单多了呢。

http://blog.csdn.net/times_poem/article/details/51505014

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

用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,对于一般的计算已经足够精确了。

http://www.eeworld.com.cn/DSP/2014/1025/article_4006.html

q = quantizer(‘fixed‘, ‘ceil‘, ‘saturate‘, [32 30]);

  FixedNum=bin2dec(num2bin(q,1.999999999));

http://blog.163.com/xiada_action/blog/static/7423460220100255911247/

1.q = quantizer(‘fixed‘, ‘ceil‘, ‘saturate‘, [8 6]);imgbits=num2bin(q,k);这是将一个小数k,比如0.256 变成二进制。小数点后面3位用6位二进制表示。

现再将编出来的二进制 恢复成10进制 小数:

二进制小数转换没有现成的函数,要自己编的。         或者你利用二进制整数的转换函数bin2dec()         比如二进制的0.1101         那你就先把小数部分转换成十进制整数        >> d=bin2dec(‘1101‘)                   d =                         13              然后再根据位数,小数点后面4位,就除以2^4        >> d/2^4                 ans =                          0.8125

2.写文件:

fid=fopen(‘sin.coe‘,‘wt‘)

fprintf(fid, ‘%d‘,a)

fclose(fid)

读取文件:

(1)fid1=fopen(‘fx.txt‘,‘r‘);                     %得到文件号

[f,count]=fscanf(fid,‘%f %f‘,[12,90])

%把文件号1的数据读到f中。其中f是[12 90]的矩阵

%这里‘%f %f‘表示读取数据的形势,他是按原始数据型读出

fclose(fid);%关闭文件

(2) load data.txt

data

(3) a=importdata(‘data.txt‘)

时间: 2024-10-15 03:54:31

定点数的定标的相关文章

FPGA中浮点运算实现方法——定标

有些FPGA中是不能直接对浮点数进行操作的,仅仅能採用定点数进行数值运算.对于FPGA而言,參与数学运算的书就是16位的整型数,但假设数学运算中出现小数怎么办呢?要知道,FPGA对小数是无能为力的,一种解决的方法就是採用定标.数的定标就是将要运算的浮点数扩大非常多倍,然后取整,再用这个数进行运算,运算得到的结果再缩小对应的倍数就能够了.在设计中,一定不要忘记小数点.在FPGA 中是体现不出来小数点的,小数点的位置仅仅有程序猿知道.Q表示小数点的位置,Q15就表示小数点在第15位. 浮点数(x)转

DSP中浮点数和定点数 dsp

2020-04-08  21:54:53 1 DSP中的数据表述DSP中数据通常是有定点数与浮点数表示,其中可以对字长进行相关定义,可以选取字长为16位.24位.32位不同字长使用.而格式与字长决定了数据的精度与动态范围,同时也一定程度上决定了DSP处理器的功耗.成本与编程难度. 定点数:小数点位置为确定的. 浮点数:小数点位置可以改变. 定点运算的硬件实现较为简单,功耗较小,主要注意的是数据的定标.溢出以及误差. 浮点器减结构较为复杂,但是精度较高,高级语言容易支持. 2 定点数的格式与相关运

定点数与浮点数

I.定点数 所谓定点格式,即约定机器中所有数据的小数点位置是固定不变的.通常将定点数据表示成纯小数或纯整数,为了将数表示成纯小数,通常把小数点固定在数值部分的最高位之前:而为了将数表示成纯整数,则把小数点固定在数值部分的最后面,如下图所示: 图中所标示的小数点在机器中是不表示出来的,而是事先约定在固定的位置.对于一台计算机,一旦确定了小数点的位置,就不再改变. 假设用n位来表示一个定点数 ,其中 用来表示数的符号位,通常放在最左位置,并用数值0和1分别表示正号和负号,其余位数表示它的量值.如果定

1、定点数与浮点数

DSP中对数值的存储方式有两种:定点表示法和浮点表示法 对应DSP芯片分为两种:定点DSP芯片和浮点DSP芯片 定点DSP芯片:结构简单,MAC速度较快,运算精度低,动态范围小 浮点DSP芯片:结构较复杂,主频较低,功耗较高,动态范围大 1.定点数据格式(Fixed-Point) 1.1定点整数 定点整数分为定点无符号整数和定点有符号整数,有符号数第一位为符号位,存储补码. 16bit表示的定点无符号整数: 16bit表示的定点有符号整数: 1.2定点小数 与定点整数相似,分为有符号和无符号 不

【C语言模拟实现】浮点数-转-定点数

要想超神,就要什么都精! 知识准备: 1. 输出浮点数的十六进制形式?(利用指针输出) 将浮点数指针-转换成-整型指针,以十六进制的格式输出指针内容. 示例程序: #include<stdio.h> int main() { float *var; scanf("%f",var); printf("%x",*((int*)var)); } 测试: 输入(float) 输出(十六进制) 二进制 8.25 41040000 0100 0001 0000 01

双目视觉算法学习(一):双目定标

老板新安排的任务,需要在FPGA上实现双目算法,所以最近开始学习这块,双目算法主要分成3个部分:定标.校正.匹配.其实定标是最基础的部分,为后面的程序提供初始数据,这一块的数据主要参考了图像获取与单目定标和摄像机标定和立体标定,本文主要是我在双目定标的步骤以及我对此的理解. 一.固定摄像头 摄像头这块我使用的是两个罗技的普通USB摄像头,一般只要在opencv中使用cvCreateCameraCapture()函数能捕捉到图像就好.然后将两个摄像头平行固定好,我的摄像头最后如下所示: 二.使用摄

mysql 浮点数与定点数

浮点数一般用于表示含有小数部分的数值.当一个字段被定义为浮点类型后,如果插入数据的精度超过该列定义的实际精度,则插入值会被四舍五入到实际定义的精度值,然后插入,四舍五入的过程不会报错.在MySQL 中float.double(或real)用来表示浮点数. 定点数不同于浮点数,定点数实际上是以字符串形式存放的,所以定点数可以更加精确的保存数据. mysql> CREATE TABLE test (c1 float(10,2),c2 decimal(10,2));Query OK, 0 rows a

Java中要使用 BigDecimal(定点数) 进行小数的相关操作,避免使用float等浮点数

Java中要使用 BigDecimal(定点数) 进行小数的相关操作,避免使用float等浮点数,因为 float, double等浮点的存储和操作(比如:相加,相减...)存在误差(7.22f - 7.0f = 0.21999979 而不是 0.22). 下面以 BigDecimal 进行减法为例: /**  * 精确的减法  */ public static double subtract(double v1, double v2) { BigDecimal d1 = new BigDeci

OpenCV系列【2】,一个简单定标并储存结果的程序

基于张正友定标法的Opencv3.1定标程序,先用findchessboard找到棋盘,用cornersubpix做亚像素定位,再用calibrateCamera进行定标,最后将定标结果储存在xml文件里 程序基于vs2013和opencv3.1,要注意的是3.1根之前2XX系列很多地方不同,很多函数不同,具体情况看代码, 新手,难免犯诸如switch语句没有default之类的错误,大神看见请轻拍... /********************************************