| #include "edge-impulse-sdk/dsp/config.hpp" |
| #if EIDSP_LOAD_CMSIS_DSP_SOURCES |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
|
|
| #include "edge-impulse-sdk/CMSIS/DSP/Include/dsp/complex_math_functions.h" |
|
|
| |
| |
| |
|
|
| |
| |
| |
| |
|
|
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
|
|
| #if defined(ARM_MATH_MVEI) && !defined(ARM_MATH_AUTOVECTORIZE) |
| void arm_cmplx_mult_cmplx_q31( |
| const q31_t * pSrcA, |
| const q31_t * pSrcB, |
| q31_t * pDst, |
| uint32_t numSamples) |
| { |
| int32_t blkCnt; |
| q31x4_t vecSrcA, vecSrcB; |
| q31x4_t vecSrcC, vecSrcD; |
| q31x4_t vecDst; |
|
|
| blkCnt = numSamples >> 2; |
| blkCnt -= 1; |
| if (blkCnt > 0) { |
| |
| vecSrcA = vld1q(pSrcA); |
| vecSrcB = vld1q(pSrcB); |
| pSrcA += 4; |
| pSrcB += 4; |
|
|
| while (blkCnt > 0) { |
|
|
| |
| vecDst = vqdmlsdhq(vuninitializedq_s32(), vecSrcA, vecSrcB); |
| vecSrcC = vld1q(pSrcA); |
| pSrcA += 4; |
|
|
| |
| vecDst = vqdmladhxq(vecDst, vecSrcA, vecSrcB); |
| vecSrcD = vld1q(pSrcB); |
| pSrcB += 4; |
|
|
| vst1q(pDst, vshrq(vecDst, 2)); |
| pDst += 4; |
|
|
| vecDst = vqdmlsdhq(vuninitializedq_s32(), vecSrcC, vecSrcD); |
| vecSrcA = vld1q(pSrcA); |
| pSrcA += 4; |
|
|
| vecDst = vqdmladhxq(vecDst, vecSrcC, vecSrcD); |
| vecSrcB = vld1q(pSrcB); |
| pSrcB += 4; |
|
|
| vst1q(pDst, vshrq(vecDst, 2)); |
| pDst += 4; |
|
|
| |
| |
| |
| blkCnt--; |
| } |
|
|
| |
| vecDst = vqdmlsdhq(vuninitializedq_s32(), vecSrcA, vecSrcB); |
| vecSrcC = vld1q(pSrcA); |
|
|
| vecDst = vqdmladhxq(vecDst, vecSrcA, vecSrcB); |
| vecSrcD = vld1q(pSrcB); |
|
|
| vst1q(pDst, vshrq(vecDst, 2)); |
| pDst += 4; |
|
|
| vecDst = vqdmlsdhq(vuninitializedq_s32(), vecSrcC, vecSrcD); |
| vecDst = vqdmladhxq(vecDst, vecSrcC, vecSrcD); |
|
|
| vst1q(pDst, vshrq(vecDst, 2)); |
| pDst += 4; |
|
|
| |
| |
| |
| blkCnt = CMPLX_DIM * (numSamples & 3); |
| do { |
| mve_pred16_t p = vctp32q(blkCnt); |
|
|
| pSrcA += 4; |
| pSrcB += 4; |
|
|
| vecSrcA = vldrwq_z_s32(pSrcA, p); |
| vecSrcB = vldrwq_z_s32(pSrcB, p); |
|
|
| vecDst = vqdmlsdhq_m(vuninitializedq_s32(), vecSrcA, vecSrcB, p); |
| vecDst = vqdmladhxq_m(vecDst, vecSrcA, vecSrcB, p); |
|
|
| vecDst = vshrq_m(vuninitializedq_s32(), vecDst, 2, p); |
| vstrwq_p_s32(pDst, vecDst, p); |
| pDst += 4; |
|
|
| blkCnt -= 4; |
| } |
| while ((int32_t) blkCnt > 0); |
| } else { |
| blkCnt = numSamples * CMPLX_DIM; |
| while (blkCnt > 0) { |
| mve_pred16_t p = vctp32q(blkCnt); |
|
|
| vecSrcA = vldrwq_z_s32(pSrcA, p); |
| vecSrcB = vldrwq_z_s32(pSrcB, p); |
|
|
| vecDst = vqdmlsdhq_m(vuninitializedq_s32(), vecSrcA, vecSrcB, p); |
| vecDst = vqdmladhxq_m(vecDst, vecSrcA, vecSrcB, p); |
|
|
| vecDst = vshrq_m(vuninitializedq_s32(), vecDst, 2, p); |
| vstrwq_p_s32(pDst, vecDst, p); |
|
|
| pDst += 4; |
| pSrcA += 4; |
| pSrcB += 4; |
|
|
| blkCnt -= 4; |
| } |
| } |
| } |
| #else |
| void arm_cmplx_mult_cmplx_q31( |
| const q31_t * pSrcA, |
| const q31_t * pSrcB, |
| q31_t * pDst, |
| uint32_t numSamples) |
| { |
| uint32_t blkCnt; |
| q31_t a, b, c, d; |
|
|
| #if defined (ARM_MATH_LOOPUNROLL) |
|
|
| |
| blkCnt = numSamples >> 2U; |
|
|
| while (blkCnt > 0U) |
| { |
| |
| |
|
|
| a = *pSrcA++; |
| b = *pSrcA++; |
| c = *pSrcB++; |
| d = *pSrcB++; |
| |
| *pDst++ = (q31_t) ( (((q63_t) a * c) >> 33) - (((q63_t) b * d) >> 33) ); |
| *pDst++ = (q31_t) ( (((q63_t) a * d) >> 33) + (((q63_t) b * c) >> 33) ); |
|
|
| a = *pSrcA++; |
| b = *pSrcA++; |
| c = *pSrcB++; |
| d = *pSrcB++; |
| *pDst++ = (q31_t) ( (((q63_t) a * c) >> 33) - (((q63_t) b * d) >> 33) ); |
| *pDst++ = (q31_t) ( (((q63_t) a * d) >> 33) + (((q63_t) b * c) >> 33) ); |
|
|
| a = *pSrcA++; |
| b = *pSrcA++; |
| c = *pSrcB++; |
| d = *pSrcB++; |
| *pDst++ = (q31_t) ( (((q63_t) a * c) >> 33) - (((q63_t) b * d) >> 33) ); |
| *pDst++ = (q31_t) ( (((q63_t) a * d) >> 33) + (((q63_t) b * c) >> 33) ); |
|
|
| a = *pSrcA++; |
| b = *pSrcA++; |
| c = *pSrcB++; |
| d = *pSrcB++; |
| *pDst++ = (q31_t) ( (((q63_t) a * c) >> 33) - (((q63_t) b * d) >> 33) ); |
| *pDst++ = (q31_t) ( (((q63_t) a * d) >> 33) + (((q63_t) b * c) >> 33) ); |
|
|
| |
| blkCnt--; |
| } |
|
|
| |
| blkCnt = numSamples % 0x4U; |
|
|
| #else |
|
|
| |
| blkCnt = numSamples; |
|
|
| #endif |
|
|
| while (blkCnt > 0U) |
| { |
| |
| |
|
|
| a = *pSrcA++; |
| b = *pSrcA++; |
| c = *pSrcB++; |
| d = *pSrcB++; |
|
|
| |
| *pDst++ = (q31_t) ( (((q63_t) a * c) >> 33) - (((q63_t) b * d) >> 33) ); |
| *pDst++ = (q31_t) ( (((q63_t) a * d) >> 33) + (((q63_t) b * c) >> 33) ); |
|
|
| |
| blkCnt--; |
| } |
|
|
| } |
| #endif |
|
|
| |
| |
| |
|
|
| #endif |
|
|