| #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_MVEF) && !defined(ARM_MATH_AUTOVECTORIZE) |
|
|
| void arm_cmplx_dot_prod_f32( |
| const float32_t * pSrcA, |
| const float32_t * pSrcB, |
| uint32_t numSamples, |
| float32_t * realResult, |
| float32_t * imagResult) |
| { |
| int32_t blkCnt; |
| float32_t real_sum, imag_sum; |
| f32x4_t vecSrcA, vecSrcB; |
| f32x4_t vec_acc = vdupq_n_f32(0.0f); |
| f32x4_t vecSrcC, vecSrcD; |
|
|
| blkCnt = numSamples >> 2; |
| blkCnt -= 1; |
| if (blkCnt > 0) { |
| |
| vecSrcA = vld1q(pSrcA); |
| vecSrcB = vld1q(pSrcB); |
| pSrcA += 4; |
| pSrcB += 4; |
|
|
| while (blkCnt > 0) { |
| vec_acc = vcmlaq(vec_acc, vecSrcA, vecSrcB); |
| vecSrcC = vld1q(pSrcA); |
| pSrcA += 4; |
|
|
| vec_acc = vcmlaq_rot90(vec_acc, vecSrcA, vecSrcB); |
| vecSrcD = vld1q(pSrcB); |
| pSrcB += 4; |
|
|
| vec_acc = vcmlaq(vec_acc, vecSrcC, vecSrcD); |
| vecSrcA = vld1q(pSrcA); |
| pSrcA += 4; |
|
|
| vec_acc = vcmlaq_rot90(vec_acc, vecSrcC, vecSrcD); |
| vecSrcB = vld1q(pSrcB); |
| pSrcB += 4; |
| |
| |
| |
| blkCnt--; |
| } |
|
|
| |
| vec_acc = vcmlaq(vec_acc, vecSrcA, vecSrcB); |
| vecSrcC = vld1q(pSrcA); |
|
|
| vec_acc = vcmlaq_rot90(vec_acc, vecSrcA, vecSrcB); |
| vecSrcD = vld1q(pSrcB); |
|
|
| vec_acc = vcmlaq(vec_acc, vecSrcC, vecSrcD); |
| vec_acc = vcmlaq_rot90(vec_acc, vecSrcC, vecSrcD); |
|
|
| |
| |
| |
| blkCnt = CMPLX_DIM * (numSamples & 3); |
| while (blkCnt > 0) { |
| mve_pred16_t p = vctp32q(blkCnt); |
| pSrcA += 4; |
| pSrcB += 4; |
| vecSrcA = vldrwq_z_f32(pSrcA, p); |
| vecSrcB = vldrwq_z_f32(pSrcB, p); |
| vec_acc = vcmlaq_m(vec_acc, vecSrcA, vecSrcB, p); |
| vec_acc = vcmlaq_rot90_m(vec_acc, vecSrcA, vecSrcB, p); |
| blkCnt -= 4; |
| } |
| } else { |
| |
| blkCnt = numSamples * CMPLX_DIM; |
| vec_acc = vdupq_n_f32(0.0f); |
|
|
| do { |
| mve_pred16_t p = vctp32q(blkCnt); |
|
|
| vecSrcA = vldrwq_z_f32(pSrcA, p); |
| vecSrcB = vldrwq_z_f32(pSrcB, p); |
|
|
| vec_acc = vcmlaq_m(vec_acc, vecSrcA, vecSrcB, p); |
| vec_acc = vcmlaq_rot90_m(vec_acc, vecSrcA, vecSrcB, p); |
|
|
| |
| |
| |
| |
| pSrcA += 4; |
| pSrcB += 4; |
| blkCnt -= 4; |
| } |
| while (blkCnt > 0); |
| } |
|
|
| real_sum = vgetq_lane(vec_acc, 0) + vgetq_lane(vec_acc, 2); |
| imag_sum = vgetq_lane(vec_acc, 1) + vgetq_lane(vec_acc, 3); |
|
|
| |
| |
| |
| *realResult = real_sum; |
| *imagResult = imag_sum; |
| } |
|
|
| #else |
| void arm_cmplx_dot_prod_f32( |
| const float32_t * pSrcA, |
| const float32_t * pSrcB, |
| uint32_t numSamples, |
| float32_t * realResult, |
| float32_t * imagResult) |
| { |
| uint32_t blkCnt; |
| float32_t real_sum = 0.0f, imag_sum = 0.0f; |
| float32_t a0,b0,c0,d0; |
|
|
| #if defined(ARM_MATH_NEON) && !defined(ARM_MATH_AUTOVECTORIZE) |
| float32x4x2_t vec1,vec2,vec3,vec4; |
| float32x4_t accR,accI; |
| float32x2_t accum = vdup_n_f32(0); |
|
|
| accR = vdupq_n_f32(0.0f); |
| accI = vdupq_n_f32(0.0f); |
|
|
| |
| blkCnt = numSamples >> 3U; |
|
|
| while (blkCnt > 0U) |
| { |
| |
| |
|
|
| vec1 = vld2q_f32(pSrcA); |
| vec2 = vld2q_f32(pSrcB); |
|
|
| |
| pSrcA += 8; |
| pSrcB += 8; |
|
|
| |
| accR = vmlaq_f32(accR,vec1.val[0],vec2.val[0]); |
| accR = vmlsq_f32(accR,vec1.val[1],vec2.val[1]); |
|
|
| |
| accI = vmlaq_f32(accI,vec1.val[1],vec2.val[0]); |
| accI = vmlaq_f32(accI,vec1.val[0],vec2.val[1]); |
|
|
| vec3 = vld2q_f32(pSrcA); |
| vec4 = vld2q_f32(pSrcB); |
| |
| |
| pSrcA += 8; |
| pSrcB += 8; |
|
|
| |
| accR = vmlaq_f32(accR,vec3.val[0],vec4.val[0]); |
| accR = vmlsq_f32(accR,vec3.val[1],vec4.val[1]); |
|
|
| |
| accI = vmlaq_f32(accI,vec3.val[1],vec4.val[0]); |
| accI = vmlaq_f32(accI,vec3.val[0],vec4.val[1]); |
|
|
| |
| blkCnt--; |
| } |
|
|
| accum = vpadd_f32(vget_low_f32(accR), vget_high_f32(accR)); |
| real_sum += vget_lane_f32(accum, 0) + vget_lane_f32(accum, 1); |
|
|
| accum = vpadd_f32(vget_low_f32(accI), vget_high_f32(accI)); |
| imag_sum += vget_lane_f32(accum, 0) + vget_lane_f32(accum, 1); |
|
|
| |
| blkCnt = numSamples & 0x7; |
|
|
| #else |
| #if defined (ARM_MATH_LOOPUNROLL) && !defined(ARM_MATH_AUTOVECTORIZE) |
|
|
| |
| blkCnt = numSamples >> 2U; |
|
|
| while (blkCnt > 0U) |
| { |
| a0 = *pSrcA++; |
| b0 = *pSrcA++; |
| c0 = *pSrcB++; |
| d0 = *pSrcB++; |
|
|
| real_sum += a0 * c0; |
| imag_sum += a0 * d0; |
| real_sum -= b0 * d0; |
| imag_sum += b0 * c0; |
|
|
| a0 = *pSrcA++; |
| b0 = *pSrcA++; |
| c0 = *pSrcB++; |
| d0 = *pSrcB++; |
|
|
| real_sum += a0 * c0; |
| imag_sum += a0 * d0; |
| real_sum -= b0 * d0; |
| imag_sum += b0 * c0; |
|
|
| a0 = *pSrcA++; |
| b0 = *pSrcA++; |
| c0 = *pSrcB++; |
| d0 = *pSrcB++; |
|
|
| real_sum += a0 * c0; |
| imag_sum += a0 * d0; |
| real_sum -= b0 * d0; |
| imag_sum += b0 * c0; |
|
|
| a0 = *pSrcA++; |
| b0 = *pSrcA++; |
| c0 = *pSrcB++; |
| d0 = *pSrcB++; |
|
|
| real_sum += a0 * c0; |
| imag_sum += a0 * d0; |
| real_sum -= b0 * d0; |
| imag_sum += b0 * c0; |
|
|
| |
| blkCnt--; |
| } |
|
|
| |
| blkCnt = numSamples % 0x4U; |
|
|
| #else |
|
|
| |
| blkCnt = numSamples; |
|
|
| #endif |
| #endif |
|
|
| while (blkCnt > 0U) |
| { |
| a0 = *pSrcA++; |
| b0 = *pSrcA++; |
| c0 = *pSrcB++; |
| d0 = *pSrcB++; |
|
|
| real_sum += a0 * c0; |
| imag_sum += a0 * d0; |
| real_sum -= b0 * d0; |
| imag_sum += b0 * c0; |
|
|
| |
| blkCnt--; |
| } |
|
|
| |
| *realResult = real_sum; |
| *imagResult = imag_sum; |
| } |
| #endif |
|
|
| |
| |
| |
|
|
| #endif |
|
|