STM32单片机芯片与内部113 DSP-功能函数、控制函数、复数运算、矩阵运算、辅助运算
介绍了STM32 DSP的功能函数、控制函数、复数运算、矩阵运算、辅助函数等。
目录
一、DSP 功能函数-定点数转换 浮点数转换 数据拷贝与填充
1、定点数转换(Fix to Float、Fix to Fix)
三、DSP 复数运算-共轭, 点乘,求模,模平方, 乘法和复数乘实数
一、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)

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