| #include "edge-impulse-sdk/dsp/config.hpp" |
| #if EIDSP_LOAD_CMSIS_DSP_SOURCES |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
|
|
| #include "edge-impulse-sdk/CMSIS/DSP/Include/dsp/fast_math_functions.h" |
|
|
| #define LOG_Q31_ACCURACY 31 |
|
|
| |
| |
| |
| |
| |
| |
| |
| |
| #define LOG_Q31_INTEGER_PART 5 |
|
|
| |
| #define LOQ_Q31_THRESHOLD (1u << LOG_Q31_ACCURACY) |
|
|
| |
| #define LOQ_Q31_Q32_HALF LOQ_Q31_THRESHOLD |
| #define LOQ_Q31_Q30_HALF (LOQ_Q31_Q32_HALF >> 2) |
|
|
|
|
| |
| #define LOG_Q31_INVLOG2EXP 0x58b90bfbuL |
|
|
| |
| static uint32_t arm_scalar_log_q31(uint32_t src) |
| { |
| int32_t i; |
|
|
| int32_t c = __CLZ(src); |
| int32_t normalization=0; |
|
|
| |
| uint32_t inc = LOQ_Q31_Q32_HALF >> (LOG_Q31_INTEGER_PART + 1); |
|
|
| |
| uint32_t x; |
|
|
| |
| uint32_t y=0; |
|
|
| |
| int32_t tmp; |
|
|
|
|
| |
| x = src; |
| if ((c-1) < 0) |
| { |
| x = x >> (1-c); |
| } |
| else |
| { |
| x = x << (c-1); |
| } |
| normalization = c; |
|
|
| |
| |
| |
| |
| |
| for(i = 0; i < LOG_Q31_ACCURACY ; i++) |
| { |
| x = ((int64_t)x*x) >> (LOG_Q31_ACCURACY - 1); |
|
|
| if (x >= LOQ_Q31_THRESHOLD) |
| { |
| y += inc ; |
| x = x >> 1; |
| } |
| inc = inc >> 1; |
| } |
|
|
| |
| |
| |
| |
| |
|
|
| |
| tmp = (int32_t)y - (normalization << (LOG_Q31_ACCURACY - LOG_Q31_INTEGER_PART)); |
|
|
|
|
| |
| y = ((int64_t)tmp * LOG_Q31_INVLOG2EXP) >> 31; |
|
|
|
|
|
|
| return(y); |
|
|
| } |
|
|
| #if defined(ARM_MATH_MVEI) && !defined(ARM_MATH_AUTOVECTORIZE) |
|
|
|
|
| q31x4_t vlogq_q31(q31x4_t src) |
| { |
|
|
| int32_t i; |
|
|
| int32x4_t c = vclzq_s32(src); |
| int32x4_t normalization = c; |
|
|
|
|
| |
| uint32_t inc = LOQ_Q31_Q32_HALF >> (LOG_Q31_INTEGER_PART + 1); |
|
|
| |
| uint32x4_t x; |
|
|
|
|
| |
| uint32x4_t y = vdupq_n_u32(0); |
|
|
|
|
| |
| int32x4_t vtmp; |
|
|
|
|
| mve_pred16_t p; |
|
|
| |
|
|
|
|
| vtmp = vsubq_n_s32(c,1); |
| x = vshlq_u32((uint32x4_t)src,vtmp); |
|
|
|
|
| |
| |
| |
| |
| |
| for(i = 0; i < LOG_Q31_ACCURACY ; i++) |
| { |
| x = vmulhq_u32(x,x); |
| x = vshlq_n_u32(x,2); |
|
|
|
|
| p = vcmphiq_u32(x,vdupq_n_u32(LOQ_Q31_THRESHOLD)); |
| y = vaddq_m_n_u32(y, y,inc,p); |
| x = vshrq_m_n_u32(x,x,1,p); |
|
|
| inc = inc >> 1; |
| } |
|
|
|
|
| |
| |
| |
| |
| |
|
|
| |
| |
| vtmp = vshlq_n_s32(normalization,LOG_Q31_ACCURACY - LOG_Q31_INTEGER_PART); |
| vtmp = vsubq_s32((int32x4_t)y,vtmp); |
|
|
|
|
|
|
| |
| |
| vtmp = vqdmulhq_n_s32(vtmp,LOG_Q31_INVLOG2EXP); |
|
|
| return(vtmp); |
| } |
| #endif |
|
|
| |
| |
| |
|
|
| |
| |
| |
| |
|
|
| |
| |
| |
| |
| |
| |
| |
| |
| void arm_vlog_q31( |
| const q31_t * pSrc, |
| q31_t * pDst, |
| uint32_t blockSize) |
| { |
| uint32_t blkCnt; |
|
|
| #if defined(ARM_MATH_MVEI) && !defined(ARM_MATH_AUTOVECTORIZE) |
|
|
| q31x4_t src; |
| q31x4_t dst; |
|
|
| blkCnt = blockSize >> 2; |
|
|
| while (blkCnt > 0U) |
| { |
| src = vld1q(pSrc); |
| dst = vlogq_q31(src); |
| vst1q(pDst, dst); |
|
|
| pSrc += 4; |
| pDst += 4; |
| |
| blkCnt--; |
| } |
|
|
| blkCnt = blockSize & 3; |
| #else |
| blkCnt = blockSize; |
| #endif |
|
|
| while (blkCnt > 0U) |
| { |
| *pDst++=arm_scalar_log_q31(*pSrc++); |
|
|
| blkCnt--; |
| } |
|
|
| } |
|
|
| |
| |
| |
|
|
| #endif |
|
|