/* * Copyright (c) 2019-2023 Beijing Hanwei Innovation Technology Ltd. Co. and * its subsidiaries and affiliates (collectly called MKSEMI). * * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * 1. Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * * 2. Redistributions in binary form, except as embedded into an MKSEMI * integrated circuit in a product or a software update for such product, * must reproduce the above copyright notice, this list of conditions and * the following disclaimer in the documentation and/or other materials * provided with the distribution. * * 3. Neither the name of MKSEMI nor the names of its contributors may be used * to endorse or promote products derived from this software without * specific prior written permission. * * 4. This software, with or without modification, must only be used with a * MKSEMI integrated circuit. * * 5. Any software provided in binary form under this license must not be * reverse engineered, decompiled, modified and/or disassembled. * * THIS SOFTWARE IS PROVIDED BY MKSEMI "AS IS" AND ANY EXPRESS OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY, NONINFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE ARE * DISCLAIMED. IN NO EVENT SHALL MKSEMI OR CONTRIBUTORS BE LIABLE FOR ANY * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #ifndef MK_LSP_H_ #define MK_LSP_H_ #include "mk_common.h" #ifndef LSP_INT_MODE_EN #define LSP_INT_MODE_EN (1) #endif /** * @addtogroup MK8000_LSP * @{ */ /** * @brief Instance structure for the floating-point matrix structure. */ struct LSP_MATRIX_T { uint16_t num_rows; /**< number of rows of the matrix. */ uint16_t num_cols; /**< number of columns of the matrix. */ float *data; /**< points to the data of the matrix. */ }; #ifdef __cplusplus extern "C" { #endif /** * @brief open LSP. * * @param int_en interrupt enable flag * @param callback register a callback */ int lsp_open(uint8_t int_en, drv_callback_t callback); /** * @brief close LSP. */ int lsp_close(void); /** * @brief Floating-point vector addition. * @param[in] pSrcA points to the first input vector * @param[in] pSrcB points to the second input vector * @param[out] pDst points to the output vector * @param[in] blkCnt number of samples in each vector */ void lsp_add_f32(const float *pSrcA, const float *pSrcB, float *pDst, uint32_t blkCnt); /** * @brief 8bit integer vector addition. * @param[in] pSrcA points to the first input vector * @param[in] pSrcB points to the second input vector * @param[out] pDst points to the output vector * @param[in] blkCnt number of samples in each vector */ void lsp_add_int8(const int8_t *pSrcA, const int8_t *pSrcB, int16_t *pDst, uint32_t blkCnt); /** * @brief 16bit integer vector addition. * @param[in] pSrcA points to the first input vector * @param[in] pSrcB points to the second input vector * @param[out] pDst points to the output vector * @param[in] blkCnt number of samples in each vector */ void lsp_add_int16(const int16_t *pSrcA, const int16_t *pSrcB, int32_t *pDst, uint32_t blkCnt); /** * @brief 32bit integer vector addition. * @param[in] pSrcA points to the first input vector * @param[in] pSrcB points to the second input vector * @param[out] pDst points to the output vector * @param[in] blkCnt number of samples in each vector */ void lsp_add_int32(const int32_t *pSrcA, const int32_t *pSrcB, int32_t *pDst, uint32_t blkCnt); /** * @brief Floating-point vector subtraction. * @param[in] pSrcA points to the first input vector * @param[in] pSrcB points to the second input vector * @param[out] pDst points to the output vector * @param[in] blkCnt number of samples in each vector */ void lsp_sub_f32(const float *pSrcA, const float *pSrcB, float *pDst, uint32_t blkCnt); /** * @brief 8bit integer vector subtraction. * @param[in] pSrcA points to the first input vector * @param[in] pSrcB points to the second input vector * @param[out] pDst points to the output vector * @param[in] blkCnt number of samples in each vector */ void lsp_sub_int8(const int8_t *pSrcA, const int8_t *pSrcB, int16_t *pDst, uint32_t blkCnt); /** * @brief 16bit integer vector subtraction. * @param[in] pSrcA points to the first input vector * @param[in] pSrcB points to the second input vector * @param[out] pDst points to the output vector * @param[in] blkCnt number of samples in each vector */ void lsp_sub_int16(const int16_t *pSrcA, const int16_t *pSrcB, int32_t *pDst, uint32_t blkCnt); /** * @brief 32bit integer vector subtraction. * @param[in] pSrcA points to the first input vector * @param[in] pSrcB points to the second input vector * @param[out] pDst points to the output vector * @param[in] blkCnt number of samples in each vector */ void lsp_sub_int32(const int32_t *pSrcA, const int32_t *pSrcB, int32_t *pDst, uint32_t blkCnt); /** * @brief Floating-point vector multiplication. * @param[in] pSrcA points to the first input vector * @param[in] pSrcB points to the second input vector * @param[out] pDst points to the output vector * @param[in] blkCnt number of samples in each vector */ void lsp_mult_f32(const float *pSrcA, const float *pSrcB, float *pDst, uint32_t blkCnt); /** * @brief 8bit integer vector multiplication. * @param[in] pSrcA points to the first input vector * @param[in] pSrcB points to the second input vector * @param[out] pDst points to the output vector * @param[in] blkCnt number of samples in each vector */ void lsp_mult_int8(const int8_t *pSrcA, const int8_t *pSrcB, int16_t *pDst, uint32_t blkCnt); /** * @brief 16bit integer vector multiplication. * @param[in] pSrcA points to the first input vector * @param[in] pSrcB points to the second input vector * @param[out] pDst points to the output vector * @param[in] blkCnt number of samples in each vector */ void lsp_mult_int16(const int16_t *pSrcA, const int16_t *pSrcB, int32_t *pDst, uint32_t blkCnt); /** * @brief 32bit integer vector multiplication. * @param[in] pSrcA points to the first input vector * @param[in] pSrcB points to the second input vector * @param[out] pDst points to the output vector * @param[in] blkCnt number of samples in each vector */ void lsp_mult_int32(const int32_t *pSrcA, const int32_t *pSrcB, int32_t *pDst, uint32_t blkCnt); /** * @brief Floating-point vector inverse. * @param[in] pSrc points to the instance of the input vector. * @param[out] pDst points to the instance of the output vector. * @param[in] blkCnt number of samples in intput vector */ void lsp_vinverse_f32(const float *pSrc, float *pDst, uint32_t blkCnt); /** * @brief 8bit integer vector inverse. * @param[in] pSrc points to the instance of the input vector. * @param[out] pDst points to the instance of the output vector. * @param[in] blkCnt number of samples in intput vector */ void lsp_vinverse_int8(const int8_t *pSrc, float *pDst, uint32_t blkCnt); /** * @brief 16bit integer vector inverse. * @param[in] pSrc points to the instance of the input vector. * @param[out] pDst points to the instance of the output vector. * @param[in] blkCnt number of samples in intput vector */ void lsp_vinverse_int16(const int16_t *pSrc, float *pDst, uint32_t blkCnt); /** * @brief 32bit integer vector inverse. * @param[in] pSrc points to the instance of the input vector. * @param[out] pDst points to the instance of the output vector. * @param[in] blkCnt number of samples in intput vector */ void lsp_vinverse_int32(const int32_t *pSrc, float *pDst, uint32_t blkCnt); /** * @brief Floating-point vector inner product. * @param[in] pSrcA points to the first input vector * @param[in] pSrcB points to the second input vector * @param[out] pDst points to the output vector * @param[in] blkCnt number of samples in each vector */ void lsp_inner_product_f32(const float *pSrcA, const float *pSrcB, float *pDst, uint32_t blkCnt); /** * @brief 8bit integer vector inner product. * @param[in] pSrcA points to the first input vector * @param[in] pSrcB points to the second input vector * @param[out] pDst points to the output vector * @param[in] blkCnt number of samples in each vector */ void lsp_inner_product_int8(const int8_t *pSrcA, const int8_t *pSrcB, int32_t *pDst, uint32_t blkCnt); /** * @brief 16bit integer vector inner product. * @param[in] pSrcA points to the first input vector * @param[in] pSrcB points to the second input vector * @param[out] pDst points to the output vector * @param[in] blkCnt number of samples in each vector */ void lsp_inner_product_int16(const int16_t *pSrcA, const int16_t *pSrcB, float *pDst, uint32_t blkCnt); /** * @brief 32bit integer vector inner product. * @param[in] pSrcA points to the first input vector * @param[in] pSrcB points to the second input vector * @param[out] pDst points to the output vector * @param[in] blkCnt number of samples in each vector */ void lsp_inner_product_int32(const int32_t *pSrcA, const int32_t *pSrcB, float *pDst, uint32_t blkCnt); /** * @brief Floating-point vector inner product searching to find out the maximum or minimum result. * @param[in] pSrcA points to the first input vector * @param[in] srcALen the length of input vector SrcA, srcALen <= 16 * @param[in] pSrcB points to the second input vector * @param[in] iterations iteration times * @param[out] pDst points to the output vector * @param[in] isMax maximum or minimum * @return the maximum or minimum inner product iteration count */ uint32_t lsp_correlate_f32(const float *pSrcA, uint32_t srcALen, const int8_t *pSrcB, uint32_t iterations, float *pDst, uint8_t isMax); /** * @brief Multiplies a floating-point vector by a scalar. * @param[in] pSrc points to the input vector * @param[in] scale scale factor to be applied * @param[out] pDst points to the output vector * @param[in] blkCnt number of samples in the vector */ void lsp_scale_f32(const float *pSrc, float scale, float *pDst, uint32_t blkCnt); /** * @brief integer 8 complex-by-complex multiplication * @param[in] pSrcA points to the first input vector * @param[in] pSrcB points to the second input vector * @param[out] pDst points to the output vector * @param[in] numSamples number of complex samples in each vector * @param[in] isConj conjugate enbale or disable */ void lsp_cmplx_mult_cmplx_int8(const int8_t *pSrcA, const int8_t *pSrcB, int16_t *pDst, uint32_t numSamples, uint8_t isConj); /** * @brief integer 16 complex-by-complex multiplication * @param[in] pSrcA points to the first input vector * @param[in] pSrcB points to the second input vector * @param[out] pDst points to the output vector * @param[in] numSamples number of complex samples in each vector * @param[in] isConj conjugate enbale or disable */ void lsp_cmplx_mult_cmplx_int16(const int16_t *pSrcA, const int16_t *pSrcB, int32_t *pDst, uint32_t numSamples, uint8_t isConj); /** * @brief Floating-point complex-by-complex multiplication * @param[in] pSrcA points to the first input vector * @param[in] pSrcB points to the second input vector * @param[out] pDst points to the output vector * @param[in] numSamples number of complex samples in each vector * @param[in] isConj conjugate enbale or disable */ void lsp_cmplx_mult_cmplx_f32(const float *pSrcA, const float *pSrcB, float *pDst, uint32_t numSamples, uint8_t isConj); /** * @brief 8bit integer complex vector inner product, output integer format. * @param[in] pSrcA points to the first input vector * @param[in] pSrcB points to the second input vector * @param[out] pDst points to the output vector * @param[in] numSamples number of complex samples in each vector * @param[in] isConj conjugate enbale or disable */ void lsp_cmplx_inner_product_int8(const int8_t *pSrcA, const int8_t *pSrcB, int32_t *pDst, uint32_t numSamples, uint8_t isConj); /** * @brief 16bit integer complex vector inner product. * @param[in] pSrcA points to the first input vector * @param[in] pSrcB points to the second input vector * @param[out] pDst points to the output vector * @param[in] numSamples number of complex samples in each vector * @param[in] isConj conjugate enbale or disable */ void lsp_cmplx_inner_product_int16(const int16_t *pSrcA, const int16_t *pSrcB, float *pDst, uint32_t numSamples, uint8_t isConj); /** * @brief Floating-point complex vector inner product. * @param[in] pSrcA points to the first input vector * @param[in] pSrcB points to the second input vector * @param[out] pDst points to the output vector * @param[in] numSamples number of complex samples in each vector * @param[in] isConj conjugate enbale or disable */ void lsp_cmplx_inner_product_f32(const float *pSrcA, const float *pSrcB, float *pDst, uint32_t numSamples, uint8_t isConj); /** * @brief Multiplies a floating-point complex vector by a scalar. * @param[in] pSrc points to the input vector * @param[in] re_scale scale factor to be applied on real part * @param[in] im_scale scale factor to be applied on imaginary part * @param[out] pDst points to the output vector * @param[in] blkCnt number of complex samples in the vector * @param[in] isConj conjugate enbale or disable */ void lsp_cmplx_scale_f32(const float *pSrc, float re_scale, float im_scale, float *pDst, uint32_t blkCnt, uint8_t isConj); /** * @brief Floating-point matrix inverse. * @param[in] pSrc points to the instance of the input floating-point matrix structure. * @param[out] pDst points to the instance of the output floating-point matrix structure. * @param[in] rv matrix regularization */ void lsp_cmplx_mat_inverse_f32(const struct LSP_MATRIX_T *pSrc, struct LSP_MATRIX_T *pDst, float rv); /** * @brief Floating-point matrix LDL factorization. * @param[in] pSrc points to the instance of the input floating-point matrix structure. * @param[out] pDst points to the instance of the output floating-point matrix structure. * @param[in] rv matrix regularization */ void lsp_cmplx_mat_ldl_f32(const struct LSP_MATRIX_T *pSrc, struct LSP_MATRIX_T *pDst, float rv); /** * @brief Floating-point matrix multiplication * @param[in] pSrcA points to the first input matrix structure * @param[in] pSrcB points to the second input matrix structure * @param[out] pDst points to output matrix structure */ void lsp_mat_mult_f32(const struct LSP_MATRIX_T *pSrcA, const struct LSP_MATRIX_T *pSrcB, struct LSP_MATRIX_T *pDst); /** * @brief Floating-point complex matrix multiplication * @param[in] pSrcA points to the first input matrix structure * @param[in] pSrcB points to the second input matrix structure * @param[out] pDst points to output matrix structure * @param[out] isConj conjugate enbale or disable */ void lsp_cmplx_mat_mult_f32(const struct LSP_MATRIX_T *pSrcA, const struct LSP_MATRIX_T *pSrcB, struct LSP_MATRIX_T *pDst, uint8_t isConj); #ifdef __cplusplus } #endif /** * @} */ #endif /* MK_LSP_H_ */