/* * 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 * @{ */ #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 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 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 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 int16 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 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 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 */ 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 */ 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 */ 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 */ 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 */ 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 */ 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 */ void lsp_cmplx_scale_f32(const float *pSrc, float re_scale, float im_scale, float *pDst, uint32_t blkCnt, uint8_t isConj); #ifdef __cplusplus } #endif /** * @} */ #endif /* MK_LSP_H_ */