如何屏蔽特定比特在签订定点号码吗?

44视图(30天)
我一直试图模仿一个简单的乘数与定点输入和输出。我想面具的最后4位输入和输出测试。我试着使用bitand()函数,但它只接受整数值。我能做些什么在定点小数价值观?
例如:
一个= -2.345和b = 0.2755 (16 b定点量化)
c = a * b;(输出也量子化的16位)
我想面具的最后4位a和b,观察输出c。我应该使用什么函数?
谢谢!

接受的答案

安迪·巴特利特”class=
安迪·巴特利特 2022年4月11日
编辑:安迪·巴特利特 2022年4月11日
软件不能用
16位的乘法不能输入可以做
格式紧凑的
格式
fp = fipref;
《外交政策》。NumericTypeDisplay =“短”;
%设置使用签署了16位a和b
%如果a和b是常数
%设置best-precision扩展基于值
%
isSigned = 1;
nBits = 16;
一个= fi (-2.3451220703125、isSigned nBits)
disp (a.bin)
b = fi (0.2763544921875、isSigned nBits)
disp (b.bin)
%全面精密乘
yFullPrecProduct =。* b
disp (yFullPrecProduct.bin)
的输出
一个=
-2.345092773437500
numerictype(1, 16日,13)
1011010011110101
b =
0.276351928710938
numerictype(1, 16日,16)
0100011010111111
yFullPrecProduct =
-0.648070910945535
numerictype(1, 32岁,29)
11101011010000110000000011001011
注意到的输出16位乘以16位是32位。
从乘降低输出精度
减少大小的定点乘法的输出求哪个部分的关键问题保持精度降低产量和比特丢弃。
根据答案,还会有一个问题关于如何处理溢出或舍入或两者兼而有之。如果不能输出签署,你可能还需要决定如果你想减少精度无符号保持签名或者改变输出。
这是一个保持最重要的16位的例子
ntc = numerictype (c);
nBitsY1 = 16;
nPrecisionBitsToDrop = 16;
fmSatFloor = fimath (“RoundingMethod”,“地板”,
“OverflowAction”,“饱和”);
nty1 = numerictype (
ntc.SignednessBool,
nBitsY1,
全国过渡委员会。FractionLength - nPrecisionBitsToDrop);
日元= fi (yFullPrecProduct nty1 fmSatFloor);
日元= removefimath(日元)
disp (y1.bin)
的输出
日元=
-0.648071289062500
numerictype(1, 16日,13)
1110101101000011
这里有一个例子让最重要的16位
ntc = numerictype (c);
nBitsY2 = 16;
nPrecisionBitsToDrop2 = 0;
fmSatFloor = fimath (“RoundingMethod”,“地板”,
“OverflowAction”,“饱和”);
fmWrapFloor = fimath (“RoundingMethod”,“地板”,
“OverflowAction”,“包装”);
nty2 = numerictype (
ntc.SignednessBool,
nBitsY2,
全国过渡委员会。FractionLength - nPrecisionBitsToDrop2);
y2sat = fi (yFullPrecProduct nty2 fmSatFloor);
y2sat = removefimath (y2sat)
disp (y2sat.bin)
y2wrap = fi (yFullPrecProduct nty2 fmWrapFloor);
y2wrap = removefimath (y2wrap)
disp (y2wrap.bin)
的输出
y2sat =
-6.103515625000000 e-05
numerictype(1, 16日,29)
1000000000000000
y2wrap =
3.781169652938843 e-07
numerictype(1, 16日,29)
0000000011001011
请注意,两个不同的输出计算。
一个处理饱和溢出。在这种情况下,它饱和最负能上演的价值最终的输出类型。
其他处理溢出包装这意味着就扔掉了最重要的位,始终保持较低的显著位一字不差。
屏蔽位
屏蔽位迫使某些位为零和/或某些部分的可以在C语言中,MATLAB,使用位操作和位操作或仿真软件。金宝app函数或模型块一点一点设置和金宝app明确的也可以使用。
在MATLAB函数bitand和bitor是可用的。使用这些与定点fi对象时,两种观点都必须具有相同的类型,这需要一点关心。
这个函数提供了一个示例使用bitand力n最低有效位的输入为零。
函数y = bitClearLSB (u, nBits)
% bitClearLSB清楚n最低有效位的输入
%
%用法:
% y = bitClearLSB (u, nBits)
%的输入
% u是任何定点或整数变量
% nBits非负整数的值(默认为1)
%
% 2022年版权MathWorks公司。
% # codegen
如果输入参数个数< 2
nBits = 1;
结束
维护(
元素个数(nBits) = = 1 & & isequal(大小(nBits),大小(u)),
”nBits必须标量或大小一样。”)
维护(
((nBits > = 0) & (nBits = =地板(nBits)) & isfinite (nBits)),
“nBits必须是一个非负整数的值。”)
%内置整数对象将使用等效处理
%
u1 = castIntToFi (u);
断言(isfi (u1) & &用(u1),“你必须是整数或定点”。)
ntu1 = numerictype (u1);
%创建原始位屏蔽所有的位位置保持
%和清除所有零位位置
%为8位字长
% nBits rawBitMask
% 0 1111
% 1 1110
% 2 1100
% 3 1000
% 0000
%
王= ntu1.WordLength;
ntRawBits = numerictype(0,西城,0);
rawBitMask = repmat (upperbound (ntRawBits)、大小(nBits));
rawBitMask (,) = bitsll (rawBitMask nBits);
% bitand fi需要相同的两种类型
%包括fimath属性
%,所以重新诠释位掩码
%然后设置fimath
%
位掩码= reinterpretcast (rawBitMask ntu1);
位掩码= setfimath(位掩码,fimath (u1));
日元= bitand (u1,位掩码);
%如果内置整数类型追溯
%
y =投(日元“喜欢”,y1);
结束
这里是一个例子应用到一个变量。
格式紧凑的
格式
fp = fipref;
《外交政策》。NumericTypeDisplay =“短”;
%设置使用签署了16位a和b
%如果a和b是常数
%设置best-precision扩展基于值
%
isSigned = 1;
nBits = 16;
b = fi (0.2763544921875、isSigned nBits)
disp (b.bin)
%明显4 b的lsb
%
nBitsClear = uint8 (4);
b1 = bitClearLSB (b, nBitsClear)
disp (b1.bin)
的输出
b =
0.276351928710938
numerictype(1, 16日,16)
0100011010111111
b1 =
0.276123046875000
numerictype(1, 16日,16)
RoundingMethod:最近的
OverflowAction:饱和
ProductMode: FullPrecision
SumMode: FullPrecision
0100011010110000
生成的C代码的清除操作将是简单的如下
无效myFunc (int16_T, unsigned char nBitsClear int16_T * y1)
{
int16_T tmp_bit_mask;
tmp_bit_mask = 65535 < < nBitsClear;
* y2 = & tmp_bit_mask;
}
希望这个例子给你足够的主意工艺无论你正在寻求一些屏蔽操作。
然后梳理乘法例子上面应该允许你找出你的整体问题的解决方案。
考虑铸件
由于高水平的目标涉及乘法,位屏蔽可能不是最简单的方式来实现你的目标。如果你的目标是摆脱一定数量的最重要的位或最低有效位,您可能希望考虑使用铸造。
考虑上面给出的例子最重要的16位的变量(发生是乘法产品)。这最重要的输入16位下降。数学上,相当于保持输出32位但使用屏蔽,这样最重要的16位都是零。
向下类型转换为16位可以更容易思考和模型比做屏蔽。一个大的好处是,后续操作可以更有效率。例如,一些屏蔽然后做一个32位的32位乘法产生一个64位的理想产品比向下类型转换效率低16位,然后做一个16位16位乘法产生一个32位的理想产品。
3评论

登录置评。

更多的答案(0)

社区寻宝

找到宝藏在MATLAB中央,发现社区如何帮助你!

开始狩猎!