TI中文支持网
TI专业的中文技术问题搜集分享网站

iqmath问题

几个IQMATH的问题,请教一下!
1、lq10InvTemp.lData = (_IQ10mpy(g_u32ACDynamicuse, g_u32ACDynamicuse) >> 10); 上面的语句是整段程序里的一条,g_u32ACDynamicuse是左移10位之后 的数值,两个相同的数值相乘之后 ,右移了10位,是等效于 最终的结果lq10InvTemp.lData左移了10位么?另,相乘之后,是否需要考虑结果超过IQ10的范围呢?
2、#define IQ10_OVPFC_ADC_FACTOR ((INT32)13653)                     // 1/5.12019/15 <<20 = 13653
lCalTemp.lData = _IQ10mpy(s_i32AdcSumPfcOVp,IQ10_OVPFC_ADC_FACTOR);
请问以上语句,s_i32AdcSumPfcOVp的数值范围在0~4096之间 如果用 _IQ10mpy格式,与IQ10_OVPFC_ADC_FACTOR相乘,结果已经非常大了,是不是已经超出IQ10的范围了,这个处理过程是怎么样的呢?谢谢

Green Deng:使用_IQ10mpy()时,假设它的函数参数是_IQ10值。IQ10值的范围是[-2097152,2097151.999023437]。
本质上,你是用IQ10格式乘以2个数字,结果也将是IQ10格式。所以不需要改变结果。如果根据你使用的“G_u32acdynamic”的范围,你认为将其平方会超过iq10的范围,那么就需要考虑这一点。在'iq10mpy'之后移位将不起作用,那样太晚了。例如,如果将-2097152*-2097152(2^21*2^21=2^42)相乘,就会得到一个非常大的正数,它在任何32位的Q格式中都不能表示。所以,通常你要注意应用程序中存在什么样的数据范围,并相应地做出决定。一般来说,如果要执行此类乘法,那么在选择q格式时,最好允许较大的整数范围。或者更改结果的q格式。另一种方法是使结果饱和,_IQmpy做不了饱和,但是_IQrsmpy() 可以做四舍五入和饱和。

赞(0)
未经允许不得转载:TI中文支持网 » iqmath问题
分享到: 更多 (0)