/ Drivers / CMSIS / DSP / Source / StatisticsFunctions / arm_entropy_f16.c
arm_entropy_f16.c
  1  /* ----------------------------------------------------------------------
  2   * Project:      CMSIS DSP Library
  3   * Title:        arm_logsumexp_f16.c
  4   * Description:  LogSumExp
  5   *
  6   * $Date:        23 April 2021
  7   * $Revision:    V1.9.0
  8   *
  9   * Target Processor: Cortex-M and Cortex-A cores
 10   * -------------------------------------------------------------------- */
 11  /*
 12   * Copyright (C) 2010-2021 ARM Limited or its affiliates. All rights reserved.
 13   *
 14   * SPDX-License-Identifier: Apache-2.0
 15   *
 16   * Licensed under the Apache License, Version 2.0 (the License); you may
 17   * not use this file except in compliance with the License.
 18   * You may obtain a copy of the License at
 19   *
 20   * www.apache.org/licenses/LICENSE-2.0
 21   *
 22   * Unless required by applicable law or agreed to in writing, software
 23   * distributed under the License is distributed on an AS IS BASIS, WITHOUT
 24   * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 25   * See the License for the specific language governing permissions and
 26   * limitations under the License.
 27   */
 28  
 29  #include "dsp/statistics_functions_f16.h"
 30  
 31  #if defined(ARM_FLOAT16_SUPPORTED)
 32  
 33  #include <limits.h>
 34  #include <math.h>
 35  
 36  /**
 37    @ingroup groupStats
 38   */
 39  
 40  /**
 41    @defgroup Entropy Entropy
 42  
 43    Computes the entropy of a distribution
 44  
 45   */
 46  
 47  /**
 48   * @addtogroup Entropy
 49   * @{
 50   */
 51  
 52  
 53  /**
 54   * @brief Entropy
 55   *
 56   * @param[in]  pSrcA        Array of input values.
 57   * @param[in]  blockSize    Number of samples in the input array.
 58   * @return     Entropy      -Sum(p ln p)
 59   *
 60   */
 61  
 62  #if defined(ARM_MATH_MVE_FLOAT16) && !defined(ARM_MATH_AUTOVECTORIZE)
 63  
 64  #include "arm_helium_utils.h"
 65  #include "arm_vec_math_f16.h"
 66  
 67  float16_t arm_entropy_f16(const float16_t * pSrcA,uint32_t blockSize)
 68  {
 69      uint32_t        blkCnt;
 70      _Float16       accum=0.0f16,p;
 71  
 72  
 73      blkCnt = blockSize;
 74  
 75      f16x8_t         vSum = vdupq_n_f16(0.0f);
 76      /* Compute 4 outputs at a time */
 77      blkCnt = blockSize >> 3U;
 78  
 79      while (blkCnt > 0U)
 80      {
 81          f16x8_t         vecIn = vld1q(pSrcA);
 82  
 83          vSum = vaddq_f16(vSum, vmulq(vecIn, vlogq_f16(vecIn)));
 84  
 85          /*
 86           * Decrement the blockSize loop counter
 87           * Advance vector source and destination pointers
 88           */
 89          pSrcA += 8;
 90          blkCnt --;
 91      }
 92  
 93      accum = vecAddAcrossF16Mve(vSum);
 94  
 95      /* Tail */
 96      blkCnt = blockSize & 0x7;
 97      while(blkCnt > 0)
 98      {
 99         p = *pSrcA++;
100         accum += p * logf(p);
101         
102         blkCnt--;
103      
104      }
105  
106      return (-accum);
107  }
108  
109  #else
110  
111  float16_t arm_entropy_f16(const float16_t * pSrcA,uint32_t blockSize)
112  {
113      const float16_t *pIn;
114      uint32_t blkCnt;
115      _Float16 accum, p;
116   
117      pIn = pSrcA;
118      blkCnt = blockSize;
119  
120      accum = 0.0f;
121  
122      while(blkCnt > 0)
123      {
124         p = *pIn++;
125         accum += p * logf(p);
126         
127         blkCnt--;
128      
129      }
130  
131      return(-accum);
132  }
133  #endif /* defined(ARM_MATH_MVEF) && !defined(ARM_MATH_AUTOVECTORIZE) */
134  
135  /**
136   * @} end of Entropy group
137   */
138  
139  #endif /* #if defined(ARM_FLOAT16_SUPPORTED) */ 
140