目录

一、DSP 功能函数-定点数转换 浮点数转换 数据拷贝与填充

1、定点数转换(Fix to Float、Fix to Fix)

2、浮点数转换(Float to Fix)

3、数据拷贝(copy)

4、数据填充(Fill)

二、DSP 控制函数-更好用的 SIN, COS 计算

三、DSP 复数运算-共轭, 点乘,求模,模平方, 乘法和复数乘实数

1、复数共轭运算(ComplexConj)

2、复数点乘(ComplexDotProduct)

3、复数求模 ComplexMag

4、复数模平方(ComplexMagSquared)

5、复数乘法 (ComplexMultComplex)

6、复数乘实数(ComplexMultReal)

四、DSP 矩阵运算-加法, 减法,放缩, 乘法和转置矩阵

1、矩阵的初始化

2、矩阵数据的赋值

3、矩阵加法(MatAdd)

4、矩阵减法(MatSub)

5、矩阵放缩(MatScale)

6、矩阵乘法(MatMult)

7、转置矩阵(MatTrans)

五、辅助函数


一、DSP 功能函数-定点数转换 浮点数转换 数据拷贝与填充

1、定点数转换(Fix to Float、Fix to Fix)

        实现定点数与定点数、定点数与浮点数的转换,其中可选数据长度的大小,即支持变量与数组的运算。

        定点和定点的转换本质就是移位的过程,而定点与浮点转换则为(float32_t) pSrc[n] / (128或32767或2147483648);

arm_q7_to_float 函数用于定点数 Q7 转浮点数
arm_q7_to_q31 函数用于定点 Q7 转定点数 Q31
arm_q7_to_q15 函数用于定点数 Q7 转定点数 Q15
arm_q15_to_float 函数用于定点数 Q15 转浮点数
arm_q15_to_q31 函数用于定点 Q15 转定点数 Q31
arm_q15_to_q7 函数用于定点数 Q15 转定点数 Q7
arm_q31_to_float 函数用于定点数 Q31 转浮点数
arm_q31_to_q15 函数用于定点 Q31 转定点数 Q15
arm_q31_to_q7 函数用于定点数 Q31 转定点数 Q7

2、浮点数转换(Float to Fix)

        实现浮点数与定点数的转换,其中可选数据长度的大小,即支持变量与数组的运算。

        浮点与定点转换则为(q31_t或q15_t或q7_t) pSrc[n] *(128或32767或2147483648);

arm_float_to_q7 函数用于浮点数转定点数 Q7
arm_float_to_q15 函数用于浮点数转定点数 Q15
arm_float_to_q31 函数用于浮点数转定点数 Q31

3、数据拷贝(copy)

        这部分函数用于数据拷贝,公式描述如下,其中可选数据长度的大小,即支持变量与数组的运算。

        pDst[n] = pSrc[n]; 0 <= n < blockSize

arm_copy_f32 用于 32 位浮点数的数据拷贝
arm_copy_q31 用于 32 位定点数的数据拷贝
arm_copy_q15 用于 16 位定点数的数据拷贝
arm_copy_q7 用于 8 位定点数的数据拷贝

4、数据填充(Fill)

        这部分函数用于数据填充,公式描述如下,其中可选数据长度的大小,即支持变量与数组的运算。

        pDst[n] = value; 0 <= n < blockSize

arm_fill_f32 用于 32 位浮点数的数据填充
arm_fill_q31 用于 32 位定点数的数据填充
arm_fill_q15 用于 16 位定点数的数据填充
arm_fill_q7 用于 8 位定点数的数据填充

二、DSP 控制函数-更好用的 SIN, COS 计算

        使用表查找法和线性插值方式来计算正弦和余弦值。

arm_sin_cos_f32 计算余弦值与正弦值的 32 位浮点数
arm_sin_cos_q31 计算余弦值与正弦值的 32 位定点数

三、DSP 复数运算-共轭, 点乘,求模,模平方, 乘法和复数乘实数

1、复数共轭运算(ComplexConj)

        这部分函数用于复数共轭运算,公式描述如下,其中可选数据长度的大小,即支持变量与数组的运算。

 for(n=0; n<numSamples; n++)

