| #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" |
|
|
| static void arm_small_blk_max_q7( |
| const q7_t * pSrc, |
| uint16_t blockSize, |
| q7_t * pResult, |
| uint32_t * pIndex) |
| { |
| int32_t blkCnt; |
| q7x16_t extremValVec = vdupq_n_s8(Q7_MIN); |
| q7_t maxValue = Q7_MIN; |
| uint8x16_t indexVec; |
| uint8x16_t extremIdxVec; |
| mve_pred16_t p0; |
| uint8_t extremIdxArr[16]; |
|
|
| indexVec = vidupq_u8(0U, 1); |
|
|
| blkCnt = blockSize; |
| do { |
| mve_pred16_t p = vctp8q(blkCnt); |
| q7x16_t extremIdxVal = vld1q_z_s8(pSrc, p); |
| |
| |
| |
| |
| p0 = vcmpgeq_m(extremIdxVal, extremValVec, p); |
|
|
| extremValVec = vorrq_m(extremValVec, extremIdxVal, extremIdxVal, p0); |
| |
| vst1q_p_u8(extremIdxArr, indexVec, p0); |
|
|
| indexVec += 16; |
| pSrc += 16; |
| blkCnt -= 16; |
| } |
| while (blkCnt > 0); |
|
|
|
|
| |
| maxValue = vmaxvq(maxValue, extremValVec); |
|
|
| |
| p0 = vcmpgeq(extremValVec, maxValue); |
| extremIdxVec = vld1q_u8(extremIdxArr); |
|
|
| indexVec = vpselq(extremIdxVec, vdupq_n_u8(blockSize - 1), p0); |
| *pIndex = vminvq_u8(blockSize - 1, indexVec); |
| *pResult = maxValue; |
| } |
|
|
| void arm_max_q7( |
| const q7_t * pSrc, |
| uint32_t blockSize, |
| q7_t * pResult, |
| uint32_t * pIndex) |
| { |
| int32_t totalSize = blockSize; |
| const uint16_t sub_blk_sz = UINT8_MAX + 1; |
|
|
| if (totalSize <= sub_blk_sz) |
| { |
| arm_small_blk_max_q7(pSrc, blockSize, pResult, pIndex); |
| } |
| else |
| { |
| uint32_t curIdx = 0; |
| q7_t curBlkExtr = Q7_MIN; |
| uint32_t curBlkPos = 0; |
| uint32_t curBlkIdx = 0; |
| |
| |
| |
| while (totalSize >= sub_blk_sz) |
| { |
| const q7_t *curSrc = pSrc; |
|
|
| arm_small_blk_max_q7(curSrc, sub_blk_sz, pResult, pIndex); |
| if (*pResult > curBlkExtr) |
| { |
| |
| |
| |
| curBlkExtr = *pResult; |
| curBlkPos = *pIndex; |
| curBlkIdx = curIdx; |
| } |
| curIdx++; |
| pSrc += sub_blk_sz; |
| totalSize -= sub_blk_sz; |
| } |
| |
| |
| |
| arm_small_blk_max_q7(pSrc, totalSize, pResult, pIndex); |
| if (*pResult > curBlkExtr) |
| { |
| curBlkExtr = *pResult; |
| curBlkPos = *pIndex; |
| curBlkIdx = curIdx; |
| } |
| *pIndex = curBlkIdx * sub_blk_sz + curBlkPos; |
| *pResult = curBlkExtr; |
| } |
| } |
| #else |
| void arm_max_q7( |
| const q7_t * pSrc, |
| uint32_t blockSize, |
| q7_t * pResult, |
| uint32_t * pIndex) |
| { |
| q7_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 |
|
|