Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Fork of dsp by
arm_var_q15.c
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_var_q15.c 00009 * 00010 * Description: Variance of an array of Q15 type. 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 00029 /** 00030 * @ingroup groupStats 00031 */ 00032 00033 /** 00034 * @addtogroup variance 00035 * @{ 00036 */ 00037 00038 /** 00039 * @brief Variance of the elements of a Q15 vector. 00040 * @param[in] *pSrc points to the input vector 00041 * @param[in] blockSize length of the input vector 00042 * @param[out] *pResult variance value returned here 00043 * @return none. 00044 * 00045 * @details 00046 * <b>Scaling and Overflow Behavior:</b> 00047 * 00048 * \par 00049 * The function is implemented using a 64-bit internal accumulator. 00050 * The input is represented in 1.15 format. 00051 * Intermediate multiplication yields a 2.30 format, and this 00052 * result is added without saturation to a 64-bit accumulator in 34.30 format. 00053 * With 33 guard bits in the accumulator, there is no risk of overflow, and the 00054 * full precision of the intermediate multiplication is preserved. 00055 * Finally, the 34.30 result is truncated to 34.15 format by discarding the lower 00056 * 15 bits, and then saturated to yield a result in 1.15 format. 00057 * 00058 */ 00059 00060 #ifdef 0 00061 void arm_var_q15( 00062 q15_t * pSrc, 00063 uint32_t blockSize, 00064 q31_t * pResult) 00065 { 00066 q63_t sum = 0; /* Accumulator */ 00067 q31_t meanOfSquares, squareOfMean; /* Mean of square and square of mean */ 00068 q15_t mean; /* mean */ 00069 q31_t in; /* Input variable */ 00070 q15_t in1; /* Temporary variable */ 00071 uint32_t blkCnt; /* loop counter */ 00072 q15_t t; /* Temporary variable */ 00073 q15_t *pIn; /* Temporary pointer */ 00074 00075 pIn = pSrc; 00076 00077 /*loop Unrolling */ 00078 blkCnt = blockSize >> 2u; 00079 00080 /* First part of the processing with loop unrolling. Compute 4 outputs at a time. 00081 ** a second loop below computes the remaining 1 to 3 samples. */ 00082 while(blkCnt > 0u) 00083 { 00084 /* C = (A[0] * A[0] + A[1] * A[1] + ... + A[blockSize-1] * A[blockSize-1]) */ 00085 /* Compute Sum of squares of the input samples 00086 * and then store the result in a temporary variable, sum. */ 00087 in = *__SIMD32(pSrc)++; 00088 sum = __SMLALD(in, in, sum); 00089 in = *__SIMD32(pSrc)++; 00090 sum = __SMLALD(in, in, sum); 00091 00092 /* Decrement the loop counter */ 00093 blkCnt--; 00094 } 00095 00096 /* If the blockSize is not a multiple of 4, compute any remaining output samples here. 00097 ** No loop unrolling is used. */ 00098 blkCnt = blockSize % 0x4u; 00099 00100 while(blkCnt > 0u) 00101 { 00102 /* C = (A[0] * A[0] + A[1] * A[1] + ... + A[blockSize-1] * A[blockSize-1]) */ 00103 /* Compute Sum of squares of the input samples 00104 * and then store the result in a temporary variable, sum. */ 00105 in1 = *pSrc++; 00106 sum = __SMLALD(in1, in1, sum); 00107 00108 /* Decrement the loop counter */ 00109 blkCnt--; 00110 } 00111 00112 /* Compute Mean of squares of the input samples 00113 * and then store the result in a temporary variable, meanOfSquares. */ 00114 t = (q15_t) ((1.0f / (float32_t) (blockSize - 1u)) * 16384); 00115 sum = __SSAT((sum >> 15u), 16u); 00116 00117 meanOfSquares = (q31_t) ((sum * t) >> 14u); 00118 00119 /* Reset the accumulator */ 00120 sum = 0; 00121 00122 /*loop Unrolling */ 00123 blkCnt = blockSize >> 2u; 00124 00125 /* Reset the input working pointer */ 00126 pSrc = pIn; 00127 00128 /* First part of the processing with loop unrolling. Compute 4 outputs at a time. 00129 ** a second loop below computes the remaining 1 to 3 samples. */ 00130 while(blkCnt > 0u) 00131 { 00132 /* C = (A[0] + A[1] + A[2] + ... + A[blockSize-1]) */ 00133 /* Compute sum of all input values and then store the result in a temporary variable, sum. */ 00134 sum += *pSrc++; 00135 sum += *pSrc++; 00136 sum += *pSrc++; 00137 sum += *pSrc++; 00138 00139 /* Decrement the loop counter */ 00140 blkCnt--; 00141 } 00142 00143 /* If the blockSize is not a multiple of 4, compute any remaining output samples here. 00144 ** No loop unrolling is used. */ 00145 blkCnt = blockSize % 0x4u; 00146 00147 while(blkCnt > 0u) 00148 { 00149 /* C = (A[0] + A[1] + A[2] + ... + A[blockSize-1]) */ 00150 /* Compute sum of all input values and then store the result in a temporary variable, sum. */ 00151 sum += *pSrc++; 00152 00153 /* Decrement the loop counter */ 00154 blkCnt--; 00155 } 00156 00157 /* Compute mean of all input values */ 00158 t = (q15_t) ((1.0f / (float32_t) (blockSize * (blockSize - 1u))) * 32768); 00159 mean = __SSAT(sum, 16u); 00160 00161 /* Compute square of mean */ 00162 squareOfMean = ((q31_t) mean * mean) >> 15; 00163 squareOfMean = (q31_t) (((q63_t) squareOfMean * t) >> 15); 00164 00165 /* Compute variance and then store the result to the destination */ 00166 *pResult = (meanOfSquares - squareOfMean); 00167 00168 } 00169 00170 #endif 00171 00172 /** 00173 * @} end of variance group 00174 */
Generated on Tue Jul 12 2022 19:55:44 by
1.7.2
