关于定点DSP进行浮点运算的问题

weiaa1911   2008-3-29 10:36 楼主
在用定点DSP进行浮点运算时采用Q值定标,而DSP如何实现Q值的?比如在下边这个程序中
设x=3.0,y=3.1,则浮点运算结果为z=x-y=3.0-3.1=-0.1;
Qx=13,Qy=13,Qz=15,则定点减法为:
x=24576;y=25295;
temp=25395;
temp=x-temp=24576-25395=-819;
因为Qx<Qz,故 z=(int)(-819<<2)=-3276。由于z的Q值为15,所以定点值z=-3276即为浮点值z=-3276/32768=-0.1。
在得出运算结果z的时候,DSP如何知道x是Q13的?它是否会将QX=24576按照Q15的格式来处理?如果是这样,我们在程序中应该怎样处理才能得到正确的结果?

回复评论 (11)

定点计算

所有的数据在计算的时候必须定好标,注意数据取值范围。
DSP在计算的时候不会知道你的数值是什么格式的,只能进行整型的+-*/,计算的结果只能自己保存的时候注意转换成相应的格式喽。
个人认为!
点赞  2008-3-29 11:56
那样肯定不对~
比如Q13格式的数据,DSP会当作Q15来处理,得到的结果当然不一样!
我是这样处理的~

如:A=Q14,B=Q15,Z=Q14
long int temp
temp= A<<1;
temp=temp+B;
Z=temp>>1;

但是不知道为什么出来的结果总是不对!人都要崩溃了~~

点赞  2008-3-30 10:44
对于定点DSP,它本身是不知道你使用的什么格式的,都一律按照int的处理。你必须自己设定好Q值,输出的时候注意浮点的位置。我一个月前才做过相关的C programming,port code from ADSP to C5509A~
点赞  2008-4-12 05:36
First I assume by saying Q14 here you mean Q2.14 fractional format.
如果只是拿这个例子来说,最后得到的C (Q14)其实是rounding过后的值,因为它的精度低于B (Q15)。既然如此,我觉得可以先将B进行四舍五入变成Q14的format (either unbiased rounding or biased rounding dependent on your application),再进行加减乘除运算,应该就没问题了。
点赞  2008-4-12 07:38
我特意查了资料,觉得两个不同Q的数值做加减运算时这样处理是允许的,不知道你的结果有什么不对?是误差太大,还是根本不是你要的结果?
点赞  2008-4-12 08:30
temp 是 long 类型的,也就是32位的.

两个Q15的数相加还是Q15位的数.其结果再怎么样也不可能超出32位,怎么会溢出呢?
点赞  2008-4-12 13:34
我想请教一下关于Q格式运算中的\"rounding\"与\"saturation\"这两个术语的正确中文翻译.

因为这是在处理溢出和饱和是经常出现的词,但我个人一直无法准确把握它们的含义.

谢谢.
点赞  2008-4-13 00:33
我的理解是这样的:

若DSP能处理16位的定点数,那么Q15的运算范围在(-1≤x≤0.9999695)范围内,也就是说

Q15能处理的数值的最大绝对值不超过1.所以两个数相加后极有可能溢出.但是对于long类型的

Q15,它能处理的最大绝对值应该为(-32768≤x≤32767),所以把16位的Q15转换为32位的

Q15格式进行+/-运算应该不会溢出.

不知道这样理解正确否?

请指点.
点赞  2008-4-13 00:55

Q运算如果想保证精度就要用Q值大的格式运算,如果想防止溢出就用Q值小的格式运算.如果想

要防溢又想要保证精度,那么就要事先估计运算数据的最大值.要提高运算的速度,最好能采用满足

精度要求的低Q位运算.

能否指点一下\"rounding\"在Q运算中的含义吗?

点赞  2008-4-13 02:20
呵呵,虽然我已经顺利解决问题了,不过看了各位的发言,仍然受益非浅,先谢谢大家了,希望大家能够相互提高`
点赞  2008-4-15 11:54
嗯,学习了
点赞  2008-5-27 08:07
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复