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

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers arm_sqrt_q31.c Source File

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  */