Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Fork of dsp by
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 19:55:44 by
1.7.2
