381 lines
		
	
	
		
			15 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			381 lines
		
	
	
		
			15 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| /****************************************************************************
 | |
| 
 | |
| Copyright(c) 2019 by Aerospace C.Power (Chongqing) Microelectronics. ALL RIGHTS RESERVED.
 | |
| 
 | |
| This Information is proprietary to Aerospace C.Power (Chongqing) Microelectronics and MAY NOT
 | |
| be copied by any method or incorporated into another program without
 | |
| the express written consent of Aerospace C.Power. This Information or any portion
 | |
| thereof remains the property of Aerospace C.Power. The Information contained herein
 | |
| is believed to be accurate and Aerospace C.Power assumes no responsibility or
 | |
| liability for its use in any way and conveys no license or title under
 | |
| any patent or copyright and makes no representation or warranty that this
 | |
| Information is free from patent or copyright infringement.
 | |
| 
 | |
| ****************************************************************************/
 | |
| 
 | |
| #ifndef IOT_MATRIX_API_H
 | |
| #define IOT_MATRIX_API_H
 | |
| 
 | |
| #ifdef __cplusplus
 | |
| extern "C" {
 | |
| #endif
 | |
| 
 | |
| /** \defgroup MATRIX_APIs MATRIX APIs
 | |
|  *  @brief MATRIX APIs
 | |
|  *
 | |
|  *
 | |
|  */
 | |
| 
 | |
| /** @addtogroup MATRIX_APIs
 | |
|  * @{
 | |
|  *
 | |
|  */
 | |
| 
 | |
| /**
 | |
|  * @brief Usage:
 | |
| 
 | |
|     // test case : 4x4 matrix, get matrix inverse , and count times is 14
 | |
| 
 | |
|     // count times
 | |
|     uint32_t count = 14;
 | |
|     // prepare source matrix data, data length is (4*4*2)*14 word
 | |
|     float *src = ...;
 | |
| 
 | |
|     // prepare destination matrix data, data length is (4*4*2)*14 word
 | |
|     float *dst = ...;
 | |
| 
 | |
|     iot_math_mtx_inverse(dst, src, CHOL_SIZE_4X4, count);
 | |
| 
 | |
|     // test case 4x4 matrix A, B, get the matrix of AxB, and count times is 14
 | |
| 
 | |
|     // uint32_t count = 14;
 | |
|     // prepare source matrix data, data length is (4*4*2)*14 word
 | |
|     float *mtx_a = ...;
 | |
|     float *mtx_b = ...;
 | |
| 
 | |
|     // prepare destination matrix data, data length is (4*4*2)*14 word
 | |
|     float *dst = ...;
 | |
| 
 | |
|     // input matrix
 | |
|     iot_math_cmm_cfg(mtx_a, 4, 4, 0, mtx_b, 4, 4, 0);
 | |
| 
 | |
|     // multiplication: AxB
 | |
|     iot_math_cmm_ab(dst, CMM_CONV_A, CMM_CONV_B, num);
 | |
| 
 | |
|     // multiplication: AxBxB.'
 | |
|     iot_math_cmm_abc(dst,
 | |
|         CMM_CONV_A, CMM_CONV_B, CMM_CONV_C, CMM_CONV_B_CONJ_TRAN, num);
 | |
| 
 | |
|     // multiplication: AxBxA.'xB.'
 | |
|     iot_math_cmm_abc(dst,
 | |
|         CMM_CONV_A, CMM_CONV_B, CMM_CONV_C, CMM_CONV_C_CONJ_TRAN, num);
 | |
| 
 | |
|  */
 | |
| 
 | |
| /**
 | |
|   * @brief matrix size.
 | |
|   */
 | |
| typedef enum {
 | |
|     CHOL_SIZE_3X3 = 0,
 | |
|     CHOL_SIZE_4X4 = 1,
 | |
|     CHOL_SIZE_5X5 = 2,
 | |
|     CHOL_SIZE_6X6 = 3,
 | |
|     CHOL_SIZE_7X7 = 4,
 | |
|     CHOL_SIZE_8X8 = 5,
 | |
| 
 | |
|     CHOL_SIZE_MAX,
 | |
| } chol_ctrl_size_t;
 | |
| 
 | |
| typedef enum {
 | |
|     CMM_CONV_A = 0,             // matrix A
 | |
|     CMM_CONV_A_CONJ = 1,        // matrix A conjugate
 | |
|     CMM_CONV_A_TRAN = 2,        // matrix B transpose
 | |
|     CMM_CONV_A_CONJ_TRAN = 3,   // matrix B conjugate transpose
 | |
|     CMM_CONV_B = 4,             // matrix B
 | |
|     CMM_CONV_B_CONJ = 5,        // matrix B conjugate
 | |
|     CMM_CONV_B_TRAN = 6,        // matrix B transpose
 | |
|     CMM_CONV_B_CONJ_TRAN = 7,   // matrix B conjugate transpose
 | |
|     CMM_CONV_C = 8,             // matrix C
 | |
|     CMM_CONV_C_CONJ = 9,        // matrix C conjugate
 | |
|     CMM_CONV_C_TRAN = 10,       // matrix C transpose
 | |
|     CMM_CONV_C_CONJ_TRAN = 11,  // matrix C conjugate transpose
 | |
| } cmm_op_conv_t;
 | |
| 
 | |
| typedef enum _iot_mtx_err {
 | |
|     MTX_OK = 0,                 // no error
 | |
|     MTX_OUT_INFINITY = 1,       // output is infinity
 | |
|     MTX_IN_NAN = 2,             // input is NaN
 | |
|     MTX_OUT_TINY = 3,           // output is tiny
 | |
|     MTX_OUT_OVER_MAX = 4,       // output is greater than max number
 | |
| } iot_mtx_err_t;
 | |
| 
 | |
| /**
 | |
|  * @brief iot_math_mtx_inverse() - get the inverse of the matrix,the matrix data
 | |
|                         type is float, and each element has real and imaginary
 | |
|                         part, the matrix input element(Ann) format in memory
 | |
|                         follows as below:
 | |
| 
 | |
|                         0       31          63
 | |
|                         |-------|-----------|
 | |
|                         | real  | imaginary |   A01
 | |
|                         |-------|-----------|
 | |
|                         | real  | imaginary |   A02
 | |
|                         |-------|-----------|
 | |
|                                 ...
 | |
|                         |-------|-----------|
 | |
|                         | real  | imaginary |   Aii
 | |
|                         |-------|-----------|
 | |
|                                 ...
 | |
|                         |-------|-----------|
 | |
|                         | real  | imaginary |   Ann
 | |
|                         |-------|-----------|
 | |
|                                 .
 | |
|                                 . repeat(num)
 | |
|                                 .
 | |
|                         The number of repetition is (input param num).
 | |
| 
 | |
|                         Output format is same as input.
 | |
| 
 | |
|  * @param dst           the destination pointer of inverse matrix
 | |
|  * @param src           the source pointer of matrix
 | |
|  * @param size          the size of matrix, reference to chol_ctrl_size_t define
 | |
|  * @param num           the count of operation, minimum value is 1
 | |
|  *
 | |
|  * @return              0 -- ok
 | |
|  * @return              others -- reference to iot_mtx_err_t
 | |
|  */
 | |
| uint8_t iot_math_mtx_inverse
 | |
|         (float *dst, const float *src, uint8_t size, uint16_t num);
 | |
| 
 | |
| /**
 | |
|  * @brief iot_math_mtx_det() - get the determinant of the matrix,the matrix data
 | |
|                         type is float, and each element has real and imaginary
 | |
|                         part, the matrix input element(Ann) format in memory
 | |
|                         follows as below:
 | |
| 
 | |
|                         0       31          63
 | |
|                         |-------|-----------|
 | |
|                         | real  | imaginary |   A01
 | |
|                         |-------|-----------|
 | |
|                         | real  | imaginary |   A02
 | |
|                         |-------|-----------|
 | |
|                                 ...
 | |
|                         |-------|-----------|
 | |
|                         | real  | imaginary |   Aii
 | |
|                         |-------|-----------|
 | |
|                                 ...
 | |
|                         |-------|-----------|
 | |
|                         | real  | imaginary |   Ann
 | |
|                         |-------|-----------|
 | |
|                                 .
 | |
|                                 . repeat(num)
 | |
|                                 .
 | |
|                         The number of repetition is (input param num).
 | |
| 
 | |
|                         Output format is a 32-bit data.
 | |
| 
 | |
|  * @param dst           the destination pointer of determinant
 | |
|  * @param src           the source pointer of matrix
 | |
|  * @param size          the size of matrix, reference to chol_ctrl_size_t define
 | |
|  * @param num           the count of operation, minimum value is 1
 | |
|  *
 | |
|  * @return              0 -- ok
 | |
|  * @return              others -- reference to iot_mtx_err_t
 | |
|  */
 | |
| uint8_t iot_math_mtx_det
 | |
|         (float *dst, const float *src, uint8_t size, uint16_t num);
 | |
| 
 | |
| /**
 | |
|  * @brief iot_math_mtx_inv_det() - get the determinant of the matrix,the matrix
 | |
|                         data type is float, and each element has real and
 | |
|                         imaginary part, the matrix input element(Ann) format in
 | |
|                         memory follows as below:
 | |
| 
 | |
|                         0       31          63
 | |
|                         |-------|-----------|
 | |
|                         | real  | imaginary |   A01
 | |
|                         |-------|-----------|
 | |
|                         | real  | imaginary |   A02
 | |
|                         |-------|-----------|
 | |
|                                 ...
 | |
|                         |-------|-----------|
 | |
|                         | real  | imaginary |   Aii
 | |
|                         |-------|-----------|
 | |
|                                 ...
 | |
|                         |-------|-----------|
 | |
|                         | real  | imaginary |   Ann
 | |
|                         |-------|-----------|
 | |
|                                 .
 | |
|                                 . repeat(num)
 | |
|                                 .
 | |
|                         The number of repetition is (input param num).
 | |
| 
 | |
|                         Output format is same as input,and one more 32-bit data:
 | |
| 
 | |
|  * @param inv           the destination pointer of inverse matrix
 | |
|  * @param det           the destination pointer of determinant
 | |
|  * @param src           the source pointer of matrix
 | |
|  * @param size          the size of matrix, reference to chol_ctrl_size_t define
 | |
|  * @param num           the count of operation, minimum value is 1
 | |
|  *
 | |
|  * @return              0 -- ok
 | |
|  * @return              others -- reference to iot_mtx_err_t
 | |
|  */
 | |
| uint8_t iot_math_mtx_inv_det
 | |
|         (float *inv, float *det, const float *src, uint8_t size, uint16_t num);
 | |
| 
 | |
| /**
 | |
|  * @brief iot_math_mtx_cholesky() - get the cholesky matrix,the matrix data
 | |
|                         type is float, and each element has real and imaginary
 | |
|                         part, the matrix input element(Ann) format in memory
 | |
|                         follows as below:
 | |
| 
 | |
|                         0       31          63
 | |
|                         |-------|-----------|
 | |
|                         | real  | imaginary |   A(01)
 | |
|                         |-------|-----------|
 | |
|                         | real  | imaginary |   A(02)
 | |
|                         |-------|-----------|
 | |
|                                 ...
 | |
|                         |-------|-----------|
 | |
|                         | real  | imaginary |   A(ii)
 | |
|                         |-------|-----------|
 | |
|                                 ...
 | |
|                         |-------|-----------|
 | |
|                         | real  | imaginary |   A(nn)
 | |
|                         |-------|-----------|
 | |
|                                 .
 | |
|                                 . repeat(num)
 | |
|                                 .
 | |
|                         The number of repetition is (input param num).
 | |
| 
 | |
|                         Output format is a 32-bit data.
 | |
| 
 | |
|  * @param dst           the destination pointer of cholesky matrix
 | |
|  * @param src           the source pointer of matrix
 | |
|  * @param size          the size of matrix, reference to chol_ctrl_size_t define
 | |
|  * @param num           the count of operation, minimum value is 1
 | |
|  *
 | |
|  * @return              0 -- ok
 | |
|  * @return              others -- reference to iot_mtx_err_t
 | |
|  */
 | |
| uint8_t iot_math_mtx_cholesky
 | |
|         (float *dst, const float *src, uint8_t size, uint16_t num);
 | |
| 
 | |
| /**
 | |
|  * @brief iot_math_mtx_eig() - get the max eigenvalue and eigenvectorof the
 | |
|                         matrix, the matrix data type is float, and each element
 | |
|                         has real and imaginary part, the matrix input element
 | |
|                         (Ann) format in memory follows as below:
 | |
| 
 | |
|                         0       31          63
 | |
|                         |-------|-----------|
 | |
|                         | real  | imaginary |   A(01)
 | |
|                         |-------|-----------|
 | |
|                         | real  | imaginary |   A(02)
 | |
|                         |-------|-----------|
 | |
|                                 ...
 | |
|                         |-------|-----------|
 | |
|                         | real  | imaginary |   A(ii)
 | |
|                         |-------|-----------|
 | |
|                                 ...
 | |
|                         |-------|-----------|
 | |
|                         | real  | imaginary |   A(nn),
 | |
|                         |-------|-----------|
 | |
|                                 .
 | |
|                                 . repeat(num)
 | |
|                                 .
 | |
|                         The number of repetition is (input param num).
 | |
| 
 | |
|                         Output format follows as below:
 | |
| 
 | |
|                         0       31          63
 | |
|                         |-------|-----------|
 | |
|                         | real  | imaginary |   Vec(0)
 | |
|                         |-------|-----------|
 | |
|                         | real  | imaginary |   Vec(1)
 | |
|                         |-------|-----------|
 | |
|                                 ...
 | |
|                         |-------|-----------|
 | |
|                         | real  | imaginary |   Vec(i)
 | |
|                         |-------|-----------|
 | |
|                                 ...
 | |
|                         |-------|-----------|
 | |
|                         | real  | imaginary |   Vec(n)
 | |
|                         |-------|-----------|
 | |
|                         | norm^2| eig       |
 | |
|                                 .
 | |
|                                 . repeat(num)
 | |
|                                 .
 | |
|                         The number of repetition is (input param num).
 | |
| 
 | |
|                         The max eigenvector is not normalized, if need,
 | |
|                         eigenvector shoule be divided by the square root of norm
 | |
| 
 | |
|  * @param eigvec        the destination pointer of eigenvector
 | |
|  * @param norm          the destination pointer of norm
 | |
|  * @param eigval        the destination pointer of eigenvalue
 | |
|  * @param src           the source pointer of matrix
 | |
|  * @param size          the size of matrix, reference to chol_ctrl_size_t define
 | |
|  * @param num           the count of operation, minimum value is 1
 | |
|  *
 | |
|  * @return              0 -- ok
 | |
|  * @return              others -- reference to iot_mtx_err_t
 | |
|  */
 | |
| uint8_t iot_math_mtx_eig(float *eigvec, float *norm, float *eigval,
 | |
|         const float *src, uint8_t size, uint16_t num);
 | |
| 
 | |
| /**
 | |
|  * @brief iot_math_cmm_cfg() - configure matrix multiplication input
 | |
|                         if only one operation matrix, set the param as NULL
 | |
|  * @param a             the destination pointer of the first operation matrix A
 | |
|  * @param ar            the row length of matrix A
 | |
|  * @param ac            the column length of matrix A
 | |
|  * @param adiag         whether the matrix A is diagonal or not
 | |
|  * @param b             the destination pointer of the first operation matrix B
 | |
|  * @param br            the row length of matrix B
 | |
|  * @param ac            the column length of matrix B
 | |
|  * @param bdiag         whether the matrix B is diagonal or not
 | |
|  */
 | |
| void iot_math_cmm_cfg(float *a, uint8_t ar, uint8_t ac, uint8_t adiag,
 | |
|         float *b, uint8_t br, uint8_t bc, uint8_t bdiag);
 | |
| 
 | |
| /**
 | |
|  * @brief iot_math_cmm_ab() - get matrix multiplication , the format as AxB
 | |
| 
 | |
|  * @param dst           the destination pointer of multiplication result
 | |
|  * @param op0           the transform of matrix A, reference to cmm_op_conv_t
 | |
|  * @param op1           the transform of matrix B, reference to cmm_op_conv_t
 | |
|  * @param num           the count of operation, minimum value is 1
 | |
|  */
 | |
| void iot_math_cmm_ab(float *dst, uint8_t op0, uint8_t op1, uint16_t num);
 | |
| 
 | |
| /**
 | |
|  * @brief iot_math_cmm_abc() - get matrix multiplication , the format as AxBxC,
 | |
|                         the first operation is AxB, and then multiply with C,
 | |
|                         C can be matrix A, B or the result of the first
 | |
|                         operation , also transform matrix.
 | |
|                         Such as,
 | |
|                             (A)x(B)x(A.*) = (AxB)x(A.*)
 | |
|                         first operation
 | |
|                             op0: CMM_CONV_A, op1: CMM_CONV_B
 | |
|                         seconnd operation
 | |
|                             op2: CMM_CONV_C, op3: CMM_CONV_A_CONJ_TRAN
 | |
| 
 | |
|  * @param dst           the destination pointer of multiplication result
 | |
|  * @param op0           the transform of matrix, reference to cmm_op_conv_t
 | |
|  * @param op1           the transform of matrix, reference to cmm_op_conv_t
 | |
|  * @param op2           the transform of matrix, reference to cmm_op_conv_t
 | |
|  * @param op3           the transform of matrix, reference to cmm_op_conv_t
 | |
|  * @param num           the count of operation, minimum value is 1
 | |
|  */
 | |
| void iot_math_cmm_abc(float *dst,
 | |
|         uint8_t op0, uint8_t op1, uint8_t op2, uint8_t op3, uint16_t num);
 | |
| 
 | |
| 
 | |
| #ifdef __cplusplus
 | |
| }
 | |
| #endif
 | |
| 
 | |
| #endif //IOT_MATRIX_API_H
 |