数值范围转换
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=0x51F2=======================Q(16,16)*Q(16,15) 后,小数点数15乘以小数点数16的结果是31位小数点需要右移15bit,才能成为Q(16,16)的定点化3======================12用3bit表示,12=3*4=3*2^24 舍入 ==================四舍五入或向下向上取整:四舍五入取整: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