历史上的今天
返回首页

历史上的今天

今天是: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

推荐阅读

史海拾趣

Apacer公司的发展小趣事

随着科技的不断发展,Apacer宇瞻科技紧跟时代步伐,不断创新产品。2006年,公司推出了存储容量高达2GB的microSD卡,这款数码卡体积仅为普通SD卡的四分之一,但存储容量却与之不相上下。这一创新产品不仅满足了市场对高容量、小型化存储设备的需求,也进一步巩固了宇瞻科技在市场上的地位。

Hitachi Metals公司的发展小趣事

随着汽车工业向智能化、电动化方向发展,Hitachi Metals敏锐地捕捉到了这一趋势带来的商机。公司加大了对汽车电子部件的研发和生产投入,特别是在汽车活塞环材料领域取得了显著成就。其生产的钢制活塞环材料在日本市场占据领先地位,不仅为众多汽车制造商提供了高质量的产品,还通过技术创新不断提升产品的附加值。此外,公司还积极拓展汽车电子控制单元(ECU)等关键部件的市场,进一步巩固了其在汽车电子领域的地位。

中移物联网(Chinamobile)公司的发展小趣事

中移物联网在智能终端产品的创新方面也取得了显著成果。公司设计并生产了物联网专用模组和芯片,打造了智能组网、智能安防、智能家居、智能穿戴等行业终端。这些产品在市场上受到了广泛欢迎,特别是在智能家居和智能穿戴领域,中移物联网的产品凭借其高性能和稳定性,赢得了众多消费者的青睐。

Crystalfontz America Inc公司的发展小趣事

Crystalfontz America Inc公司自成立以来,一直致力于LCD、OLED等显示模块的研发和生产。在早期的发展阶段,公司面临着技术上的诸多挑战。然而,通过持续的技术投入和研发团队的不懈努力,公司成功突破了多项关键技术,推出了一系列具有竞争力的显示模块产品。这些产品在市场上获得了广泛认可,为公司的快速发展奠定了坚实基础。

Hi-G Relays公司的发展小趣事

Crystalfontz America Inc公司自成立以来,一直致力于LCD、OLED等显示模块的研发和生产。在早期的发展阶段,公司面临着技术上的诸多挑战。然而,通过持续的技术投入和研发团队的不懈努力,公司成功突破了多项关键技术,推出了一系列具有竞争力的显示模块产品。这些产品在市场上获得了广泛认可,为公司的快速发展奠定了坚实基础。

Altitude Technology公司的发展小趣事

在电子行业中,合作与共赢是企业发展的重要途径。Altitude Technology深知这一点,因此积极寻求与其他企业的合作机会。通过与一家知名芯片制造商建立战略合作关系,Altitude Technology获得了更先进的芯片供应和技术支持,进一步提升了产品的竞争力。同时,公司还与其他企业开展了一系列合作项目,共同推动电子行业的发展。

问答坊 | AI 解惑

IR模块

系列功率模块资料…

查看全部问答>

【转】将PCB设计进行到底

在当前岗位上,PCB设计本不是份内工作,但是所里的PCB设计部门那工作效率实在无法忍受,快过年了出差外协也很是不方便。手头的项目里三个板子还是蛮急的,希望年前都能发出去制板,无奈之下只能选择自己动手。过去自己设计的PCB两层板较多,大都是 ...…

查看全部问答>

PSAM卡MAC码算法解密

PSAM卡解密,要求:已知两张卡的序列号和传递到PSAM卡的随机因子,倒推算出PSAM卡计算MAC地址的加密算法。有尝解密费用5000元…

查看全部问答>

bootLoadModule

STATUS bootLoadModule     (     FAST int fd,        /* fd from which to read module */     FUNCPTR *pEntry     /* entry point of module */   ...…

查看全部问答>

学驱动开发难吗?我想学

目前主要会C方面的东西,驱动开发都需要哪个方面的知识?最快多长时间能学完工作?…

查看全部问答>

msp430

谁有有关《MSP430系列单片机系统工程设计与实践》电子书啊…

查看全部问答>

OMAPL138以太网通讯ping通老是超时

我用的是OMAPL138的芯片,网卡是KSZ8041FTL,用的平台是CCS3.3,调试dsp,并且移植了Ucos操作系统,我把板子的网口和主机的网口用网线连起来,然后在主机的cmd中ping板子的IP地址,到目前为止就出现2次ping通,而且ping通了一下就超时了,一次丢包 ...…

查看全部问答>

抢发第一帖!!Hercules介绍

作为第一个在Hercules板块中发帖滴人,怎么着也要发点儿资料! 上点儿介绍性的内容吧,好多人应该都不知道这是啥。 什么是 Hercules?Hercules 安全微处理器是基于 TI 针对汽车电子市场的 20 多年安全关键型系统专业技术、行业协作而发展成熟的硬 ...…

查看全部问答>

这是怎么回事?

有人给我发了一个短消息,怎么出现我回复同样的内容?实际我没有那个回复的 …

查看全部问答>

提问+RC降压求助,没有输出

本帖最后由 孟令民 于 2014-3-14 09:37 编辑 RC降压求助,没有输出。我是在网上查的资料根据网上的电路图自己焊了一个,就是没有输出不知道为什么。还请坛友们帮忙解答下,非常感谢。用的是安规电容,24v 4749稳压管。备注:没有输出问题已经查到 ...…

查看全部问答>