DSP

STM32 DSP库函数详解

2019-07-13 09:38发布

对于每个函数,都存在浮点数和定点数的类型,由于使用方法是一致的,这里我们仅以32为浮点数为例来说明。 一.BasicMathFunctions 1.绝对值 pDst[n] = abs(pSrc[n]), 0 <= n < blockSize
示例 float32_t *pSrc; float32_t *pDst; uint32_t blocksize; arm_add_f32(pSrc,pDst,blocksize); 2.求和 pDst[n] = pSrcA[n] + pSrcB[n],      0 <= n < blockSize.
示例 float32_t *pSrcA; float32_t *pSrcB; float32_t *pDst; uint32_t blocksize; arm_add_f32(pSrcA,pSrcB,pDst,blocksize);3.点乘 sum = pSrcA[0]*pSrcB[0] + pSrcA[1]*pSrcB[1] + ... + pSrcA[blockSize-1]*pSrcB[blockSize-1]
示例 float32_t *pSrcA; float32_t *pSrcB; float32_t *result; uint32_t blocksize; arm_dot_prod_f32(pSrcA,pSrcB,blocksize,result);4.乘法 sum = pSrcA[0]*pSrcB[0] + pSrcA[1]*pSrcB[1] + ... + pSrcA[blockSize-1]*pSrcB[blockSize-1]
示例 float32_t *pSrcA; float32_t *pSrcB; float32_t *pDst; uint32_t blocksize; arm_mult_f32(pSrcA,pSrcB,blocksize,pDst);5.相反数 pDst[n] = -pSrc[n],      0 <= n < blockSize.   
示例 float32_t *pSrc; float32_t *pDst; uint32_t blocksize; arm_mult_f32(pSrcA,pDst,blocksize);6.偏移 pDst[n] = pSrc[n] + offset,      0 <= n < blockSize.  
示例 float32_t *pSrc; float32_t offset; float32_t *pDst; uint32_t blocksize; arm_offset_f32(pSrc,offset,pDst,blocksize);7.减法 pDst[n] = pSrcA[n] - pSrcB[n],   0 <= n < blockSize.     示例 float32_t *pSrcA; float32_t *pSrcB; float32_t *pDst; uint32_t blocksize; arm_sub_f32(pSrcA,pSrcB,pDst,blocksize);8.比例因子 pDst[n] = pSrc[n] * scale,      0 <= n < blockSize.    示例 float32_t *pSrc; float32_t scale; float32_t *pDst; uint32_t blocksize; arm_scale_f32(pSrc,scale,pDst,blocksize);二.FastMathFunctions 这一块的函数就是日常使用的一些math.h的函数,不多加赘述 float32_t    arm_cos_f32(float32_t x) ;
float32_t arm_sin_f32(float32_t x) ;
arm_status arm_sqrt_q31(q31_t in, q31_t * pOut);
三.StatisticsMathFunctions
这一块主要是一些在统计数据分析处理过程中经常会使用到的函数。 1.最大值 计算数组中的最大值,并返回数组中最大值和最大值在数组中的位置。 float32_t *pSrc; float32_t pResult; uint32_t blocksize; uint32_t pIndex; arm_max_f32(pSrc,blocksize,&pResult,&pIndex); 2.最小值 计算数组中的最小值,并返回数组中最大值和最大值在数组中的位置。与上述用法类似,不加赘述。 arm_min_f32(pSrc,blocksize,&pResult,&pIndex); 3.平均值 Result = (pSrc[0] + pSrc[1] + pSrc[2] + ... + pSrc[blockSize-1]) / blockSize;  float32_t *pSrc; float32_t pResult; uint32_t blocksize; arm_mean_f32(pSrc,blocksize,&pResult); 4.功率 Result = pSrc[0] * pSrc[0] + pSrc[1] * pSrc[1] + pSrc[2] * pSrc[2] + ... + pSrc[blockSize-1] * pSrc[blockSize-1];  float32_t *pSrc; float32_t pResult; uint32_t blocksize; arm_power_f32(pSrc,blocksize,&pResult); 5.标准差 Result = sqrt((sumOfSquares - sum2 / blockSize) / (blockSize - 1)) 
其中: 
sumOfSquares = pSrc[0] * pSrc[0] + pSrc[1] * pSrc[1] + ... + pSrc[blockSize-1] * pSrc[blockSize-1] 
sum = pSrc[0] + pSrc[1] + pSrc[2] + ... + pSrc[blockSize-1]    float32_t *pSrc; float32_t pResult; uint32_t blocksize; arm_std_f32(pSrc,blocksize,&pResult); 6.均方根 Result = sqrt(((pSrc[0] * pSrc[0] + pSrc[1] * pSrc[1] + ... + pSrc[blockSize-1] * pSrc[blockSize-1]) / blockSize)); float32_t *pSrc; float32_t pResult; uint32_t blocksize; arm_rms_f32(pSrc,blocksize,&pResult); 7.方差 同上类似 arm_var_f32(pSrc,blocksize,&pResult); 四.SupportFunctions
支持函数主要包括数据拷贝,赋值和类型转化。类型转化一般不需要在DSP中进行,故此处略去。 1.数据拷贝 pDst[n] = pSrc[n];      0 <= n < blockSize. void arm_copy_f32(float32_t * pSrc, float32_t * pDst, uint32_t blockSize)  2.数据填充
pDst[n] = value;      0 <= n < blockSize. void arm_fill_f32(float32_t value, float32_t * pDst, uint32_t blockSize)  五.ContrillerFunctions
这里主要介绍的是PID控制的函数部分。 PID控制器又叫比例积分微分控制器,是目前应用最广泛的控制器。对PID的参数整定方法网上有很多,我认为首先理解PID参数的意义更为重要,这里贴一个链接,https://www.zhihu.com/question/23088613/answer/81176620。 y[n] = y[n-1] + A0 * x[n] + A1 * x[n-1] + A2 * x[n-2]
A0 = Kp + Ki + Kd
A1 = (-Kp ) - (2 * Kd )
A2 = Kd

函数定义如下
static __INLINE float32_t arm_pid_f32(arm_pid_instance_f32 * S, float32_t in)  第一个参数为PID 结构体,第二个参数为采样时间,单位为ms。 typedef struct { float32_t A0; /**< The derived gain, A0 = Kp + Ki + Kd . */ float32_t A1; /**< The derived gain, A1 = -Kp - 2Kd. */ float32_t A2; /**< The derived gain, A2 = Kd . */ float32_t state[3]; /**< The state array of length 3. */ float32_t Kp; /**< The proportional gain. */ float32_t Ki; /**< The integral gain. */ float32_t Kd; /**< The derivative gain. */ } arm_pid_instance_f32;初始化函数 void arm_pid_init_f32(arm_pid_instance_f32 * S, int32_t resetStateFlag)
该函数是通过用户配置了Kp,Ki,Kd后,通过该函数获得A0,A1,A2。第二个参数是初始化标志位,设1即为初始化。 复位函数 void arm_pid_reset_f32(arm_pid_instance_f32 * S)  复位所有变量为0