| #include "edge-impulse-sdk/dsp/config.hpp" |
| #if EIDSP_LOAD_CMSIS_DSP_SOURCES |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
|
|
| #include "edge-impulse-sdk/CMSIS/DSP/Include/dsp/statistics_functions_f16.h" |
|
|
| #if defined(ARM_FLOAT16_SUPPORTED) |
|
|
| #include <limits.h> |
| #include <math.h> |
|
|
|
|
| |
| |
| |
| |
|
|
|
|
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
|
|
| #if defined(ARM_MATH_MVE_FLOAT16) && !defined(ARM_MATH_AUTOVECTORIZE) |
|
|
| #include "edge-impulse-sdk/CMSIS/DSP/Include/arm_helium_utils.h" |
| #include "edge-impulse-sdk/CMSIS/DSP/Include/arm_vec_math_f16.h" |
|
|
| float16_t arm_logsumexp_f16(const float16_t *in, uint32_t blockSize) |
| { |
| float16_t maxVal; |
| const float16_t *pIn; |
| int32_t blkCnt; |
| _Float16 accum=0.0f16; |
| _Float16 tmp; |
|
|
|
|
| arm_max_no_idx_f16((float16_t *) in, blockSize, &maxVal); |
|
|
|
|
| blkCnt = blockSize; |
| pIn = in; |
|
|
|
|
| f16x8_t vSum = vdupq_n_f16(0.0f16); |
| blkCnt = blockSize >> 3; |
| while(blkCnt > 0) |
| { |
| f16x8_t vecIn = vld1q(pIn); |
| f16x8_t vecExp; |
|
|
| vecExp = vexpq_f16(vsubq_n_f16(vecIn, maxVal)); |
|
|
| vSum = vaddq_f16(vSum, vecExp); |
|
|
| |
| |
| |
| |
| pIn += 8; |
| blkCnt --; |
| } |
|
|
| |
| accum = vecAddAcrossF16Mve(vSum); |
|
|
| blkCnt = blockSize & 0x7; |
| while(blkCnt > 0) |
| { |
| tmp = *pIn++; |
| accum += (_Float16)expf((float32_t)((_Float16)tmp - (_Float16)maxVal)); |
| blkCnt--; |
| |
| } |
|
|
| accum = (_Float16)maxVal + (_Float16)logf((float32_t)accum); |
|
|
| return (accum); |
| } |
|
|
| #else |
| float16_t arm_logsumexp_f16(const float16_t *in, uint32_t blockSize) |
| { |
| _Float16 maxVal; |
| _Float16 tmp; |
| const float16_t *pIn; |
| uint32_t blkCnt; |
| _Float16 accum; |
| |
| pIn = in; |
| blkCnt = blockSize; |
|
|
| maxVal = *pIn++; |
| blkCnt--; |
|
|
| while(blkCnt > 0) |
| { |
| tmp = *pIn++; |
|
|
| if (tmp > maxVal) |
| { |
| maxVal = tmp; |
| } |
| blkCnt--; |
| |
| } |
|
|
| blkCnt = blockSize; |
| pIn = in; |
| accum = 0; |
| while(blkCnt > 0) |
| { |
| tmp = *pIn++; |
| accum += (_Float16)expf((float32_t)((_Float16)tmp - (_Float16)maxVal)); |
| blkCnt--; |
| |
| } |
| accum = (_Float16)maxVal + (_Float16)logf((float32_t)accum); |
|
|
| return(accum); |
| } |
| #endif |
|
|
| |
| |
| |
|
|
| #endif |
|
|
|
|
| #endif |
|
|