主要内容

执行定点算术

这个例子展示了如何执行基本的定点算术操作。

保存之前警告状态。

warnstate =警告;

加法和减法

当你添加两个无符号定点数,你可能需要一个进位位正确表示结果。由于这个原因,当添加两个B-bit数(以相同的比例),结果值相比有一个额外的位所使用的两个操作数。

一个= ufi (0.234375、4、6);c = a +
c = 0.4688 DataTypeMode:定点:二进制扩展Signedness:无符号字:5 FractionLength: 6
a.bin
ans = ' 1111 '
c.bin
ans = ' 11110 '

与签订,两个补数数字,类似的情况发生,因为符号扩展需要正确表示结果。

一个= sfi (0.078125、4、6);-0.125 b = sfi (4,6);c = a + b
c = -0.0469 DataTypeMode:定点:二进制扩展Signedness:签了字:5 FractionLength: 6
a.bin
ans = ' 0101 '
b.bin
ans = ' 1000 '
c.bin
ans = ' 11101 '

如果你添加或减去两个数字有不同的精度,小数点第一需要对齐来执行操作。结果是有差异的多一点的结果之间的操作和操作数(取决于基数点之间的差距有多远)。

一个= sfi(π,16日13);b = sfi (0.1、12、14);c = a + b
c = 3.2416 DataTypeMode:定点:二进制扩展Signedness:签了字:18 FractionLength: 14

进一步考虑了加法和减法

注意,下面的模式推荐。从标量添加执行在for循环的每次迭代中,有点被添加到临时在每个迭代。作为一个结果,而不是装天花板(log2 (Nadds)) bit-growth bit-growth等于Nadds。

s =提高;rng (“默认”);b = sfi(4 *兰德(16日1)2,32岁,30);rng(年代);%恢复RNG状态Nadds =长度(b) - 1;temp = b (1);n = 1: Nadds temp = temp + b (n + 1);%临时有15位比b结束

如果总和相反,使用命令bit-growth限制是预期。

c =和(b)% c有4个比特比b
c = 7.0059 DataTypeMode:定点:二进制扩展Signedness:签了字:36 FractionLength: 30

乘法

一般来说,一个完整的精密产品需要一个单词长度等于操作数的单词长度的总和。在接下来的例子中,注意产品的单词长度c等于这个词的长度一个加的字长b。的部分长度c也等于分数的长度吗一个+的分数长度b

一个= sfi(π,20);b = sfi (exp (1), 16);c = a * b
c = 8.5397 DataTypeMode:定点:二进制扩展Signedness:签了字:36 FractionLength: 30

赋值

当你分配一个定点值到一个预定义的变量,量化可能参与其中。在这种情况下,表达式的眼睛被舍入量化最近的饱和,如果有必要,在分配到小。

N = 10;a = sfi(2 *兰德(N, 1) 1, 16日15);b = sfi(2 *兰德(N, 1) 1, 16日15);c = sfi (0 (N, 1), 16日14);c n = 1: n (n) = (n)。* b (n);结束

注意,当产品(n)。* b (n)与完整的精密计算,一个字的中间结果32和部分长度30生成。那结果是量子化的16字和一小部分的长度14日,如上所述。然后分配给元素量化值c (n)

量化结果明确

通常是不可取的圆形的或饱和时量化结果因为额外的逻辑/计算要求。它也可能是不受欢迎的需要分配一个小值进行量化。您可以使用数字转换对于这样的目的。常见的情况是一个反馈回路。如果没有介绍,量化un-bounded bit-growth会发生更提供输入数据。

一个= sfi (0.1, 16, 18);x = sfi(2 *兰德(128 1),16日15);y = sfi(0(大小(x)), 16日14);n = 1:长度(x) z = y (n);y (n) = x (n) -数字转换(a。* z,真的,16日14日“地板”,“包装”);结束

在这个例子中,该产品* z。完整精确地计算,随后量子化的16位字和一小部分的长度14。量化是由舍入楼(截断)和允许包装如果发生溢出。量化仍然发生在作业,因为表达式x (n) -数字转换(a。* z,…)产生的中间结果18位y是定义为16位。消除量化赋值,您可以引入一个额外明确量化如下所示。这样做的好处是,没有round-to-nearest /饱和度逻辑。小的结果具有相同的16位字和部分长度14y (n),所以没有量化是必要的。

一个= sfi (0.1, 16, 18);x = sfi(2 *兰德(128 1),16日15);y = sfi(0(大小(x)), 16日14);T = numerictype(14)真的,16日;n = 1:长度(x) z = y (n);y (n) =数字转换(x (n), T,“地板”,“包装”)- - -数字转换(a。* z, T,“地板”,“包装”);结束

