| #include "edge-impulse-sdk/dsp/config.hpp" |
| #if EIDSP_LOAD_CMSIS_DSP_SOURCES |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
|
|
| #include "edge-impulse-sdk/CMSIS/DSP/Include/dsp/complex_math_functions_f16.h" |
|
|
| #if defined(ARM_FLOAT16_SUPPORTED) |
|
|
| |
| |
| |
|
|
|
|
| |
| |
| |
| |
|
|
| |
| |
| |
| |
| |
| |
| |
| |
|
|
| #if defined(ARM_MATH_MVE_FLOAT16) && !defined(ARM_MATH_AUTOVECTORIZE) |
|
|
| void arm_cmplx_mult_real_f16( |
| const float16_t * pSrcCmplx, |
| const float16_t * pSrcReal, |
| float16_t * pCmplxDst, |
| uint32_t numSamples) |
| { |
| static const uint16_t stride_cmplx_x_real_16[8] = { |
| 0, 0, 1, 1, 2, 2, 3, 3 |
| }; |
| uint32_t blockSizeC = numSamples * CMPLX_DIM; |
| uint32_t blkCnt; |
| f16x8_t rVec; |
| f16x8_t cmplxVec; |
| f16x8_t dstVec; |
| uint16x8_t strideVec; |
|
|
|
|
| |
| strideVec = vld1q(stride_cmplx_x_real_16); |
|
|
| |
| blkCnt = blockSizeC >> 3; |
| while (blkCnt > 0U) |
| { |
| cmplxVec = vld1q(pSrcCmplx); |
| rVec = vldrhq_gather_shifted_offset_f16(pSrcReal, strideVec); |
| dstVec = vmulq(cmplxVec, rVec); |
| vst1q(pCmplxDst, dstVec); |
|
|
| pSrcReal += 4; |
| pSrcCmplx += 8; |
| pCmplxDst += 8; |
| blkCnt--; |
| } |
|
|
| blkCnt = blockSizeC & 7; |
| if (blkCnt > 0U) { |
| mve_pred16_t p0 = vctp16q(blkCnt); |
|
|
| cmplxVec = vld1q(pSrcCmplx); |
| rVec = vldrhq_gather_shifted_offset_f16(pSrcReal, strideVec); |
| dstVec = vmulq(cmplxVec, rVec); |
| vstrhq_p_f16(pCmplxDst, dstVec, p0); |
| } |
| } |
|
|
| #else |
| void arm_cmplx_mult_real_f16( |
| const float16_t * pSrcCmplx, |
| const float16_t * pSrcReal, |
| float16_t * pCmplxDst, |
| uint32_t numSamples) |
| { |
| uint32_t blkCnt; |
| float16_t in; |
|
|
| #if defined (ARM_MATH_LOOPUNROLL) && !defined(ARM_MATH_AUTOVECTORIZE) |
|
|
| |
| blkCnt = numSamples >> 2U; |
|
|
| while (blkCnt > 0U) |
| { |
| |
| |
|
|
| in = *pSrcReal++; |
| |
| *pCmplxDst++ = (_Float16)*pSrcCmplx++ * (_Float16)in; |
| *pCmplxDst++ = (_Float16)*pSrcCmplx++ * (_Float16)in; |
|
|
| in = *pSrcReal++; |
| *pCmplxDst++ = (_Float16)*pSrcCmplx++ * (_Float16)in; |
| *pCmplxDst++ = (_Float16)*pSrcCmplx++ * (_Float16)in; |
|
|
| in = *pSrcReal++; |
| *pCmplxDst++ = (_Float16)*pSrcCmplx++ * (_Float16)in; |
| *pCmplxDst++ = (_Float16)*pSrcCmplx++ * (_Float16)in; |
|
|
| in = *pSrcReal++; |
| *pCmplxDst++ = (_Float16)*pSrcCmplx++ * (_Float16)in; |
| *pCmplxDst++ = (_Float16)*pSrcCmplx++ * (_Float16)in; |
|
|
| |
| blkCnt--; |
| } |
|
|
| |
| blkCnt = numSamples % 0x4U; |
|
|
| #else |
|
|
| |
| blkCnt = numSamples; |
|
|
| #endif |
|
|
| while (blkCnt > 0U) |
| { |
| |
| |
|
|
| in = *pSrcReal++; |
| |
| *pCmplxDst++ = (_Float16)*pSrcCmplx++ * (_Float16)in; |
| *pCmplxDst++ = (_Float16)*pSrcCmplx++ * (_Float16)in; |
|
|
| |
| blkCnt--; |
| } |
|
|
| } |
| #endif |
|
|
| |
| |
| |
|
|
| #endif |
|
|
| #endif |
|
|