| #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_cmplx_f16( |
| const float16_t * pSrcA, |
| const float16_t * pSrcB, |
| float16_t * pDst, |
| uint32_t numSamples) |
| { |
| int32_t blkCnt; |
| f16x8_t vecSrcA, vecSrcB; |
| f16x8_t vecSrcC, vecSrcD; |
| f16x8_t vec_acc; |
|
|
| blkCnt = (numSamples >> 3); |
| blkCnt -= 1; |
| if (blkCnt > 0) { |
| |
| vecSrcA = vld1q(pSrcA); |
| vecSrcB = vld1q(pSrcB); |
| pSrcA += 8; |
| pSrcB += 8; |
|
|
| while (blkCnt > 0) { |
| vec_acc = vcmulq(vecSrcA, vecSrcB); |
| vecSrcC = vld1q(pSrcA); |
| pSrcA += 8; |
|
|
| vec_acc = vcmlaq_rot90(vec_acc, vecSrcA, vecSrcB); |
| vecSrcD = vld1q(pSrcB); |
| pSrcB += 8; |
| vst1q(pDst, vec_acc); |
| pDst += 8; |
|
|
| vec_acc = vcmulq(vecSrcC, vecSrcD); |
| vecSrcA = vld1q(pSrcA); |
| pSrcA += 8; |
|
|
| vec_acc = vcmlaq_rot90(vec_acc, vecSrcC, vecSrcD); |
| vecSrcB = vld1q(pSrcB); |
| pSrcB += 8; |
| vst1q(pDst, vec_acc); |
| pDst += 8; |
| |
| |
| |
| blkCnt--; |
| } |
|
|
| |
| vec_acc = vcmulq(vecSrcA, vecSrcB); |
| vecSrcC = vld1q(pSrcA); |
|
|
| vec_acc = vcmlaq_rot90(vec_acc, vecSrcA, vecSrcB); |
| vecSrcD = vld1q(pSrcB); |
| vst1q(pDst, vec_acc); |
| pDst += 8; |
|
|
| vec_acc = vcmulq(vecSrcC, vecSrcD); |
| vec_acc = vcmlaq_rot90(vec_acc, vecSrcC, vecSrcD); |
| vst1q(pDst, vec_acc); |
| pDst += 8; |
|
|
| |
| |
| |
| blkCnt = CMPLX_DIM * (numSamples & 7); |
| while (blkCnt > 0) { |
| mve_pred16_t p = vctp16q(blkCnt); |
| pSrcA += 8; |
| pSrcB += 8; |
|
|
| vecSrcA = vldrhq_z_f16(pSrcA, p); |
| vecSrcB = vldrhq_z_f16(pSrcB, p); |
| vec_acc = vcmulq_m(vuninitializedq_f16(),vecSrcA, vecSrcB, p); |
| vec_acc = vcmlaq_rot90_m(vec_acc, vecSrcA, vecSrcB, p); |
|
|
| vstrhq_p_f16(pDst, vec_acc, p); |
| pDst += 8; |
|
|
| blkCnt -= 8; |
| } |
| } else { |
| |
| blkCnt = numSamples * CMPLX_DIM; |
|
|
| do { |
| mve_pred16_t p = vctp16q(blkCnt); |
|
|
| vecSrcA = vldrhq_z_f16(pSrcA, p); |
| vecSrcB = vldrhq_z_f16(pSrcB, p); |
|
|
| vec_acc = vcmulq_m(vuninitializedq_f16(),vecSrcA, vecSrcB, p); |
| vec_acc = vcmlaq_rot90_m(vec_acc, vecSrcA, vecSrcB, p); |
| vstrhq_p_f16(pDst, vec_acc, p); |
| pDst += 8; |
|
|
| |
| |
| |
| |
| pSrcA += 8; |
| pSrcB += 8; |
| blkCnt -= 8; |
| } |
| while (blkCnt > 0); |
| } |
|
|
| } |
|
|
|
|
| #else |
| void arm_cmplx_mult_cmplx_f16( |
| const float16_t * pSrcA, |
| const float16_t * pSrcB, |
| float16_t * pDst, |
| uint32_t numSamples) |
| { |
| uint32_t blkCnt; |
| _Float16 a, b, c, d; |
|
|
| #if defined (ARM_MATH_LOOPUNROLL) && !defined(ARM_MATH_AUTOVECTORIZE) |
|
|
| |
| blkCnt = numSamples >> 2U; |
|
|
| while (blkCnt > 0U) |
| { |
| |
| |
|
|
| a = *pSrcA++; |
| b = *pSrcA++; |
| c = *pSrcB++; |
| d = *pSrcB++; |
| |
| *pDst++ = (a * c) - (b * d); |
| *pDst++ = (a * d) + (b * c); |
|
|
| a = *pSrcA++; |
| b = *pSrcA++; |
| c = *pSrcB++; |
| d = *pSrcB++; |
| *pDst++ = (a * c) - (b * d); |
| *pDst++ = (a * d) + (b * c); |
|
|
| a = *pSrcA++; |
| b = *pSrcA++; |
| c = *pSrcB++; |
| d = *pSrcB++; |
| *pDst++ = (a * c) - (b * d); |
| *pDst++ = (a * d) + (b * c); |
|
|
| a = *pSrcA++; |
| b = *pSrcA++; |
| c = *pSrcB++; |
| d = *pSrcB++; |
| *pDst++ = (a * c) - (b * d); |
| *pDst++ = (a * d) + (b * c); |
|
|
| |
| blkCnt--; |
| } |
|
|
| |
| blkCnt = numSamples % 0x4U; |
|
|
| #else |
|
|
| |
| blkCnt = numSamples; |
|
|
| #endif |
|
|
| while (blkCnt > 0U) |
| { |
| |
| |
|
|
| a = *pSrcA++; |
| b = *pSrcA++; |
| c = *pSrcB++; |
| d = *pSrcB++; |
|
|
| |
| *pDst++ = (a * c) - (b * d); |
| *pDst++ = (a * d) + (b * c); |
|
|
| |
| blkCnt--; |
| } |
|
|
| } |
| #endif |
|
|
| |
| |
| |
|
|
| #endif |
|
|
| #endif |
|
|