数值计算小问题
数值范围转换
243=0xF3 是在寄存器显示的值实际上这是一个负值
那么真实的整数值是 0xF3-256 = 243-256=-13
算法定点化
1======================= Q(16,13) 表示数值的位数是16bit,低13bit是属于小数 例子: 除以25,经过Q(16,15)之后的值是0x51F 计算:0.04*2^15 = 1310.72 取整后=1311=0x51F 2======================= Q(16,16)*Q(16,15) 后,小数点数15乘以小数点数16的结果是31位小数点 需要右移15bit,才能成为Q(16,16)的定点化 3====================== 12用3bit表示,12=3*4=3*2^2 4 舍入 ================== 四舍五入或向下向上取整: 四舍五入取整:round 朝零取整:fix 进1取整:ceil 向下取整:floor
有符号数扩展
INT16 wReal = 0xe96c; INT16 wImag = 0xfae2; UINT32 dTemp; dTemp = (wReal<<16) + wImag; = (0xe96c << 16) + 0xfae2 = 0xe96c0000 + 0xfffffae2 = 0x1e96dfae2 = 0xe96dfae2 由于wImag是有符号数,扩展成32bit就变成了0xfffffae2,导致相加以后出问题了。
移位先后造成比特误差精度问题
假设 x1=3,x2=2. 那么 (x1>>1)*x2 = 1*2 = 2 (x1*x2)>>1 = 6>>1 =3 移位放在最后做,精度会高一些
饱和问题
Q(16,14) 与 Q(16,13)相乘结果是Q(32,27) Q(32,27)右移1bit是Q(32,26) 右移1bit,去掉最右1bit。Q(32,27)变成Q(31,26)。 Q(31,26)高位补1bit,变成Q(32,26),结果是一样的。也可以不补这1bit