This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

Tmp1 = _IQmpy(v->K1,(v->ElecTheta - v->OldElecTheta));不同Q格式数相乘问题



// Q21 = Q21*(GLOBAL_Q-GLOBAL_Q)
Tmp1 = _IQmpy(v->K1,(v->ElecTheta - v->OldElecTheta));

K1是Q21格式的,后面是Q15格式,看IQMath文档_IQmpy是两个Q格式相同的数相乘的,请问不同Q格式的用这个相乘怎么理解??

  • ttyu

    如果是两个不同格式的数相乘, 如果使用IQmpy,需要将其转换成相同的Q格式。

    另外,不同Q格式的数相乘的理解,放大倍数不同的两个数相乘,最终结果你要考虑被放大多少倍了。比如2A  *  4B  = 8 AB, 即结果被放大了8倍。

    Eric

  • 但TI 给的例程里没有将其转换成相同的Q格式,而是直接用_IQmpy处理,这里还是不理解

  • 你好。

    Q格式的数相乘,实际上是两个整数相乘,被乘的两个数可以是不同的Q格式的。

    IQmath库函数没有开放源码,所以无法知道其具体怎么操作的,但是有一点,就是用_IQmpy做两数乘法时,至少其中一个数是Global_Q的,两乘得到的结果是另一个数的Q格式。因此,才有例程中// Q21 = Q21*(GLOBAL_Q-GLOBAL_Q)的注释说明。

    事实上,我们可以简单地想一想Q格式计算的过程。比如,我们做Q15*Q21,Q15为Global_Q,那么得到的中间结果应该是Q36(需要注意在做乘法时,必须考虑使结果不溢出,两个32位整数表示的Q格式数相乘,中间结果必然需要用64位整数存储,这样Q36也是有意义的)。然后,我们把中间结果右移Global_Q(15)位,你会发现得到了一个Q21的数。当然,此时这个数用32位整数已经能够表示了。

    Q格式计算两数据相乘的原理应该类似上述例子,IQmath的具体操作过程可能涉及一些优化而略有不同。

  • 明白了,谢谢!

  • 有不同格式相乘的函数IQmpyIQX