2017-08-30 51 views
-1

我想知道是否有人可以请我解释为什么&该代码的工作原理,将-1.0和+1.0之间的双精度转换为14位整数。为什么&这个“double”到“14-bit Int”代码是如何工作的?

data14中的值如何选择,以及幕后发生了什么?

double data = 0.5; 

if (data < -1.0) { 
    data = -1.0; 
} else if (data > 1.0) { 
    data = 1.0; 
} 

int data14 = (int)((data+1.0)/2.0*16383 + 0.5); 

BYTE upper7 = data14 >> 7; 
BYTE lower7 = data14 & 0x7f; 
+1

你知道位移和位掩码是什么吗?如果不是,先学习,然后回到这个。好,现在好吗?如果记住十进制16383是十六进制0x3FFF,这是二进制11111111111111,即14个连续位,则可能有助于理解此代码。它也有助于使用你的调试器查看'data14'的任何给定值的'data'的原始字节,做数学来理解为什么'data14'被设置为它的方式(例如,'0.5' - >' '12287'又名'0x2FF'),并在纸上写出为什么按照原样完成位移的原因。 –

+1

如果有帮助:'-1.0'变为'0','1.0'变成'16383'('0x3FFF',即最大14位)。该代码将'-1.0..1.0'之间的浮点值转换为'0..16383'之间的十进制值。 –

+0

将数据加1后的原因是什么,将14位(0x3FFF)乘以2,然后加0.5? – Nop

回答

1

如果可以解析正确的操作顺序,这里是序列的数据区间的长期结果

input data    -> (-inf,inf) 
if(...) else if() ... -> [-1 , 1] 
data+1     -> [0 , 2] 
/2      -> [0 , 1] 
*16383     -> [0 , 16383] 
+0.5     -> [0.5 , 16383.5] 
int()     -> [0 , 16383] 

注意,在概率密度,数据的均匀分布的期限在[-1,1]中将给出[0,16383]中的有偏分布 - 极值0和16383具有比[1,16382]少两倍的出现概率。

也许这是需要的,否则就需要乘以16384的浮点前驱,并避免加上+0.5。

+1

我认为一个更好的选择来解决对端点的偏置会延迟钳位,直到*添加0.5后,因为舍入在这个转换中实际上是可取的。 – njuffa

相关问题