{

        pDst[(2*n)+0)] = pSrc[(2*n)+0]; // 实部

        pDst[(2*n)+1)] = -pSrc[(2*n)+1]; // 虚部

}

        用代数式来表示a+bi的共轭就是a-bi。

arm_cmplx_conj_f32 用于 32 位浮点数的复数共轭求解
arm_cmplx_conj_q31 用于 32 位定点数的复数共轭求解
arm_cmplx_conj_q15 用于 16 位定点数的复数共轭求解

2、复数点乘(ComplexDotProduct)

        这部分函数用于复数共轭运算,公式描述如下,其中可选数据长度的大小,即支持变量与数组的运算。

realResult = 0; imagResult = 0;

for (n = 0; n < numSamples; n++) {

        realResult += pSrcA[(2*n)+0] * pSrcB[(2*n)+0] - pSrcA[(2*n)+1] * pSrcB[(2*n)+1]; //实部

        imagResult += pSrcA[(2*n)+0] * pSrcB[(2*n)+1] + pSrcA[(2*n)+1] * pSrcB[(2*n)+0]; //虚部

}

        用代数式来表示复数乘法就是: (a+bi)(c+di)=(ac-bd)+(ad+bc)i

arm_cmplx_dot_prod_f32 用于 32 位浮点数的复数点乘
arm_cmplx_dot_prod_q31 用于 32 位定点数的复数点乘
arm_cmplx_dot_prod_q15 用于 16 位定点数的复数点乘

3、复数求模 ComplexMag

        这部分函数用于复数求模,公式描述如下,其中可选数据长度的大小,即支持变量与数组的运算。

for (n = 0; n < numSamples; n++) {

        pDst[n] = sqrt(pSrc[(2*n)+0]^2 + pSrc[(2*n)+1]^2);

}

        用代数式来表示复数乘法就是: |a+bi|=√𝑎2 + 𝑏2 。

arm_cmplx_mag_f32 用于 32 位浮点数的复数求模
arm_cmplx_mag_q31 用于 32 位定点数的复数求模
arm_cmplx_mag_q15 用于 16 位定点数的复数求模

4、复数模平方(ComplexMagSquared)

        这部分函数用于复数求模平方,公式描述如下,其中可选数据长度的大小,即支持变量与数组的运算。

for(n=0; n<numSamples; n++)

{ pDst[n] = pSrc[(2*n)+0]^2 + pSrc[(2*n)+1]^2; }

        用代数式来表示模平方: |a+bi|^2 = a2 + b2

arm_cmplx_mag_squared_f32 用于 32 位浮点数的复数求模平方
arm_cmplx_mag_squared_q31 用于 32 位定点数的复数求模平方
arm_cmplx_mag_squared_q15 用于 16 位定点数的复数求模平方

5、复数乘法 (ComplexMultComplex)

        这部分函数用于复数乘复数,公式描述如下,其中可选数据长度的大小,即支持变量与数组的运算。

for (n = 0; n < numSamples; n++) {

        pDst[(2*n)+0] = pSrcA[(2*n)+0] * pSrcB[(2*n)+0] - pSrcA[(2*n)+1] * pSrcB[(2*n)+1];         pDst[(2*n)+1] = pSrcA[(2*n)+0] * pSrcB[(2*n)+1] + pSrcA[(2*n)+1] * pSrcB[(2*n)+0];

}

        用代数式来表示复数乘法: (a+bi) *(c+di) =(ac -bd) +(ad+bc) i

arm_cmplx_mult_cmplx_f32 用于 32 位浮点数的复数乘复数
arm_cmplx_mult_cmplx_q31 用于 32 位定点数的复数乘复数
arm_cmplx_mult_cmplx_q15 用于 16 位定点数的复数乘复数

6、复数乘实数(ComplexMultReal)

        这部分函数用于复数乘实数,公式描述如下,其中可选数据长度的大小,即支持变量与数组的运算。

for(n=0; n<numSamples; n++) {

        pCmplxDst[(2*n)+0] = pSrcCmplx[(2*n)+0] * pSrcReal[n];

        pCmplxDst[(2*n)+1] = pSrcCmplx[(2*n)+1] * pSrcReal[n];

}

        用代数式来表示复数乘法: a*(c+di) =ac+adi。

