arm std q31 8c source


CMSIS DSP Software Library: arm_std_q31.c Source File Main Page Modules Data Structures Files Examples File List Globals arm_std_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_std_q31.c 00009 * 00010 * Description: Standard deviation of an array of Q31 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 00063 void arm_std_q31( 00064 q31_t * pSrc, 00065 uint32_t blockSize, 00066 q31_t * pResult) 00067 { 00068 q63_t sum = 0; /* Accumulator */ 00069 q31_t meanOfSquares, squareOfMean; /* square of mean and mean of square */ 00070 q31_t mean; /* mean */ 00071 q31_t in; /* input value */ 00072 q31_t t; /* Temporary variable */ 00073 uint32_t blkCnt; /* loop counter */ 00074 q31_t *pIn; /* Temporary pointer */ 00075 00076 pIn = pSrc; 00077 00078 /*loop Unrolling */ 00079 blkCnt = blockSize >> 2u; 00080 00081 /* First part of the processing with loop unrolling. Compute 4 outputs at a time. 00082 ** a second loop below computes the remaining 1 to 3 samples. */ 00083 while(blkCnt > 0u) 00084 { 00085 /* C = (A[0] * A[0] + A[1] * A[1] + ... + A[blockSize-1] * A[blockSize-1]) */ 00086 /* Compute Sum of squares of the input samples 00087 * and then store the result in a temporary variable, sum. */ 00088 in = *pSrc++; 00089 sum += ((q63_t) (in) * (in)); 00090 in = *pSrc++; 00091 sum += ((q63_t) (in) * (in)); 00092 in = *pSrc++; 00093 sum += ((q63_t) (in) * (in)); 00094 in = *pSrc++; 00095 sum += ((q63_t) (in) * (in)); 00096 00097 /* Decrement the loop counter */ 00098 blkCnt--; 00099 } 00100 00101 /* If the blockSize is not a multiple of 4, compute any remaining output samples here. 00102 ** No loop unrolling is used. */ 00103 blkCnt = blockSize % 0x4u; 00104 00105 while(blkCnt > 0u) 00106 { 00107 /* C = (A[0] * A[0] + A[1] * A[1] + ... + A[blockSize-1] * A[blockSize-1]) */ 00108 /* Compute Sum of squares of the input samples 00109 * and then store the result in a temporary variable, sum. */ 00110 in = *pSrc++; 00111 sum += ((q63_t) (in) * (in)); 00112 00113 /* Decrement the loop counter */ 00114 blkCnt--; 00115 } 00116 00117 t = (q31_t) ((1.0f / (float32_t) (blockSize - 1u)) * 1073741824.0f); 00118 00119 /* Compute Mean of squares of the input samples 00120 * and then store the result in a temporary variable, meanOfSquares. */ 00121 sum = (sum >> 31); 00122 meanOfSquares = (q31_t) ((sum * t) >> 30); 00123 00124 /* Reset the accumulator */ 00125 sum = 0; 00126 00127 /*loop Unrolling */ 00128 blkCnt = blockSize >> 2u; 00129 00130 /* Reset the input working pointer */ 00131 pSrc = pIn; 00132 00133 /* First part of the processing with loop unrolling. Compute 4 outputs at a time. 00134 ** a second loop below computes the remaining 1 to 3 samples. */ 00135 while(blkCnt > 0u) 00136 { 00137 /* C = (A[0] + A[1] + A[2] + ... + A[blockSize-1]) */ 00138 /* Compute sum of all input values and then store the result in a temporary variable, sum. */ 00139 sum += *pSrc++; 00140 sum += *pSrc++; 00141 sum += *pSrc++; 00142 sum += *pSrc++; 00143 00144 /* Decrement the loop counter */ 00145 blkCnt--; 00146 } 00147 00148 /* If the blockSize is not a multiple of 4, compute any remaining output samples here. 00149 ** No loop unrolling is used. */ 00150 blkCnt = blockSize % 0x4u; 00151 00152 while(blkCnt > 0u) 00153 { 00154 /* C = (A[0] + A[1] + A[2] + ... + A[blockSize-1]) */ 00155 /* Compute sum of all input values and then store the result in a temporary variable, sum. */ 00156 sum += *pSrc++; 00157 00158 /* Decrement the loop counter */ 00159 blkCnt--; 00160 } 00161 /* Compute mean of all input values */ 00162 t = (q31_t) ((1.0f / (blockSize * (blockSize - 1u))) * 2147483648.0f); 00163 mean = (q31_t) (sum); 00164 00165 /* Compute square of mean */ 00166 squareOfMean = (q31_t) (((q63_t) mean * mean) >> 31); 00167 squareOfMean = (q31_t) (((q63_t) squareOfMean * t) >> 31); 00168 00169 /* Compute standard deviation and then store the result to the destination */ 00170 arm_sqrt_q31(meanOfSquares - squareOfMean, pResult); 00171 00172 } 00173  All Data Structures Files Functions Variables Typedefs Enumerations Enumerator Defines Generated on Mon Nov 29 2010 17:19:57 for CMSIS DSP Software Library by  1.7.2

Wyszukiwarka

Podobne podstrony:
arm mult q31? source
arm sqrt q31? source
arm std q31?
arm rms q31? source
arm sub q31? source
arm rfft q31? source
arm correlate q31? source
arm cos q31? source
arm ?t4 q31? source
arm std q15? source
arm shift q31? source
arm sin q31? source
arm fill q31? source
arm std ?2? source
arm conv q31? source
arm var q31? source
arm mean q31? source
arm ?s q31? source
arm min q31? source

więcej podobnych podstron