| #include "edge-impulse-sdk/dsp/config.hpp" |
| #if EIDSP_LOAD_CMSIS_DSP_SOURCES |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
|
|
| #include <limits.h> |
| #include <math.h> |
|
|
| #include "edge-impulse-sdk/CMSIS/DSP/Include/dsp/support_functions.h" |
|
|
| |
| |
| |
| |
|
|
|
|
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
|
|
| #if defined(ARM_MATH_MVEF) && !defined(ARM_MATH_AUTOVECTORIZE) |
|
|
| #include "edge-impulse-sdk/CMSIS/DSP/Include/arm_helium_utils.h" |
|
|
| float32_t arm_weighted_sum_f32(const float32_t *in,const float32_t *weigths, uint32_t blockSize) |
| { |
| float32_t accum1, accum2; |
| f32x4_t accum1V, accum2V; |
| f32x4_t inV, wV; |
| const float32_t *pIn, *pW; |
| uint32_t blkCnt; |
|
|
|
|
| pIn = in; |
| pW = weigths; |
|
|
|
|
| accum1V = vdupq_n_f32(0.0); |
| accum2V = vdupq_n_f32(0.0); |
|
|
| blkCnt = blockSize >> 2; |
| while (blkCnt > 0) |
| { |
| inV = vld1q(pIn); |
| wV = vld1q(pW); |
|
|
| pIn += 4; |
| pW += 4; |
|
|
| accum1V = vfmaq(accum1V, inV, wV); |
| accum2V = vaddq(accum2V, wV); |
| blkCnt--; |
| } |
|
|
| accum1 = vecAddAcrossF32Mve(accum1V); |
| accum2 = vecAddAcrossF32Mve(accum2V); |
|
|
| blkCnt = blockSize & 3; |
| while(blkCnt > 0) |
| { |
| accum1 += *pIn++ * *pW; |
| accum2 += *pW++; |
| blkCnt--; |
| } |
|
|
|
|
| return (accum1 / accum2); |
| } |
|
|
| #else |
| #if defined(ARM_MATH_NEON) |
|
|
| #include "NEMath.h" |
| float32_t arm_weighted_sum_f32(const float32_t *in,const float32_t *weigths, uint32_t blockSize) |
| { |
|
|
| float32_t accum1, accum2; |
| float32x4_t accum1V, accum2V; |
| float32x2_t tempV; |
|
|
| float32x4_t inV,wV; |
|
|
| const float32_t *pIn, *pW; |
| uint32_t blkCnt; |
|
|
|
|
| pIn = in; |
| pW = weigths; |
|
|
| accum1=0.0f; |
| accum2=0.0f; |
|
|
| accum1V = vdupq_n_f32(0.0f); |
| accum2V = vdupq_n_f32(0.0f); |
|
|
| blkCnt = blockSize >> 2; |
| while(blkCnt > 0) |
| { |
| inV = vld1q_f32(pIn); |
| wV = vld1q_f32(pW); |
|
|
| pIn += 4; |
| pW += 4; |
|
|
| accum1V = vmlaq_f32(accum1V,inV,wV); |
| accum2V = vaddq_f32(accum2V,wV); |
| blkCnt--; |
| } |
|
|
| tempV = vpadd_f32(vget_low_f32(accum1V),vget_high_f32(accum1V)); |
| accum1 = vget_lane_f32(tempV, 0) + vget_lane_f32(tempV, 1); |
|
|
| tempV = vpadd_f32(vget_low_f32(accum2V),vget_high_f32(accum2V)); |
| accum2 = vget_lane_f32(tempV, 0) + vget_lane_f32(tempV, 1); |
|
|
| blkCnt = blockSize & 3; |
| while(blkCnt > 0) |
| { |
| accum1 += *pIn++ * *pW; |
| accum2 += *pW++; |
| blkCnt--; |
| } |
|
|
|
|
| return(accum1 / accum2); |
| } |
| #else |
| float32_t arm_weighted_sum_f32(const float32_t *in, const float32_t *weigths, uint32_t blockSize) |
| { |
|
|
| float32_t accum1, accum2; |
| const float32_t *pIn, *pW; |
| uint32_t blkCnt; |
|
|
|
|
| pIn = in; |
| pW = weigths; |
|
|
| accum1=0.0f; |
| accum2=0.0f; |
|
|
| blkCnt = blockSize; |
| while(blkCnt > 0) |
| { |
| accum1 += *pIn++ * *pW; |
| accum2 += *pW++; |
| blkCnt--; |
| } |
|
|
| return(accum1 / accum2); |
| } |
| #endif |
| #endif |
|
|
| |
| |
| |
|
|
| #endif |
|
|