| #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) |
|
|
| #include "edge-impulse-sdk/CMSIS/DSP/Include/arm_helium_utils.h" |
|
|
| void arm_cmplx_dot_prod_f16( |
| const float16_t * pSrcA, |
| const float16_t * pSrcB, |
| uint32_t numSamples, |
| float16_t * realResult, |
| float16_t * imagResult) |
| { |
| int32_t blkCnt; |
| float16_t real_sum, imag_sum; |
| f16x8_t vecSrcA, vecSrcB; |
| f16x8_t vec_acc = vdupq_n_f16(0.0f16); |
| f16x8_t vecSrcC, vecSrcD; |
|
|
| blkCnt = (numSamples >> 3); |
| blkCnt -= 1; |
| if (blkCnt > 0) { |
| |
| vecSrcA = vld1q( pSrcA); |
| vecSrcB = vld1q( pSrcB); |
| pSrcA += 8; |
| pSrcB += 8; |
|
|
| while (blkCnt > 0) { |
| vec_acc = vcmlaq(vec_acc, vecSrcA, vecSrcB); |
| vecSrcC = vld1q(pSrcA); |
| pSrcA += 8; |
|
|
| vec_acc = vcmlaq_rot90(vec_acc, vecSrcA, vecSrcB); |
| vecSrcD = vld1q(pSrcB); |
| pSrcB += 8; |
|
|
| vec_acc = vcmlaq(vec_acc, vecSrcC, vecSrcD); |
| vecSrcA = vld1q(pSrcA); |
| pSrcA += 8; |
|
|
| vec_acc = vcmlaq_rot90(vec_acc, vecSrcC, vecSrcD); |
| vecSrcB = vld1q(pSrcB); |
| pSrcB += 8; |
| |
| |
| |
| 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 & 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 = vcmlaq_m(vec_acc, vecSrcA, vecSrcB, p); |
| vec_acc = vcmlaq_rot90_m(vec_acc, vecSrcA, vecSrcB, p); |
|
|
| blkCnt -= 8; |
| } |
| } else { |
| |
| blkCnt = numSamples * CMPLX_DIM; |
| vec_acc = vdupq_n_f16(0.0f16); |
|
|
| do { |
| mve_pred16_t p = vctp16q(blkCnt); |
|
|
| vecSrcA = vldrhq_z_f16(pSrcA, p); |
| vecSrcB = vldrhq_z_f16(pSrcB, p); |
|
|
| vec_acc = vcmlaq_m(vec_acc, vecSrcA, vecSrcB, p); |
| vec_acc = vcmlaq_rot90_m(vec_acc, vecSrcA, vecSrcB, p); |
|
|
| |
| |
| |
| |
| pSrcA += 8; |
| pSrcB += 8; |
| blkCnt -= 8; |
| } |
| while (blkCnt > 0); |
| } |
|
|
| |
| mve_cmplx_sum_intra_r_i_f16(vec_acc, real_sum, imag_sum); |
|
|
| |
| |
| |
| *realResult = real_sum; |
| *imagResult = imag_sum; |
| } |
|
|
| #else |
| void arm_cmplx_dot_prod_f16( |
| const float16_t * pSrcA, |
| const float16_t * pSrcB, |
| uint32_t numSamples, |
| float16_t * realResult, |
| float16_t * imagResult) |
| { |
| uint32_t blkCnt; |
| _Float16 real_sum = 0.0f, imag_sum = 0.0f; |
| _Float16 a0,b0,c0,d0; |
|
|
| #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 |
|
|
| 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 |
|
|
| #endif |
|
|