- Main Page
- Modules
- Data Structures
- Files
- Examples

- File List
- Globals

# arm_sqrt_q31.c

Go to the documentation of this file.

    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
    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, 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, 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     /* Fifth iteration */
    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     /* Seventh iteration */
    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     /* tenth iteration */
    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

All Data Structures Files Functions Variables Typedefs Enumerations Enumerator Defines