CMSIS DSP Library from CMSIS 2.0. See http://www.onarm.com/cmsis/ for full details
Dependents: K22F_DSP_Matrix_least_square BNO055-ELEC3810 1BNO055 ECE4180Project--Slave2 ... more
arm_sqrt_q31.c
00001 /* ---------------------------------------------------------------------- 00002 * Copyright (C) 2010 ARM Limited. All rights reserved. 00003 * 00004 * $Date: 29. November 2010 00005 * $Revision: V1.0.3 00006 * 00007 * Project: CMSIS DSP Library 00008 * Title: arm_sqrt_q31.c 00009 * 00010 * Description: Q31 square root function. 00011 * 00012 * Target Processor: Cortex-M4/Cortex-M3 00013 * 00014 * Version 1.0.3 2010/11/29 00015 * Re-organized the CMSIS folders and updated documentation. 00016 * 00017 * Version 1.0.2 2010/11/11 00018 * Documentation updated. 00019 * 00020 * Version 1.0.1 2010/10/05 00021 * Production release and review comments incorporated. 00022 * 00023 * Version 1.0.0 2010/09/20 00024 * Production release and review comments incorporated. 00025 * -------------------------------------------------------------------- */ 00026 00027 #include "arm_math.h" 00028 #include "arm_common_tables.h" 00029 00030 /** 00031 * @ingroup groupFastMath 00032 */ 00033 00034 /** 00035 * @addtogroup SQRT 00036 * @{ 00037 */ 00038 00039 /** 00040 * @brief Q31 square root function. 00041 * @param[in] in input value. The range of the input value is [0 +1) or 0x00000000 to 0x7FFFFFFF. 00042 * @param[out] *pOut square root of input value. 00043 * @return The function returns ARM_MATH_SUCCESS if input value is positive value or ARM_MATH_ARGUMENT_ERROR if 00044 * <code>in</code> is negative value and returns zero output for negative values. 00045 */ 00046 00047 arm_status arm_sqrt_q31( 00048 q31_t in, 00049 q31_t * pOut) 00050 { 00051 q63_t out; 00052 q63_t prevOut; 00053 q31_t oneByOut; 00054 uint32_t signBits; 00055 00056 00057 if(in > 0) 00058 { 00059 00060 /* run for ten iterations */ 00061 00062 /* Take initial guess as half of the input and first iteration */ 00063 out = (in >> 1) + 0x3FFFFFFF; 00064 00065 /* Calculation of reciprocal of out */ 00066 /* oneByOut contains reciprocal of out which is in 2.30 format 00067 and oneByOut should be upscaled by signBits */ 00068 signBits = arm_recip_q31((q31_t) out, &oneByOut, (q31_t*)armRecipTableQ31); 00069 00070 /* 0.5 * (out) */ 00071 out = out >> 1u; 00072 00073 /* prevOut = 0.5 * out + (in * (oneByOut << signBits))) */ 00074 prevOut = out + (((q31_t) (((q63_t) in * oneByOut) >> 32)) << signBits); 00075 00076 /* Third iteration */ 00077 signBits = arm_recip_q31((q31_t) prevOut, &oneByOut, (q31_t*)armRecipTableQ31); 00078 prevOut = prevOut >> 1u; 00079 out = prevOut + (((q31_t) (((q63_t) in * oneByOut) >> 32)) << signBits); 00080 00081 signBits = arm_recip_q31((q31_t) out, &oneByOut, (q31_t*)armRecipTableQ31); 00082 out = out >> 1u; 00083 prevOut = out + (((q31_t) (((q63_t) in * oneByOut) >> 32)) << signBits); 00084 00085 /* Fifth iteration */ 00086 signBits = arm_recip_q31((q31_t) prevOut, &oneByOut, (q31_t*)armRecipTableQ31); 00087 prevOut = prevOut >> 1u; 00088 out = prevOut + (((q31_t) (((q63_t) in * oneByOut) >> 32)) << signBits); 00089 00090 signBits = arm_recip_q31((q31_t) out, &oneByOut, (q31_t*)armRecipTableQ31); 00091 out = out >> 1u; 00092 prevOut = out + (((q31_t) (((q63_t) in * oneByOut) >> 32)) << signBits); 00093 00094 /* Seventh iteration */ 00095 signBits = arm_recip_q31((q31_t) prevOut, &oneByOut, (q31_t*)armRecipTableQ31); 00096 prevOut = prevOut >> 1u; 00097 out = prevOut + (((q31_t) (((q63_t) in * oneByOut) >> 32)) << signBits); 00098 00099 signBits = arm_recip_q31((q31_t) out, &oneByOut, (q31_t*)armRecipTableQ31); 00100 out = out >> 1u; 00101 prevOut = out + (((q31_t) (((q63_t) in * oneByOut) >> 32)) << signBits); 00102 00103 signBits = arm_recip_q31((q31_t) prevOut, &oneByOut, (q31_t*)armRecipTableQ31); 00104 prevOut = prevOut >> 1u; 00105 out = prevOut + (((q31_t) (((q63_t) in * oneByOut) >> 32)) << signBits); 00106 00107 /* tenth iteration */ 00108 signBits = arm_recip_q31((q31_t) out, &oneByOut, (q31_t*)armRecipTableQ31); 00109 out = out >> 1u; 00110 *pOut = out + (((q31_t) (((q63_t) in * oneByOut) >> 32)) << signBits); 00111 00112 return (ARM_MATH_SUCCESS); 00113 } 00114 else 00115 { 00116 *pOut = 0; 00117 return (ARM_MATH_ARGUMENT_ERROR); 00118 } 00119 00120 } 00121 00122 /** 00123 * @} end of SQRT group 00124 */
Generated on Tue Jul 12 2022 14:13:54 by 1.7.2