arm_cmplx_mult_real_f32 用于 32 位浮点数的复数乘32 位浮点数的实数
arm_cmplx_mult_real_q31 用于 32 位定点数的复数乘32 位定点数的实数
arm_cmplx_mult_real_q15 用于 16 位定点数的复数乘16 位定点数的实数

四、DSP 矩阵运算-加法, 减法,放缩, 乘法和转置矩阵

1、矩阵的初始化

        用于矩阵结构体成员的初始化, 浮点格式矩阵结构体定义如下:

typedef struct
{
    uint16_t numRows; // 矩阵行数.
    uint16_t numCols; // 矩阵列数
    float32_t *pData; // 矩阵地址
} arm_matrix_instance_f32

        定点数Q31格式矩阵结构体定义如下:

typedef struct
{
    uint16_t numRows; // 矩阵行数.
    uint16_t numCols; // 矩阵列数
    q31_t *pData; // 矩阵地址
} arm_matrix_instance_f32

         定点数Q15格式矩阵结构体定义如下:

typedef struct
{
    uint16_t numRows; // 矩阵行数.
    uint16_t numCols; // 矩阵列数
    q15_t *pData; // 矩阵地址
} arm_matrix_instance_f32

2、矩阵数据的赋值

        以数组赋给结构体。

arm_mat_init_f32 用于 32 位浮点数的矩阵数据初始化
arm_mat_init_q31 用于 32 位定点数的矩阵数据初始化
arm_mat_init_q15 用于 16 位定点数的矩阵数据初始化

3、矩阵加法(MatAdd)

arm_mat_add_f32 用于 32 位浮点数的矩阵数据的加法
arm_mat_add_q31 用于 32 位定点数的矩阵数据的加法
arm_mat_add_q15 用于 16 位定点数的矩阵数据的加法

4、矩阵减法(MatSub)

arm_mat_sub_f32 用于 32 位浮点数的矩阵数据的减法
arm_mat_sub_q31 用于 32 位定点数的矩阵数据的减法
arm_mat_sub_q15 用于 16 位定点数的矩阵数据的减法

5、矩阵放缩(MatScale)

arm_mat_scale_f32 用于 32 位浮点数的矩阵数据的放缩
arm_mat_scale_q31 用于 32 位定点数的矩阵数据的放缩
arm_mat_scale_q15 用于 16 位定点数的矩阵数据的放缩

6、矩阵乘法(MatMult)

arm_mat_mult_f32 用于 32 位浮点数的矩阵乘法
arm_mat_mult_q31 用于 32 位定点数的矩阵乘法
arm_mat_mult_q15 用于 16 位定点数的矩阵乘法

7、转置矩阵(MatTrans)

arm_mat_trans_f32 用于 32 位浮点数的矩阵转置
arm_mat_trans_q31 用于 32 位定点数的矩阵转置
arm_mat_trans_q15 用于 16 位定点数的矩阵转置

五、辅助函数

float arm_snr_f32(float *pRef, float *pTest, uint32_t buffSize)
uint32_t arm_compare_fixed_q31(q31_t *pIn, q31_t * pOut, uint32_t numSamples)
uint32_t arm_compare_fixed_q15(q15_t *pIn, q15_t *pOut, uint32_t numSamples)
void arm_provide_guard_bits_q31 (q31_t * input_buf, uint32_t blockSize,uint32_t guard_bits)
void arm_provide_guard_bits_q15 (q15_t * input_buf, uint32_t blockSize, uint32_t guard_bits)
void arm_provide_guard_bits_q7 (q7_t * input_buf, uint32_t blockSize, uint32_t guard_bits)
uint32_t arm_calc_guard_bits (uint32_t num_adds)
void arm_apply_guard_bits (float32_t *pIn, uint32_t numSamples, uint32_t guard_bits)
uint32_t arm_calc_2pow(uint32_t numShifts)
void arm_clip_f32 (float *pIn, uint32_t numSamples)
void arm_float_to_q12_20(float *pIn, q31_t * pOut, uint32_t numSamples)
void arm_float_to_q14 (float *pIn, q15_t *pOut, uint32_t numSamples)
void arm_float_to_q28 (float *pIn, q31_t *pOut, uint32_t numSamples)
void arm_float_to_q29 (float *pIn, q31_t *pOut, uint32_t numSamples)
void arm_float_to_q30 (float *pIn, q31_t * pOut, uint32_t numSamples)
Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