| #include "edge-impulse-sdk/dsp/config.hpp" |
| #if EIDSP_LOAD_CMSIS_DSP_SOURCES |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
|
|
| #include "edge-impulse-sdk/CMSIS/DSP/Include/dsp/support_functions.h" |
|
|
| |
| |
| |
|
|
| |
| |
| |
|
|
| |
| |
| |
| |
|
|
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
|
|
| #if defined(ARM_MATH_MVEF) && !defined(ARM_MATH_AUTOVECTORIZE) |
| void arm_float_to_q31( |
| const float32_t * pSrc, |
| q31_t * pDst, |
| uint32_t blockSize) |
| { |
| uint32_t blkCnt; |
| float32_t maxQ = (float32_t) Q31_MAX; |
| f32x4_t vecDst; |
| #ifdef ARM_MATH_ROUNDING |
| float32_t in; |
| #endif |
|
|
|
|
| blkCnt = blockSize >> 2U; |
|
|
| |
| while (blkCnt > 0U) |
| { |
|
|
| vecDst = vldrwq_f32(pSrc); |
| |
| |
| vecDst = vmulq(vecDst, maxQ); |
|
|
| vstrwq_s32(pDst, vcvtaq_s32_f32(vecDst)); |
| |
| |
| |
| |
| pSrc += 4; |
| pDst += 4; |
| blkCnt --; |
| } |
|
|
| blkCnt = blockSize & 3; |
|
|
| while (blkCnt > 0U) |
| { |
| |
| |
| |
| #ifdef ARM_MATH_ROUNDING |
|
|
| in = (*pSrc++ * 2147483648.0f); |
| in += in > 0.0f ? 0.5f : -0.5f; |
| *pDst++ = clip_q63_to_q31((q63_t) (in)); |
|
|
| #else |
|
|
| |
| |
| *pDst++ = clip_q63_to_q31((q63_t) (*pSrc++ * 2147483648.0f)); |
|
|
| #endif |
|
|
| |
| blkCnt--; |
| } |
| } |
| #else |
| #if defined(ARM_MATH_NEON) |
| void arm_float_to_q31( |
| const float32_t * pSrc, |
| q31_t * pDst, |
| uint32_t blockSize) |
| { |
| const float32_t *pIn = pSrc; |
| uint32_t blkCnt; |
|
|
| float32x4_t inV; |
| #ifdef ARM_MATH_ROUNDING |
| float32_t in; |
| float32x4_t zeroV = vdupq_n_f32(0.0f); |
| float32x4_t pHalf = vdupq_n_f32(0.5f / 2147483648.0f); |
| float32x4_t mHalf = vdupq_n_f32(-0.5f / 2147483648.0f); |
| float32x4_t r; |
| uint32x4_t cmp; |
| #endif |
|
|
| int32x4_t outV; |
|
|
| blkCnt = blockSize >> 2U; |
|
|
| |
| |
| while (blkCnt > 0U) |
| { |
|
|
| #ifdef ARM_MATH_ROUNDING |
|
|
| |
| |
| inV = vld1q_f32(pIn); |
| cmp = vcgtq_f32(inV,zeroV); |
| r = vbslq_f32(cmp,pHalf,mHalf); |
| inV = vaddq_f32(inV, r); |
|
|
| pIn += 4; |
|
|
| outV = vcvtq_n_s32_f32(inV,31); |
|
|
| vst1q_s32(pDst, outV); |
| pDst += 4; |
|
|
| #else |
|
|
| |
| |
| inV = vld1q_f32(pIn); |
|
|
| outV = vcvtq_n_s32_f32(inV,31); |
|
|
| vst1q_s32(pDst, outV); |
| pDst += 4; |
| pIn += 4; |
|
|
| #endif |
|
|
| |
| blkCnt--; |
| } |
|
|
| |
| |
| blkCnt = blockSize & 3; |
|
|
| while (blkCnt > 0U) |
| { |
|
|
| #ifdef ARM_MATH_ROUNDING |
|
|
| |
| |
| in = *pIn++; |
| in = (in * 2147483648.0f); |
| in += in > 0.0f ? 0.5f : -0.5f; |
| *pDst++ = clip_q63_to_q31((q63_t) (in)); |
|
|
| #else |
|
|
| |
| |
| *pDst++ = clip_q63_to_q31((q63_t) (*pIn++ * 2147483648.0f)); |
|
|
| #endif |
|
|
| |
| blkCnt--; |
| } |
|
|
|
|
| } |
| #else |
| void arm_float_to_q31( |
| const float32_t * pSrc, |
| q31_t * pDst, |
| uint32_t blockSize) |
| { |
| uint32_t blkCnt; |
| const float32_t *pIn = pSrc; |
|
|
| #ifdef ARM_MATH_ROUNDING |
| float32_t in; |
| #endif |
|
|
| #if defined (ARM_MATH_LOOPUNROLL) |
|
|
| |
| blkCnt = blockSize >> 2U; |
|
|
| while (blkCnt > 0U) |
| { |
| |
|
|
| |
| #ifdef ARM_MATH_ROUNDING |
|
|
| in = (*pIn++ * 2147483648.0f); |
| in += in > 0.0f ? 0.5f : -0.5f; |
| *pDst++ = clip_q63_to_q31((q63_t) (in)); |
|
|
| in = (*pIn++ * 2147483648.0f); |
| in += in > 0.0f ? 0.5f : -0.5f; |
| *pDst++ = clip_q63_to_q31((q63_t) (in)); |
|
|
| in = (*pIn++ * 2147483648.0f); |
| in += in > 0.0f ? 0.5f : -0.5f; |
| *pDst++ = clip_q63_to_q31((q63_t) (in)); |
|
|
| in = (*pIn++ * 2147483648.0f); |
| in += in > 0.0f ? 0.5f : -0.5f; |
| *pDst++ = clip_q63_to_q31((q63_t) (in)); |
|
|
| #else |
|
|
| |
| |
| *pDst++ = clip_q63_to_q31((q63_t) (*pIn++ * 2147483648.0f)); |
| *pDst++ = clip_q63_to_q31((q63_t) (*pIn++ * 2147483648.0f)); |
| *pDst++ = clip_q63_to_q31((q63_t) (*pIn++ * 2147483648.0f)); |
| *pDst++ = clip_q63_to_q31((q63_t) (*pIn++ * 2147483648.0f)); |
|
|
| #endif |
|
|
| |
| blkCnt--; |
| } |
|
|
| |
| blkCnt = blockSize % 0x4U; |
|
|
| #else |
|
|
| |
| blkCnt = blockSize; |
|
|
| #endif |
|
|
| while (blkCnt > 0U) |
| { |
| |
|
|
| |
| #ifdef ARM_MATH_ROUNDING |
|
|
| in = (*pIn++ * 2147483648.0f); |
| in += in > 0.0f ? 0.5f : -0.5f; |
| *pDst++ = clip_q63_to_q31((q63_t) (in)); |
|
|
| #else |
|
|
| |
| |
| *pDst++ = clip_q63_to_q31((q63_t) (*pIn++ * 2147483648.0f)); |
|
|
| #endif |
|
|
| |
| blkCnt--; |
| } |
|
|
| } |
| #endif |
| #endif |
|
|
| |
| |
| |
|
|
| #endif |
|
|