| #include "edge-impulse-sdk/dsp/config.hpp" |
| #if EIDSP_LOAD_CMSIS_DSP_SOURCES |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
|
|
| #include "edge-impulse-sdk/CMSIS/DSP/Include/dsp/statistics_functions.h" |
|
|
| |
| |
| |
|
|
| |
| |
| |
| |
|
|
| |
| |
| |
| |
| |
| |
| |
| |
| #if defined(ARM_MATH_MVEI) && !defined(ARM_MATH_AUTOVECTORIZE) |
|
|
| #include "edge-impulse-sdk/CMSIS/DSP/Include/arm_helium_utils.h" |
|
|
| void arm_max_q15( |
| const q15_t * pSrc, |
| uint32_t blockSize, |
| q15_t * pResult, |
| uint32_t * pIndex) |
| { |
| int32_t blkCnt; |
| q15x8_t extremValVec = vdupq_n_s16(Q15_MIN); |
| q15_t maxValue = Q15_MIN; |
| uint16x8_t indexVec; |
| uint16x8_t extremIdxVec; |
| mve_pred16_t p0; |
| uint16_t extremIdxArr[8]; |
|
|
| indexVec = vidupq_u16(0U, 1); |
|
|
| blkCnt = blockSize; |
| do { |
| mve_pred16_t p = vctp16q(blkCnt); |
| q15x8_t extremIdxVal = vld1q_z_s16(pSrc, p); |
| |
| |
| |
| |
| p0 = vcmpgeq_m(extremIdxVal, extremValVec, p); |
|
|
| extremValVec = vorrq_m(extremValVec, extremIdxVal, extremIdxVal, p0); |
| |
| vst1q_p_u16(extremIdxArr, indexVec, p0); |
|
|
| indexVec += 8; |
| pSrc += 8; |
| blkCnt -= 8; |
| } |
| while (blkCnt > 0); |
|
|
|
|
| |
| maxValue = vmaxvq(maxValue, extremValVec); |
|
|
| |
| p0 = vcmpgeq(extremValVec, maxValue); |
| extremIdxVec = vld1q_u16(extremIdxArr); |
|
|
| indexVec = vpselq(extremIdxVec, vdupq_n_u16(blockSize - 1), p0); |
| *pIndex = vminvq(blockSize - 1, indexVec); |
| *pResult = maxValue; |
| } |
|
|
| #else |
| void arm_max_q15( |
| const q15_t * pSrc, |
| uint32_t blockSize, |
| q15_t * pResult, |
| uint32_t * pIndex) |
| { |
| q15_t maxVal, out; |
| uint32_t blkCnt, outIndex; |
|
|
| #if defined (ARM_MATH_LOOPUNROLL) |
| uint32_t index; |
| #endif |
|
|
| |
| outIndex = 0U; |
| |
| out = *pSrc++; |
|
|
| #if defined (ARM_MATH_LOOPUNROLL) |
| |
| index = 0U; |
|
|
| |
| blkCnt = (blockSize - 1U) >> 2U; |
|
|
| while (blkCnt > 0U) |
| { |
| |
| maxVal = *pSrc++; |
|
|
| |
| if (out < maxVal) |
| { |
| |
| out = maxVal; |
| outIndex = index + 1U; |
| } |
|
|
| maxVal = *pSrc++; |
| if (out < maxVal) |
| { |
| out = maxVal; |
| outIndex = index + 2U; |
| } |
|
|
| maxVal = *pSrc++; |
| if (out < maxVal) |
| { |
| out = maxVal; |
| outIndex = index + 3U; |
| } |
|
|
| maxVal = *pSrc++; |
| if (out < maxVal) |
| { |
| out = maxVal; |
| outIndex = index + 4U; |
| } |
|
|
| index += 4U; |
|
|
| |
| blkCnt--; |
| } |
|
|
| |
| blkCnt = (blockSize - 1U) % 4U; |
|
|
| #else |
|
|
| |
| blkCnt = (blockSize - 1U); |
|
|
| #endif |
|
|
| while (blkCnt > 0U) |
| { |
| |
| maxVal = *pSrc++; |
|
|
| |
| if (out < maxVal) |
| { |
| |
| out = maxVal; |
| outIndex = blockSize - blkCnt; |
| } |
|
|
| |
| blkCnt--; |
| } |
|
|
| |
| *pResult = out; |
| *pIndex = outIndex; |
| } |
| #endif |
| |
| |
| |
|
|
| #endif |
|
|