CMSIS DSP Library from CMSIS 2.0. See http://www.onarm.com/cmsis/ for full details
Dependents: K22F_DSP_Matrix_least_square BNO055-ELEC3810 1BNO055 ECE4180Project--Slave2 ... more
Diff: src/Cortex-M4-M3/StatisticsFunctions/arm_min_q7.c
- Revision:
- 0:1014af42efd9
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/Cortex-M4-M3/StatisticsFunctions/arm_min_q7.c Thu Mar 10 15:07:50 2011 +0000 @@ -0,0 +1,156 @@ +/* ---------------------------------------------------------------------- +* Copyright (C) 2010 ARM Limited. All rights reserved. +* +* $Date: 29. November 2010 +* $Revision: V1.0.3 +* +* Project: CMSIS DSP Library +* Title: arm_min_q7.c +* +* Description: Processing function for the Q7 Minimum. +* +* Target Processor: Cortex-M4/Cortex-M3 +* +* Version 1.0.3 2010/11/29 +* Re-organized the CMSIS folders and updated documentation. +* +* Version 1.0.2 2010/11/11 +* Documentation updated. +* +* Version 1.0.1 2010/10/05 +* Production release and review comments incorporated. +* +* Version 1.0.0 2010/09/20 +* Production release and review comments incorporated. +* ---------------------------------------------------------------------------- */ + +#include "arm_math.h" + +/** + * @ingroup groupStats + */ + +/** + * @addtogroup Min + * @{ + */ + + +/** + * @brief Minimum value of a Q7 vector. + * @param[in] *pSrc points to the input vector + * @param[in] blockSize length of the input vector + * @param[out] *pResult minimum value returned here + * @param[out] *pIndex index of minimum value returned here + * @return none. + * + */ + +void arm_min_q7( + q7_t * pSrc, + uint32_t blockSize, + q7_t * pResult, + uint32_t * pIndex) +{ + q7_t minVal, minVal1, minVal2, res, x0, x1; /* Temporary variables to store the output value. */ + uint32_t blkCnt, indx, index1, index2, index3, indxMod; /* loop counter */ + + /* Initialise the index value to zero. */ + indx = 0u; + + /* Load first input value that act as reference value for comparision */ + res = *pSrc++; + + /* Loop over blockSize number of values */ + blkCnt = (blockSize - 1u) >> 2u; + + while(blkCnt > 0u) + { + indxMod = blockSize - (blkCnt * 4u); + + /* Load two input values for comparision */ + x0 = *pSrc++; + x1 = *pSrc++; + + if(x0 > x1) + { + /* Update the minimum value and its index */ + minVal1 = x1; + index1 = indxMod + 1u; + } + else + { + /* Update the minimum value and its index */ + minVal1 = x0; + index1 = indxMod; + } + + /* Load two input values for comparision */ + x0 = *pSrc++; + x1 = *pSrc++; + + if(x0 > x1) + { + /* Update the minimum value and its index */ + minVal2 = x1; + index2 = indxMod + 3u; + } + else + { + /* Update the minimum value and its index */ + minVal2 = x0; + index2 = indxMod + 2u; + } + + if(minVal1 > minVal2) + { + /* Update the minimum value and its index */ + minVal = minVal2; + index3 = index2; + } + else + { + /* Update the minimum value and its index */ + minVal = minVal1; + index3 = index1; + } + + if(res > minVal) + { + /* Update the minimum value and its index */ + res = minVal; + indx = index3; + } + + /* Decrement the loop counter */ + blkCnt--; + + } + + blkCnt = (blockSize - 1u) % 0x04u; + + while(blkCnt > 0u) + { + /* Initialize minVal to the next consecutive values one by one */ + minVal = *pSrc++; + + /* compare for the minimum value */ + if(res > minVal) + { + /* Update the minimum value and its index */ + res = minVal; + indx = blockSize - blkCnt; + } + + /* Decrement the loop counter */ + blkCnt--; + } + + /* Store the minimum value and its index into destination pointers */ + *pResult = res; + *pIndex = indx; +} + +/** + * @} end of Min group + */