The CMSIS DSP 5 library

Dependents:   Nucleo-Heart-Rate ejercicioVrms2 PROYECTOFINAL ejercicioVrms ... more

Committer:
xorjoep
Date:
Wed Jun 20 11:21:31 2018 +0000
Revision:
1:24714b45cd1b
The newest version of the CMSIS library

Who changed what in which revision?

UserRevisionLine numberNew contents of line
xorjoep 1:24714b45cd1b 1 /* ----------------------------------------------------------------------
xorjoep 1:24714b45cd1b 2 * Project: CMSIS DSP Library
xorjoep 1:24714b45cd1b 3 * Title: arm_var_f32.c
xorjoep 1:24714b45cd1b 4 * Description: Variance of the elements of a floating-point vector
xorjoep 1:24714b45cd1b 5 *
xorjoep 1:24714b45cd1b 6 * $Date: 27. January 2017
xorjoep 1:24714b45cd1b 7 * $Revision: V.1.5.1
xorjoep 1:24714b45cd1b 8 *
xorjoep 1:24714b45cd1b 9 * Target Processor: Cortex-M cores
xorjoep 1:24714b45cd1b 10 * -------------------------------------------------------------------- */
xorjoep 1:24714b45cd1b 11 /*
xorjoep 1:24714b45cd1b 12 * Copyright (C) 2010-2017 ARM Limited or its affiliates. All rights reserved.
xorjoep 1:24714b45cd1b 13 *
xorjoep 1:24714b45cd1b 14 * SPDX-License-Identifier: Apache-2.0
xorjoep 1:24714b45cd1b 15 *
xorjoep 1:24714b45cd1b 16 * Licensed under the Apache License, Version 2.0 (the License); you may
xorjoep 1:24714b45cd1b 17 * not use this file except in compliance with the License.
xorjoep 1:24714b45cd1b 18 * You may obtain a copy of the License at
xorjoep 1:24714b45cd1b 19 *
xorjoep 1:24714b45cd1b 20 * www.apache.org/licenses/LICENSE-2.0
xorjoep 1:24714b45cd1b 21 *
xorjoep 1:24714b45cd1b 22 * Unless required by applicable law or agreed to in writing, software
xorjoep 1:24714b45cd1b 23 * distributed under the License is distributed on an AS IS BASIS, WITHOUT
xorjoep 1:24714b45cd1b 24 * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
xorjoep 1:24714b45cd1b 25 * See the License for the specific language governing permissions and
xorjoep 1:24714b45cd1b 26 * limitations under the License.
xorjoep 1:24714b45cd1b 27 */
xorjoep 1:24714b45cd1b 28
xorjoep 1:24714b45cd1b 29 #include "arm_math.h"
xorjoep 1:24714b45cd1b 30
xorjoep 1:24714b45cd1b 31 /**
xorjoep 1:24714b45cd1b 32 * @ingroup groupStats
xorjoep 1:24714b45cd1b 33 */
xorjoep 1:24714b45cd1b 34
xorjoep 1:24714b45cd1b 35 /**
xorjoep 1:24714b45cd1b 36 * @defgroup variance Variance
xorjoep 1:24714b45cd1b 37 *
xorjoep 1:24714b45cd1b 38 * Calculates the variance of the elements in the input vector.
xorjoep 1:24714b45cd1b 39 * The underlying algorithm used is the direct method sometimes referred to as the two-pass method:
xorjoep 1:24714b45cd1b 40 *
xorjoep 1:24714b45cd1b 41 * <pre>
xorjoep 1:24714b45cd1b 42 * Result = sum(element - meanOfElements)^2) / numElement - 1
xorjoep 1:24714b45cd1b 43 *
xorjoep 1:24714b45cd1b 44 * where, meanOfElements = ( pSrc[0] * pSrc[0] + pSrc[1] * pSrc[1] + ... + pSrc[blockSize-1] ) / blockSize
xorjoep 1:24714b45cd1b 45 *
xorjoep 1:24714b45cd1b 46 * </pre>
xorjoep 1:24714b45cd1b 47 *
xorjoep 1:24714b45cd1b 48 * There are separate functions for floating point, Q31, and Q15 data types.
xorjoep 1:24714b45cd1b 49 */
xorjoep 1:24714b45cd1b 50
xorjoep 1:24714b45cd1b 51 /**
xorjoep 1:24714b45cd1b 52 * @addtogroup variance
xorjoep 1:24714b45cd1b 53 * @{
xorjoep 1:24714b45cd1b 54 */
xorjoep 1:24714b45cd1b 55
xorjoep 1:24714b45cd1b 56
xorjoep 1:24714b45cd1b 57 /**
xorjoep 1:24714b45cd1b 58 * @brief Variance of the elements of a floating-point vector.
xorjoep 1:24714b45cd1b 59 * @param[in] *pSrc points to the input vector
xorjoep 1:24714b45cd1b 60 * @param[in] blockSize length of the input vector
xorjoep 1:24714b45cd1b 61 * @param[out] *pResult variance value returned here
xorjoep 1:24714b45cd1b 62 * @return none.
xorjoep 1:24714b45cd1b 63 */
xorjoep 1:24714b45cd1b 64
xorjoep 1:24714b45cd1b 65 void arm_var_f32(
xorjoep 1:24714b45cd1b 66 float32_t * pSrc,
xorjoep 1:24714b45cd1b 67 uint32_t blockSize,
xorjoep 1:24714b45cd1b 68 float32_t * pResult)
xorjoep 1:24714b45cd1b 69 {
xorjoep 1:24714b45cd1b 70 float32_t fMean, fValue;
xorjoep 1:24714b45cd1b 71 uint32_t blkCnt; /* loop counter */
xorjoep 1:24714b45cd1b 72 float32_t * pInput = pSrc;
xorjoep 1:24714b45cd1b 73 float32_t sum = 0.0f;
xorjoep 1:24714b45cd1b 74 float32_t fSum = 0.0f;
xorjoep 1:24714b45cd1b 75 #if defined(ARM_MATH_DSP)
xorjoep 1:24714b45cd1b 76 float32_t in1, in2, in3, in4;
xorjoep 1:24714b45cd1b 77 #endif
xorjoep 1:24714b45cd1b 78
xorjoep 1:24714b45cd1b 79 if (blockSize <= 1U)
xorjoep 1:24714b45cd1b 80 {
xorjoep 1:24714b45cd1b 81 *pResult = 0;
xorjoep 1:24714b45cd1b 82 return;
xorjoep 1:24714b45cd1b 83 }
xorjoep 1:24714b45cd1b 84
xorjoep 1:24714b45cd1b 85 #if defined(ARM_MATH_DSP)
xorjoep 1:24714b45cd1b 86 /* Run the below code for Cortex-M4 and Cortex-M7 */
xorjoep 1:24714b45cd1b 87
xorjoep 1:24714b45cd1b 88 /*loop Unrolling */
xorjoep 1:24714b45cd1b 89 blkCnt = blockSize >> 2U;
xorjoep 1:24714b45cd1b 90
xorjoep 1:24714b45cd1b 91 /* First part of the processing with loop unrolling. Compute 4 outputs at a time.
xorjoep 1:24714b45cd1b 92 ** a second loop below computes the remaining 1 to 3 samples. */
xorjoep 1:24714b45cd1b 93 while (blkCnt > 0U)
xorjoep 1:24714b45cd1b 94 {
xorjoep 1:24714b45cd1b 95 /* C = (A[0] + A[1] + A[2] + ... + A[blockSize-1]) */
xorjoep 1:24714b45cd1b 96 in1 = *pInput++;
xorjoep 1:24714b45cd1b 97 in2 = *pInput++;
xorjoep 1:24714b45cd1b 98 in3 = *pInput++;
xorjoep 1:24714b45cd1b 99 in4 = *pInput++;
xorjoep 1:24714b45cd1b 100
xorjoep 1:24714b45cd1b 101 sum += in1;
xorjoep 1:24714b45cd1b 102 sum += in2;
xorjoep 1:24714b45cd1b 103 sum += in3;
xorjoep 1:24714b45cd1b 104 sum += in4;
xorjoep 1:24714b45cd1b 105
xorjoep 1:24714b45cd1b 106 /* Decrement the loop counter */
xorjoep 1:24714b45cd1b 107 blkCnt--;
xorjoep 1:24714b45cd1b 108 }
xorjoep 1:24714b45cd1b 109
xorjoep 1:24714b45cd1b 110 /* If the blockSize is not a multiple of 4, compute any remaining output samples here.
xorjoep 1:24714b45cd1b 111 ** No loop unrolling is used. */
xorjoep 1:24714b45cd1b 112 blkCnt = blockSize % 0x4U;
xorjoep 1:24714b45cd1b 113
xorjoep 1:24714b45cd1b 114 #else
xorjoep 1:24714b45cd1b 115 /* Run the below code for Cortex-M0 or Cortex-M3 */
xorjoep 1:24714b45cd1b 116
xorjoep 1:24714b45cd1b 117 /* Loop over blockSize number of values */
xorjoep 1:24714b45cd1b 118 blkCnt = blockSize;
xorjoep 1:24714b45cd1b 119
xorjoep 1:24714b45cd1b 120 #endif
xorjoep 1:24714b45cd1b 121
xorjoep 1:24714b45cd1b 122 while (blkCnt > 0U)
xorjoep 1:24714b45cd1b 123 {
xorjoep 1:24714b45cd1b 124 /* C = (A[0] + A[1] + A[2] + ... + A[blockSize-1]) */
xorjoep 1:24714b45cd1b 125 sum += *pInput++;
xorjoep 1:24714b45cd1b 126
xorjoep 1:24714b45cd1b 127 /* Decrement the loop counter */
xorjoep 1:24714b45cd1b 128 blkCnt--;
xorjoep 1:24714b45cd1b 129 }
xorjoep 1:24714b45cd1b 130
xorjoep 1:24714b45cd1b 131 /* C = (A[0] + A[1] + A[2] + ... + A[blockSize-1]) / blockSize */
xorjoep 1:24714b45cd1b 132 fMean = sum / (float32_t) blockSize;
xorjoep 1:24714b45cd1b 133
xorjoep 1:24714b45cd1b 134 pInput = pSrc;
xorjoep 1:24714b45cd1b 135
xorjoep 1:24714b45cd1b 136 #if defined(ARM_MATH_DSP)
xorjoep 1:24714b45cd1b 137
xorjoep 1:24714b45cd1b 138 /*loop Unrolling */
xorjoep 1:24714b45cd1b 139 blkCnt = blockSize >> 2U;
xorjoep 1:24714b45cd1b 140
xorjoep 1:24714b45cd1b 141 /* First part of the processing with loop unrolling. Compute 4 outputs at a time.
xorjoep 1:24714b45cd1b 142 ** a second loop below computes the remaining 1 to 3 samples. */
xorjoep 1:24714b45cd1b 143 while (blkCnt > 0U)
xorjoep 1:24714b45cd1b 144 {
xorjoep 1:24714b45cd1b 145 fValue = *pInput++ - fMean;
xorjoep 1:24714b45cd1b 146 fSum += fValue * fValue;
xorjoep 1:24714b45cd1b 147 fValue = *pInput++ - fMean;
xorjoep 1:24714b45cd1b 148 fSum += fValue * fValue;
xorjoep 1:24714b45cd1b 149 fValue = *pInput++ - fMean;
xorjoep 1:24714b45cd1b 150 fSum += fValue * fValue;
xorjoep 1:24714b45cd1b 151 fValue = *pInput++ - fMean;
xorjoep 1:24714b45cd1b 152 fSum += fValue * fValue;
xorjoep 1:24714b45cd1b 153
xorjoep 1:24714b45cd1b 154 /* Decrement the loop counter */
xorjoep 1:24714b45cd1b 155 blkCnt--;
xorjoep 1:24714b45cd1b 156 }
xorjoep 1:24714b45cd1b 157
xorjoep 1:24714b45cd1b 158 blkCnt = blockSize % 0x4U;
xorjoep 1:24714b45cd1b 159 #else
xorjoep 1:24714b45cd1b 160 /* Run the below code for Cortex-M0 or Cortex-M3 */
xorjoep 1:24714b45cd1b 161
xorjoep 1:24714b45cd1b 162 /* Loop over blockSize number of values */
xorjoep 1:24714b45cd1b 163 blkCnt = blockSize;
xorjoep 1:24714b45cd1b 164 #endif
xorjoep 1:24714b45cd1b 165
xorjoep 1:24714b45cd1b 166 while (blkCnt > 0U)
xorjoep 1:24714b45cd1b 167 {
xorjoep 1:24714b45cd1b 168 fValue = *pInput++ - fMean;
xorjoep 1:24714b45cd1b 169 fSum += fValue * fValue;
xorjoep 1:24714b45cd1b 170
xorjoep 1:24714b45cd1b 171 /* Decrement the loop counter */
xorjoep 1:24714b45cd1b 172 blkCnt--;
xorjoep 1:24714b45cd1b 173 }
xorjoep 1:24714b45cd1b 174
xorjoep 1:24714b45cd1b 175 /* Variance */
xorjoep 1:24714b45cd1b 176 *pResult = fSum / (float32_t)(blockSize - 1.0f);
xorjoep 1:24714b45cd1b 177 }
xorjoep 1:24714b45cd1b 178
xorjoep 1:24714b45cd1b 179 /**
xorjoep 1:24714b45cd1b 180 * @} end of variance group
xorjoep 1:24714b45cd1b 181 */