diff options
Diffstat (limited to 'Drivers/CMSIS/DSP/Source/ComplexMathFunctions/arm_cmplx_mag_q31.c')
-rw-r--r-- | Drivers/CMSIS/DSP/Source/ComplexMathFunctions/arm_cmplx_mag_q31.c | 165 |
1 files changed, 61 insertions, 104 deletions
diff --git a/Drivers/CMSIS/DSP/Source/ComplexMathFunctions/arm_cmplx_mag_q31.c b/Drivers/CMSIS/DSP/Source/ComplexMathFunctions/arm_cmplx_mag_q31.c index 830ecb9ba..873e566cc 100644 --- a/Drivers/CMSIS/DSP/Source/ComplexMathFunctions/arm_cmplx_mag_q31.c +++ b/Drivers/CMSIS/DSP/Source/ComplexMathFunctions/arm_cmplx_mag_q31.c @@ -3,13 +3,13 @@ * Title: arm_cmplx_mag_q31.c * Description: Q31 complex magnitude * - * $Date: 27. January 2017 - * $Revision: V.1.5.1 + * $Date: 18. March 2019 + * $Revision: V1.6.0 * * Target Processor: Cortex-M cores * -------------------------------------------------------------------- */ /* - * Copyright (C) 2010-2017 ARM Limited or its affiliates. All rights reserved. + * Copyright (C) 2010-2019 ARM Limited or its affiliates. All rights reserved. * * SPDX-License-Identifier: Apache-2.0 * @@ -29,145 +29,102 @@ #include "arm_math.h" /** - * @ingroup groupCmplxMath + @ingroup groupCmplxMath */ /** - * @addtogroup cmplx_mag - * @{ + @addtogroup cmplx_mag + @{ */ /** - * @brief Q31 complex magnitude - * @param *pSrc points to the complex input vector - * @param *pDst points to the real output vector - * @param numSamples number of complex samples in the input vector - * @return none. - * - * <b>Scaling and Overflow Behavior:</b> - * \par - * The function implements 1.31 by 1.31 multiplications and finally output is converted into 2.30 format. - * Input down scaling is not required. + @brief Q31 complex magnitude. + @param[in] pSrc points to input vector + @param[out] pDst points to output vector + @param[in] numSamples number of samples in each vector + @return none + + @par Scaling and Overflow Behavior + The function implements 1.31 by 1.31 multiplications and finally output is converted into 2.30 format. + Input down scaling is not required. */ void arm_cmplx_mag_q31( - q31_t * pSrc, - q31_t * pDst, - uint32_t numSamples) + const q31_t * pSrc, + q31_t * pDst, + uint32_t numSamples) { - q31_t real, imag; /* Temporary variables to hold input values */ - q31_t acc0, acc1; /* Accumulators */ - uint32_t blkCnt; /* loop counter */ - -#if defined (ARM_MATH_DSP) - - /* Run the below code for Cortex-M4 and Cortex-M3 */ - q31_t real1, real2, imag1, imag2; /* Temporary variables to hold input values */ - q31_t out1, out2, out3, out4; /* Accumulators */ - q63_t mul1, mul2, mul3, mul4; /* Temporary variables */ + uint32_t blkCnt; /* Loop counter */ + q31_t real, imag; /* Temporary input variables */ + q31_t acc0, acc1; /* Accumulators */ +#if defined (ARM_MATH_LOOPUNROLL) - /*loop Unrolling */ + /* Loop unrolling: Compute 4 outputs at a time */ blkCnt = numSamples >> 2U; - /* First part of the processing with loop unrolling. Compute 4 outputs at a time. - ** a second loop below computes the remaining 1 to 3 samples. */ while (blkCnt > 0U) { - /* read complex input from source buffer */ - real1 = pSrc[0]; - imag1 = pSrc[1]; - real2 = pSrc[2]; - imag2 = pSrc[3]; - - /* calculate power of input values */ - mul1 = (q63_t) real1 *real1; - mul2 = (q63_t) imag1 *imag1; - mul3 = (q63_t) real2 *real2; - mul4 = (q63_t) imag2 *imag2; - - /* get the result to 3.29 format */ - out1 = (q31_t) (mul1 >> 33); - out2 = (q31_t) (mul2 >> 33); - out3 = (q31_t) (mul3 >> 33); - out4 = (q31_t) (mul4 >> 33); - - /* add real and imaginary accumulators */ - out1 = out1 + out2; - out3 = out3 + out4; - - /* read complex input from source buffer */ - real1 = pSrc[4]; - imag1 = pSrc[5]; - real2 = pSrc[6]; - imag2 = pSrc[7]; - - /* calculate square root */ - arm_sqrt_q31(out1, &pDst[0]); - - /* calculate power of input values */ - mul1 = (q63_t) real1 *real1; - - /* calculate square root */ - arm_sqrt_q31(out3, &pDst[1]); - - /* calculate power of input values */ - mul2 = (q63_t) imag1 *imag1; - mul3 = (q63_t) real2 *real2; - mul4 = (q63_t) imag2 *imag2; - - /* get the result to 3.29 format */ - out1 = (q31_t) (mul1 >> 33); - out2 = (q31_t) (mul2 >> 33); - out3 = (q31_t) (mul3 >> 33); - out4 = (q31_t) (mul4 >> 33); - - /* add real and imaginary accumulators */ - out1 = out1 + out2; - out3 = out3 + out4; - - /* calculate square root */ - arm_sqrt_q31(out1, &pDst[2]); - - /* increment destination by 8 to process next samples */ - pSrc += 8U; - - /* calculate square root */ - arm_sqrt_q31(out3, &pDst[3]); - - /* increment destination by 4 to process next samples */ - pDst += 4U; - - /* Decrement the loop counter */ + /* C[0] = sqrt(A[0] * A[0] + A[1] * A[1]) */ + + real = *pSrc++; + imag = *pSrc++; + acc0 = (q31_t) (((q63_t) real * real) >> 33); + acc1 = (q31_t) (((q63_t) imag * imag) >> 33); + + /* store result in 2.30 format in destination buffer. */ + arm_sqrt_q31(acc0 + acc1, pDst++); + + real = *pSrc++; + imag = *pSrc++; + acc0 = (q31_t) (((q63_t) real * real) >> 33); + acc1 = (q31_t) (((q63_t) imag * imag) >> 33); + arm_sqrt_q31(acc0 + acc1, pDst++); + + real = *pSrc++; + imag = *pSrc++; + acc0 = (q31_t) (((q63_t) real * real) >> 33); + acc1 = (q31_t) (((q63_t) imag * imag) >> 33); + arm_sqrt_q31(acc0 + acc1, pDst++); + + real = *pSrc++; + imag = *pSrc++; + acc0 = (q31_t) (((q63_t) real * real) >> 33); + acc1 = (q31_t) (((q63_t) imag * imag) >> 33); + arm_sqrt_q31(acc0 + acc1, pDst++); + + /* Decrement loop counter */ blkCnt--; } - /* If the numSamples is not a multiple of 4, compute any remaining output samples here. - ** No loop unrolling is used. */ + /* Loop unrolling: Compute remaining outputs */ blkCnt = numSamples % 0x4U; #else - /* Run the below code for Cortex-M0 */ + /* Initialize blkCnt with number of samples */ blkCnt = numSamples; -#endif /* #if defined (ARM_MATH_DSP) */ +#endif /* #if defined (ARM_MATH_LOOPUNROLL) */ while (blkCnt > 0U) { /* C[0] = sqrt(A[0] * A[0] + A[1] * A[1]) */ + real = *pSrc++; imag = *pSrc++; acc0 = (q31_t) (((q63_t) real * real) >> 33); acc1 = (q31_t) (((q63_t) imag * imag) >> 33); - /* store the result in 2.30 format in the destination buffer. */ + + /* store result in 2.30 format in destination buffer. */ arm_sqrt_q31(acc0 + acc1, pDst++); - /* Decrement the loop counter */ + /* Decrement loop counter */ blkCnt--; } + } /** - * @} end of cmplx_mag group + @} end of cmplx_mag group */ |