Closed. This question needs details or clarity。它当前不接受答案。
想改善这个问题吗?添加详细信息并通过editing this post阐明问题。
2年前关闭。
我正在使用英飞凌的XMC1300 MCU系列。对于我的应用程序,我需要找出一些数据的平方根。
以下是英飞凌提供的math lib api
这两个API接受并返回数据格式Q15和Q31,即只能表示[-1,1]范围。
假设我想找出的平方根
如何在[-1,1]范围内更改这些数字。
输入和输出的标准化需要做什么。
问候,
田中
Q15号码如何处理?所有数字均按
所以Sqrt(A / B)就是
因为0.0663 = 2172/32768。
Sqrt(B)是181。整数数学的最终结果是
对于较大的数字,您需要使用Q31除数:
*注:整数数学会将答案四舍五入到11。如果您想获得更好的舍入,则需要在进行除法运算之前检查15位。
想改善这个问题吗?添加详细信息并通过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位。