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
00028
00029
00030 #include "arm_math.h"
00031 #include "arm_common_tables.h"
00032
00033
00051 arm_status arm_sqrt_q15(
00052 q15_t in,
00053 q15_t * pOut)
00054 {
00055 q31_t prevOut;
00056 q15_t oneByOut;
00057 uint32_t sign_bits;
00058
00059 #ifndef ARM_MATH_CM0
00060
00061
00062
00063 q31_t out;
00064
00065 if(in > 0)
00066 {
00067
00068
00069
00070 out = ((q31_t) in >> 1u) + 0x3FFF;
00071
00072
00073
00074
00075 sign_bits = arm_recip_q15((q15_t) out, &oneByOut, armRecipTableQ15);
00076
00077
00078 out = out >> 1u;
00079
00080 prevOut = out + (((q15_t) (((q31_t) in * oneByOut) >> 16)) << sign_bits);
00081
00082
00083 sign_bits = arm_recip_q15((q15_t) prevOut, &oneByOut, armRecipTableQ15);
00084 prevOut = prevOut >> 1u;
00085 out = prevOut + (((q15_t) (((q31_t) in * oneByOut) >> 16)) << sign_bits);
00086
00087 sign_bits = arm_recip_q15((q15_t) out, &oneByOut, armRecipTableQ15);
00088 out = out >> 1u;
00089 prevOut = out + (((q15_t) (((q31_t) in * oneByOut) >> 16)) << sign_bits);
00090
00091
00092 sign_bits = arm_recip_q15((q15_t) prevOut, &oneByOut, armRecipTableQ15);
00093 prevOut = prevOut >> 1u;
00094 out = prevOut + (((q15_t) (((q31_t) in * oneByOut) >> 16)) << sign_bits);
00095
00096 sign_bits = arm_recip_q15((q15_t) out, &oneByOut, armRecipTableQ15);
00097 out = out >> 1u;
00098 prevOut = out + (((q15_t) (((q31_t) in * oneByOut) >> 16)) << sign_bits);
00099
00100
00101 sign_bits = arm_recip_q15((q15_t) prevOut, &oneByOut, armRecipTableQ15);
00102 prevOut = prevOut >> 1u;
00103 out = prevOut + (((q15_t) (((q31_t) in * oneByOut) >> 16)) << sign_bits);
00104
00105 sign_bits = arm_recip_q15((q15_t) out, &oneByOut, armRecipTableQ15);
00106 out = out >> 1u;
00107 prevOut = out + (((q15_t) (((q31_t) in * oneByOut) >> 16)) << sign_bits);
00108
00109 sign_bits = arm_recip_q15((q15_t) prevOut, &oneByOut, armRecipTableQ15);
00110 prevOut = prevOut >> 1u;
00111 out = prevOut + (((q15_t) (((q31_t) in * oneByOut) >> 16)) << sign_bits);
00112
00113
00114 sign_bits = arm_recip_q15((q15_t) out, &oneByOut, armRecipTableQ15);
00115 out = out >> 1u;
00116 *pOut = out + (((q15_t) (((q31_t) in * oneByOut) >> 16)) << sign_bits);
00117
00118 return (ARM_MATH_SUCCESS);
00119 }
00120
00121 #else
00122
00123
00124
00125 q31_t out, loopVar;
00126 if(in > 0)
00127 {
00128
00129
00130
00131 out = ((q31_t) in >> 1u) + 0x3FFF;
00132
00133
00134
00135
00136
00137 sign_bits = arm_recip_q15((q15_t) out, &oneByOut, armRecipTableQ15);
00138
00139
00140 out = out >> 1u;
00141
00142 prevOut = out + (((q15_t) (((q31_t) in * oneByOut) >> 16)) << sign_bits);
00143
00144
00145
00146 for (loopVar = 1; loopVar <= 8; loopVar++)
00147 {
00148
00149 sign_bits = arm_recip_q15((q15_t) prevOut, &oneByOut, armRecipTableQ15);
00150
00151 prevOut = prevOut >> 1u;
00152
00153 out =
00154 prevOut + (((q15_t) (((q31_t) in * oneByOut) >> 16)) << sign_bits);
00155
00156 prevOut = out;
00157
00158 }
00159
00160 *pOut = prevOut;
00161
00162 return (ARM_MATH_SUCCESS);
00163 }
00164
00165 #endif
00166
00167 else
00168 {
00169
00170 *pOut = 0;
00171 return (ARM_MATH_ARGUMENT_ERROR);
00172 }
00173
00174 }
00175