Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027 #include "arm_math.h"
00028 #include "arm_common_tables.h"
00029
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
00061
00062
00063 out = (in >> 1) + 0x3FFFFFFF;
00064
00065
00066
00067
00068 signBits = arm_recip_q31((q31_t) out, &oneByOut, armRecipTableQ31);
00069
00070
00071 out = out >> 1u;
00072
00073
00074 prevOut = out + (((q31_t) (((q63_t) in * oneByOut) >> 32)) << signBits);
00075
00076
00077 signBits = arm_recip_q31((q31_t) prevOut, &oneByOut, 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, armRecipTableQ31);
00082 out = out >> 1u;
00083 prevOut = out + (((q31_t) (((q63_t) in * oneByOut) >> 32)) << signBits);
00084
00085
00086 signBits = arm_recip_q31((q31_t) prevOut, &oneByOut, 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, armRecipTableQ31);
00091 out = out >> 1u;
00092 prevOut = out + (((q31_t) (((q63_t) in * oneByOut) >> 32)) << signBits);
00093
00094
00095 signBits = arm_recip_q31((q31_t) prevOut, &oneByOut, 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, 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, armRecipTableQ31);
00104 prevOut = prevOut >> 1u;
00105 out = prevOut + (((q31_t) (((q63_t) in * oneByOut) >> 32)) << signBits);
00106
00107
00108 signBits = arm_recip_q31((q31_t) out, &oneByOut, 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