xref: /aosp_15_r20/external/armnn/samples/common/include/Audio/MathUtils.hpp (revision 89c4ff92f2867872bb9e2354d150bf0c8c502810)
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