Closed. This question needs details or clarity。它当前不接受答案。
                            
                        
                    
                
                            
                                
                
                        
                            
                        
                    
                        
                            想改善这个问题吗?添加详细信息并通过editing this post阐明问题。
                        
                        2年前关闭。
                                                                                            
                
        
我正在使用英飞凌的XMC1300 MCU系列。对于我的应用程序,我需要找出一些数据的平方根。

以下是英飞凌提供的math lib api

int16_t XMC_MATH_CORDIC_Q15_Sqrt(int16_t x)
int32_t XMC_MATH_CORDIC_Q31_Sqrt(int32_t x)


这两个API接受并返回数据格式Q15和Q31,即只能表示[-1,1]范围。

假设我想找出的平方根

144
200
1000
34567
50000


如何在[-1,1]范围内更改这些数字。

输入和输出的标准化需要做什么。

问候,
田中

最佳答案

您不能直接以Q15或Q31格式表示144或50000。如您所述,这些格式是-1和1之间数字的定点表示形式。

因此,剩下的问题是基本的数学问题。
我们可以利用以下事实


  sqrt(A / B)= sqrt(A)/ sqrt(B)


让我们做一个例子,其中您的值A = 144
将B设置为Q31除数B = 0x7FFFF = 32768

A/B = 0.00439`
Sqrt(A/B) = 0.0663
Sqrt(B) = Sqrt(32768) = 181.02
Sqrt(A) = Sqrt(A/B)*Sqrt(B) = 0.0663 * 181.02 = 12.


Q15号码如何处理?所有数字均按B缩放。
所以Sqrt(A / B)就是XMC_MATH_CORDIC_Q15_Sqrt(A) //=> 2172
因为0.0663 = 2172/32768。

Sqrt(B)是181。整数数学的最终结果是181 * 2172 / 32768 = 12 *

对于较大的数字,您需要使用Q31除数:
0x7fffFFFF = 2147483647

*注:整数数学会将答案四舍五入到11。如果您想获得更好的舍入,则需要在进行除法运算之前检查15位。

07-28 02:54
查看更多