http://hi.baidu.com/fishandbear/blog/item/80262f734abd3c1c8601b052.html 这是我在网上搜到的关于DSP定点算数运算,刚开始学习有些不懂,以下是我从中摘抄的一部分,有 ? 的地方请大家帮指导一下!
加法/减法运算的C语言定点摸拟 设浮点加法运算的表达式为: float x,y,z; z=x+y; 将浮点加法/减法转化为定点加法/减法时最重要的一点就是必须保证两个操作数的定标 temp=x+temp; z=temp>>(Qx-Qz),若Qx>=Qz z=temp<<(Qz-Qx),若Qx<=Qz 例1.4结果超过16位的定点加法 设x=l5000,y=20000,则浮点运算值为z=x+y=35000,显然z>32767,因此 Qx=1,Qy=0,Qz=0,则定点加法为:(Qx=1,Qy=0,Qz=0???为什么) x=30000;y=20000; temp=20000<<1=40000; (????) temp=temp+x=40000+30000=70000; z=70000L>>1=35000;(???这样算出来的结果不还是35000吗?) 因为z的Q值为0,所以定点值z=35000就是浮点值,这里z是一个长整型数。当加法或加法的结果超过16位表示范围时,如果程序员事先能够了解到这种情况,并且需要保持运算精度时,则必须保持32位结果。如果程序中是按照16位数进行运算的,则超过16位实际上就是出现了溢出。如果不采取适当的措施,则数据溢出会导致运算精度的严重恶化。一般的定点DSP芯片都没有溢出保护功能,当溢出保护功能有效时,一旦出现溢出,则累加器ACC的结果为最大的饱和值(上溢为7FFFH,下溢为8001H),从而达到防止溢出引起精度严重恶化的目的。 |