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_rms_f32.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_rms_f32.c 00009 * 00010 * Description: Root mean square value of an array of F32 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 * @defgroup RMS Root mean square (RMS) 00035 * 00036 * 00037 * Calculates the Root Mean Sqaure of the elements in the input vector. 00038 * The underlying algorithm is used: 00039 * 00040 * <pre> 00041 * Result = sqrt(((pSrc[0] * pSrc[0] + pSrc[1] * pSrc[1] + ... + pSrc[blockSize-1] * pSrc[blockSize-1]) / blockSize)); 00042 * </pre> 00043 * 00044 * There are separate functions for floating point, Q31, and Q15 data types. 00045 */ 00046 00047 /** 00048 * @addtogroup RMS 00049 * @{ 00050 */ 00051 00052 00053 /** 00054 * @brief Root Mean Square of the elements of a floating-point vector. 00055 * @param[in] *pSrc points to the input vector 00056 * @param[in] blockSize length of the input vector 00057 * @param[out] *pResult rms value returned here 00058 * @return none. 00059 * 00060 */ 00061 00062 void arm_rms_f32( 00063 float32_t * pSrc, 00064 uint32_t blockSize, 00065 float32_t * pResult) 00066 { 00067 float32_t sum = 0.0f; /* Accumulator */ 00068 float32_t in; /* Tempoprary variable to store input value */ 00069 uint32_t blkCnt; /* loop counter */ 00070 00071 /* loop Unrolling */ 00072 blkCnt = blockSize >> 2u; 00073 00074 /* First part of the processing with loop unrolling. Compute 4 outputs at a time. 00075 ** a second loop below computes the remaining 1 to 3 samples. */ 00076 while(blkCnt > 0u) 00077 { 00078 /* C = A[0] * A[0] + A[1] * A[1] + A[2] * A[2] + ... + A[blockSize-1] * A[blockSize-1] */ 00079 /* Compute sum of the squares and then store the result in a temporary variable, sum */ 00080 in = *pSrc++; 00081 sum += in * in; 00082 in = *pSrc++; 00083 sum += in * in; 00084 in = *pSrc++; 00085 sum += in * in; 00086 in = *pSrc++; 00087 sum += in * in; 00088 00089 /* Decrement the loop counter */ 00090 blkCnt--; 00091 } 00092 00093 /* If the blockSize is not a multiple of 4, compute any remaining output samples here. 00094 ** No loop unrolling is used. */ 00095 blkCnt = blockSize % 0x4u; 00096 00097 while(blkCnt > 0u) 00098 { 00099 /* C = A[0] * A[0] + A[1] * A[1] + A[2] * A[2] + ... + A[blockSize-1] * A[blockSize-1] */ 00100 /* Compute sum of the squares and then store the results in a temporary variable, sum */ 00101 in = *pSrc++; 00102 sum += in * in; 00103 00104 /* Decrement the loop counter */ 00105 blkCnt--; 00106 } 00107 00108 /* Compute Rms and store the result in the destination */ 00109 arm_sqrt_f32(sum / (float32_t) blockSize, pResult); 00110 } 00111 00112 /** 00113 * @} end of RMS group 00114 */
Generated on Tue Jul 12 2022 19:55:44 by
1.7.2