Non-Full-Precision金额

软件不能金额并不总是可取的。例如,相对应的是18位字的中间结果x (n) -数字转换(…)以上可能导致复杂和低效的代码,如果C代码生成。相反,它可能是可取的,让所有的结果加/减16位。您可以使用accumposaccumneg为此功能。

一个= sfi (0.1, 16, 18);x = sfi(2 *兰德(128 1),16日15);y = sfi(0(大小(x)), 16日14);T = numerictype(14)真的,16日;n = 1:长度(x) z = y (n);y (n) =数字转换(x (n), T);%违约:“地板”,“包装”y (n) = accumneg (y (n),数字转换(a。* z, T));%违约:“地板”,“包装”结束

建模蓄电池

accumposaccumneg是适合蓄电池模型。行为对应于c + =和- =运营商一个常见的例子是一个数字滤波器的系数和输入数据是用16位表示。不能执行乘法运算,产生32位,与8 guard-bits和一个累加器,即40位用于启用256累积总没有溢出的可能性。

b = sfi (1/256 * (1:128,128: 1:1), 16);%滤波器系数x = sfi(2 *兰德(300 1),16日15);%的输入数据z = sfi(0(256 1), 16日15);%用于存储状态y = sfi(0(大小(x)), 40岁,31);%初始化输出数据n = 1:长度(x) acc = sfi(0, 40岁,31);%重置蓄电池z (1) = x (n);%负载输入样本k = 1:长度(b) acc = accumpos (acc, b (k)。* z (k));%增加和积累结束z z(2:结束)= (1:end-1);%更新状态y (n) = acc;%分配输出结束

矩阵运算

为了简化语法和缩短仿真时间,您可以使用矩阵运算。对于冷杉过滤器示例,您可以更换内循环内积。

z = sfi(0(256 1), 16日15);%用于存储状态y = sfi(0(大小(x)), 40岁,31);n = 1:长度(x) z (1) = x (n);y (n) = b * z;z z(2:结束)= (1:end-1);结束

内积b * z完整精确地执行。因为这是一个矩阵操作,一些增长是由于所涉及的乘法和加法的产品。下载188bet金宝搏因此,经济增长取决于操作数的长度。自bz长度为256,占一个8位的增长由于添加。这就是为什么内积的结果在32 + 8 = 40位(部分长度31)。因为这是格式y初始化,没有量化出现在赋值y (n) = b * z

如果你必须执行一个内积为系数,超过256的增长将超过8位超出32所需的产品。如果你只有一个40位累加器,你可以模型通过引入量化器的行为,如y (n) =数字转换(Q, b * z),或者你可以使用accumpos功能已被证明。

建模一个计数器

accumpos可以用来模拟一个简单的计数器,自然地包裹在达到其最大值。例如,您可以建模3-bit计数器如下。

c = ufi (0, 0);Ncounts = 20;%的次数计算c = n = 1: Ncounts accumpos (c, 1);结束

自从3-bit计数器自然包裹回到0达到7后,计数器是国防部的最终价值(20日8)= 4。

数学与其他内置数据类型

FI *双

在做乘法之间fi,是演员fi同一个词的长度和signednessfi,best-precision部分长度。操作的结果fi

一个= fi (pi);b = 0.5 *
b = 1.5708 DataTypeMode:定点:二进制扩展Signedness:签了字:32 FractionLength: 28

FI +双或FI -双

在做加法或减法fi,双是一个演员fi用同样的numerictype随着fi。操作的结果fi

这种行为的fi+在R2012b改变。你可以输入以下命令来关闭不相容警告警告命令。

警告固定:不相容:fi: behaviorChangeHeterogeneousMathOperationRules一个= fi (pi);b = a + 1
b = 4.1416 DataTypeMode:定点:二进制扩展Signedness:签了字:17 FractionLength: 13

MATLAB®和C之间的一些差异

注意,在C语言中,一个操作的结果之间的一个整数数据类型和两个数据类型促进双。

然而,在MATLAB中,手术的结果内置整数数据类型和数据类型是整数的两倍。在这方面,fi对象在MATLAB像内置的整数数据类型。之间的一个操作的结果fi和一个是一个的两倍fi

FI * INT8

在做算术fi之间和一个内置整数数据类型(u) int(8、16、32),这个词的长度和signedness整数保存。操作是一个fi的结果。

一个= fi (pi);b = int8 (2) *
b = 6.2832 DataTypeMode:定点:二进制扩展Signedness:签了字:24 FractionLength: 13

恢复警告状态。

警告(warnstate);% #好< * NASGU, * NOPTS >