1*89c4ff92SAndroid Build Coastguard Worker // 2*89c4ff92SAndroid Build Coastguard Worker // Copyright © 2020 Arm Ltd and Contributors. All rights reserved. 3*89c4ff92SAndroid Build Coastguard Worker // SPDX-License-Identifier: MIT 4*89c4ff92SAndroid Build Coastguard Worker // 5*89c4ff92SAndroid Build Coastguard Worker 6*89c4ff92SAndroid Build Coastguard Worker #include <vector> 7*89c4ff92SAndroid Build Coastguard Worker #include <cmath> 8*89c4ff92SAndroid Build Coastguard Worker #include <cstdint> 9*89c4ff92SAndroid Build Coastguard Worker #include <numeric> 10*89c4ff92SAndroid Build Coastguard Worker 11*89c4ff92SAndroid Build Coastguard Worker class MathUtils 12*89c4ff92SAndroid Build Coastguard Worker { 13*89c4ff92SAndroid Build Coastguard Worker 14*89c4ff92SAndroid Build Coastguard Worker public: 15*89c4ff92SAndroid Build Coastguard Worker 16*89c4ff92SAndroid Build Coastguard Worker /** 17*89c4ff92SAndroid Build Coastguard Worker * @brief Computes the FFT for the input vector 18*89c4ff92SAndroid Build Coastguard Worker * @param[in] input Floating point vector of input elements 19*89c4ff92SAndroid Build Coastguard Worker * @param[out] fftOutput Output buffer to be populated by computed 20*89c4ff92SAndroid Build Coastguard Worker * FFTs 21*89c4ff92SAndroid Build Coastguard Worker * @return none 22*89c4ff92SAndroid Build Coastguard Worker */ 23*89c4ff92SAndroid Build Coastguard Worker static void FftF32(std::vector<float>& input, 24*89c4ff92SAndroid Build Coastguard Worker std::vector<float>& fftOutput); 25*89c4ff92SAndroid Build Coastguard Worker 26*89c4ff92SAndroid Build Coastguard Worker 27*89c4ff92SAndroid Build Coastguard Worker /** 28*89c4ff92SAndroid Build Coastguard Worker * @brief Computes the dot product of two 1D floating point 29*89c4ff92SAndroid Build Coastguard Worker * vectors. 30*89c4ff92SAndroid Build Coastguard Worker * result = sum(srcA[0]*srcB[0] + srcA[1]*srcB[1] + ..) 31*89c4ff92SAndroid Build Coastguard Worker * @param[in] srcPtrA pointer to the first element of first 32*89c4ff92SAndroid Build Coastguard Worker * array 33*89c4ff92SAndroid Build Coastguard Worker * @param[in] srcPtrB pointer to the first element of second 34*89c4ff92SAndroid Build Coastguard Worker * array 35*89c4ff92SAndroid Build Coastguard Worker * @param[in] srcLen Number of elements in the array/vector 36*89c4ff92SAndroid Build Coastguard Worker * @return dot product 37*89c4ff92SAndroid Build Coastguard Worker */ 38*89c4ff92SAndroid Build Coastguard Worker static float DotProductF32(const float* srcPtrA, float* srcPtrB, 39*89c4ff92SAndroid Build Coastguard Worker int srcLen); 40*89c4ff92SAndroid Build Coastguard Worker 41*89c4ff92SAndroid Build Coastguard Worker /** 42*89c4ff92SAndroid Build Coastguard Worker * @brief Computes the squared magnitude of floating point 43*89c4ff92SAndroid Build Coastguard Worker * complex number array. 44*89c4ff92SAndroid Build Coastguard Worker * @param[in] ptrSrc pointer to the first element of input 45*89c4ff92SAndroid Build Coastguard Worker * array 46*89c4ff92SAndroid Build Coastguard Worker * @param[in] srcLen Number of elements in the array/vector 47*89c4ff92SAndroid Build Coastguard Worker * @param[out] ptrDst Output buffer to be populated 48*89c4ff92SAndroid Build Coastguard Worker * @param[in] dstLen output buffer len (for sanity check only) 49*89c4ff92SAndroid Build Coastguard Worker * @return true if successful, false otherwise 50*89c4ff92SAndroid Build Coastguard Worker */ 51*89c4ff92SAndroid Build Coastguard Worker static bool ComplexMagnitudeSquaredF32(const float* ptrSrc, 52*89c4ff92SAndroid Build Coastguard Worker int srcLen, 53*89c4ff92SAndroid Build Coastguard Worker float* ptrDst, 54*89c4ff92SAndroid Build Coastguard Worker int dstLen); 55*89c4ff92SAndroid Build Coastguard Worker 56*89c4ff92SAndroid Build Coastguard Worker /** 57*89c4ff92SAndroid Build Coastguard Worker * @brief Computes the natural logarithms of input floating point 58*89c4ff92SAndroid Build Coastguard Worker * vector 59*89c4ff92SAndroid Build Coastguard Worker * @param[in] input Floating point input vector 60*89c4ff92SAndroid Build Coastguard Worker * @param[out] output Pre-allocated buffer to be populated with 61*89c4ff92SAndroid Build Coastguard Worker * natural log values of each input element 62*89c4ff92SAndroid Build Coastguard Worker * @return none 63*89c4ff92SAndroid Build Coastguard Worker */ 64*89c4ff92SAndroid Build Coastguard Worker static void VecLogarithmF32(std::vector <float>& input, 65*89c4ff92SAndroid Build Coastguard Worker std::vector <float>& output); 66*89c4ff92SAndroid Build Coastguard Worker 67*89c4ff92SAndroid Build Coastguard Worker /** 68*89c4ff92SAndroid Build Coastguard Worker * @brief Gets the mean of a floating point array of elements 69*89c4ff92SAndroid Build Coastguard Worker * @param[in] ptrSrc pointer to the first element 70*89c4ff92SAndroid Build Coastguard Worker * @param[in] srcLen Number of elements in the array/vector 71*89c4ff92SAndroid Build Coastguard Worker * @return average value 72*89c4ff92SAndroid Build Coastguard Worker */ 73*89c4ff92SAndroid Build Coastguard Worker static float MeanF32(const float* ptrSrc, uint32_t srcLen); 74*89c4ff92SAndroid Build Coastguard Worker 75*89c4ff92SAndroid Build Coastguard Worker /** 76*89c4ff92SAndroid Build Coastguard Worker * @brief Gets the standard deviation of a floating point array 77*89c4ff92SAndroid Build Coastguard Worker * of elements 78*89c4ff92SAndroid Build Coastguard Worker * @param[in] ptrSrc pointer to the first element 79*89c4ff92SAndroid Build Coastguard Worker * @param[in] srcLen Number of elements in the array/vector 80*89c4ff92SAndroid Build Coastguard Worker * @param[in] mean pre-computed mean value 81*89c4ff92SAndroid Build Coastguard Worker * @return standard deviation value 82*89c4ff92SAndroid Build Coastguard Worker */ 83*89c4ff92SAndroid Build Coastguard Worker static float StdDevF32(const float* ptrSrc, uint32_t srcLen, 84*89c4ff92SAndroid Build Coastguard Worker float mean); 85*89c4ff92SAndroid Build Coastguard Worker }; 86