历史上的今天
今天是:2024年11月28日(星期四)
2019年11月28日 | STM32 DSP库函数详解
2019-11-28 来源:eefocus
对于每个函数,都存在浮点数和定点数的类型,由于使用方法是一致的,这里我们仅以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
史海拾趣
|
在当前岗位上,PCB设计本不是份内工作,但是所里的PCB设计部门那工作效率实在无法忍受,快过年了出差外协也很是不方便。手头的项目里三个板子还是蛮急的,希望年前都能发出去制板,无奈之下只能选择自己动手。过去自己设计的PCB两层板较多,大都是 ...… 查看全部问答> |
|
STATUS bootLoadModule ( FAST int fd, /* fd from which to read module */ FUNCPTR *pEntry /* entry point of module */ ...… 查看全部问答> |
|
我用的是OMAPL138的芯片,网卡是KSZ8041FTL,用的平台是CCS3.3,调试dsp,并且移植了Ucos操作系统,我把板子的网口和主机的网口用网线连起来,然后在主机的cmd中ping板子的IP地址,到目前为止就出现2次ping通,而且ping通了一下就超时了,一次丢包 ...… 查看全部问答> |
|
作为第一个在Hercules板块中发帖滴人,怎么着也要发点儿资料! 上点儿介绍性的内容吧,好多人应该都不知道这是啥。 什么是 Hercules?Hercules 安全微处理器是基于 TI 针对汽车电子市场的 20 多年安全关键型系统专业技术、行业协作而发展成熟的硬 ...… 查看全部问答> |
|
本帖最后由 孟令民 于 2014-3-14 09:37 编辑 RC降压求助,没有输出。我是在网上查的资料根据网上的电路图自己焊了一个,就是没有输出不知道为什么。还请坛友们帮忙解答下,非常感谢。用的是安规电容,24v 4749稳压管。备注:没有输出问题已经查到 ...… 查看全部问答> |




