【STM32】 DSP库函数的一些基本使用

这篇具有很好参考价值的文章主要介绍了【STM32】 DSP库函数的一些基本使用。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

对于一些刚接触STM32的童靴来说,DSP库一定是一个陌生的东西。通俗来说,DSP库就是为了让MCU能够使用像DSP(数字信号处理的芯片)功能弄的一些官方库函数,它是基于MCU的FPU(浮点运算功能)的,如果你连FPU都不知道咋开,我个人建议先去查一查啥是FPU以及DSP库移植的一些步骤(移植也分两种,一种是使用lib文件,另一种是直接的C语言函数库)。
这里推荐的参考资料是:安富莱的STM32-V6开发板_第二版DSP数字信号处理教程,下载链接在这里:https://download.csdn.net/download/qq_32006213/87406373
说实话,只要能认真看这个教程,也不需要看我这个文章在这里BB了,这里仅做一些整理。

【一】类型:浮点数、定点数;浮点数就有:
float32_t→float;float64_t→double;定点数就不介绍了,一般也很少用到。这里需要注意的是,如果你使用的是STM32,那么就一定要注意你的浮点计算往往在一开始就因为你传入的数值不是浮点型或者是被编译器给你整成其他类型而变慢了。例如在运算时你需要使用一个数:1.234,你直接在公式中写:

NMSL = 1.234 - 5;
或者
Fun(1.234);

那恭喜你,喜提慢速计算。为啥,因为单片机认为你传入的 1.234并不是浮点型而是double型,而单片机只有FPU却没有针对double类型快速计算的模块,就只能硬着头皮去算了。
还有一点就是,如果你使用一些math.h中的传统C库的函数,它的入参默认就是double类型,那即便你确保传入的是浮点数同样也会很慢。个人认为这就是传统库相比DSP库的劣势之一,当然不是不让你用double类型,而是都是用浮点型时,DSP库会更快罢了。为了解决以上的问题,可以改为:

NMSL = 1.234f - 5.0f;
或者
Fun(1.234f);

所以第一个需要注意点就是,确保你的变量类型没有错误,基本上使用float32_t即可。
【二】常用函数:
2.1 三角函数:arm_cos_f32/arm_sin_f32/arm_sin_cos_f32
使用案例:

#define PI 3.141592f
float32_t Angle = 60.0f;
float32_t Angle_Arc = Angle/180*PI;
float32_t Cos = 0.0f;
float32_t Sin = 0.0f;
Cos = arm_cos_f32(Angle_Arc);//注意这个函数要传入的东西是弧度制
Sin = arm_sin_f32(Angle_Arc);//注意这个函数要传入的东西是弧度制
arm_sin_cos_f32(Angle,&Sin,&Cos);//这个函数顶级就顶级在它可以直接传角度,而且角度是可以有小数的,但是使用方式就完全不同了。

2.2 平方根:arm_sqrt_f32

float32_t Input = 9.0f;
float32_t Output = 0.0f;
arm_sqrt_f32(Input,&Output);//这样Output上获得的就是平方根,暂时没试过负数能开出来不,可能有风险哦。

2.3 最大值、最小值、平均值
2.3.1最大值:arm_max_f32 最小值:arm_min_f32

float32_t Array[3]={0f,1.2f,1.3f};
float32_t Min = 0.0f;
uint32_t Min_index = 0;
float32_t Max = 0.0f;
uint32_t Max_index = 0;
arm_max_f32(Array,3,&Max,&Max_index);//数组:长度;获得的最小值;最小值在数组中的位置
arm_min_f32(Array,3,&Min,&Min_index);//最为强大的就是能找到位置啦

实际上第二个参数也可以不使用整体长度,第一个参数也可以不传入数组第一个元素的地址。如果你想要求局部的最大/最小,可以通过操控第一个参数传入你想要从哪一个数据开始计算的n地址,例如:
(float32_t *)(Array +n)→表示从第n个开始,至于为什么这么写,是因为有很多不同的类型,这样写是习惯比较稳妥,更多的可以自行去查询(uint32_t *)Array+n 这样为什么会有问题【提示:Memcpy函数也需要注意】。然后长度填5。那么现在就是求数组第n个开始五个数中间的最大/最小值啦。
2.3.2 平均值 arm_mean_f32

float32_t Array[3]={0f,1.2f,1.3f};
float32_t Mean = 0.0f;
arm_mean_f32(Array,3,&Mean);

2.4 标准差、均方根、方差
这三者在统计上具有较大的意义,在处理一系列的数据时可能用的到,至于每个数表示啥意思请自行查询。

float32_t Array[3]={0f,1.2f,1.3f};
float32_t Std = 0.0f;
float32_t Rms = 0.0f;
float32_t Var = 0.0f;
arm_std_f32(Array,3,&Std);//标准差
arm_rms_f32(Array,3,&Rms);//均方根
arm_var_f32(Array,3,&Var);//方差

2.5数据拷贝、填充

float32_t Array_A[3]={0f,1.2f,1.3f};
float32_t Array_B[3];
arm_copy_f32(Array_A,Array_B,3);//拷贝
arm_fill_f32(5.0f,Array_B,3);//将5.0f填充至Array_B

2.6基本运算:求和、求差、求乘法、求点乘、求绝对值、求相反数、求比例化
以上基本上都是面对两个数组多个数据进行的,如果本身就没多少变量/数,直接公式算也不差。

float32_t Array_A[3]={0f,1.2f,1.3f};
float32_t Array_B[3] ={3.5f,-5.0f,2.5f};
float32_t Result_Array[3];
float32_t Dot_result;
arm_add_f32(Array_A,Array_B,Result_Array,3);//求和:Result_Array[n] = Array_A[n]+Array_B[n]
arm_sub_f32(Array_A,Array_B,Result_Array,3);//求差:Result_Array[n] = Array_A[n]-Array_B[n],这个要记得是前面减去后面
arm_abs_f32(Array_B,Result_Array,3);//求绝对值Result_Array[n] =|Array_B[n]|
arm_mult_f32(Array_A,Array_B,Result_Array,3);//求乘法Result_Array[n] = Array_A[n]*Array_B[n]
arm_dot_prod_f32(Array_A,Array_B,3,&Dot_result);//点乘得到的是一个值,详情看线性代数。Dot_result = Array_A[0]*Array_B[0]+···Array_A[2]*Array_B[2]
arm_negate_f32(Array_A,Result_Array,3);//求相反数:Result_Array[n] = -Array_A[n]
arm_scale_f32(Array_A,1.5f,Result_Array,3);//求比例乘积后:Result_Array[n] = Array_A[n]*1.5f;

2.7 矩阵运算、复数运算
基本上用不到,而且拿单片机算矩阵未免有那么一点点刁难它。一般的步骤都是复杂的运算在Matlab上运行,将算法简化为单一的公式再在arm上实现,这里就不继续讲解了。如果一定要使用矩阵,这里提三点意见:
1.使用矩阵一定要严格按照Arm_math中的矩阵定义来使用,如果要秀操作搞数组,就用不了DSP库了。关于矩阵的定义和初始化,一定要详细看清楚:arm_matrix_instance_f32这个结构体的定义。
2.单片机算矩阵运算很有可能算不出结果而一直递归,别问我怎么知道的…包括你在Matlab上算一些矩阵的运算,如果它本身就不成立,那就没有意义,会一直不收敛。
3.DSP库的逆矩阵求法是有局限性的,有些你在matlab上算的出来,DSP库缺不能求解。所以如果遇到问题,建议先仿真看看,确保矩阵和数值没有问题。文章来源地址https://www.toymoban.com/news/detail-789943.html

到了这里,关于【STM32】 DSP库函数的一些基本使用的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • STM32中DSP库简单理解和使用

    主要参考arm_math.h中的内容编写,以STM32F091为例 数字信号处理(DigitalSignal Processing,简称 DSP ) 是一门涉及许多学科而又广泛应用于许多领 域的新兴学科,通过利用计算机或专用处理设备,以数字形式对信号进行采集、变换、滤波、估值、增强、 压缩、识别等处理,以得到符

    2024年02月15日
    浏览(49)
  • STM32CubeMX关于添加DSP库的使用

    人生如逆旅,我亦是行人。 STM32 系列基于专为要求高性能、低成本、低功耗的嵌入式应用专门设计的 ARM Cortex-M3 内核 而 DSP 应该是 TMS320 系列, TMS320 系列 DSP 是 软件可编程器件 ,具有通用微处理器所具有的方便灵活的特点。其基本特点有: 哈佛结构,流水线操作 ,专用的

    2023年04月08日
    浏览(35)
  • STM32F103标准库函数驱动max30102心率血氧模块

    实际接线图, 1.VIN 3v-5v都可以 2.SDA SCL 是两根依据IIC传输的线(具体看你想用哪两个IO口) 代码里面iicStart.c有解释 3.GND接地 4.其余的端口,我没接,最后是可以接受到数据的。 (想更详细了解模块的朋友,可以看该模块手册)手册放下面了 ----------------------------------------------

    2023年04月15日
    浏览(47)
  • STM32浮点运算单元(FPU)和DSP库使用

    ==== 文章汇总(有代码汇总) ==== 针对M4往上内核的芯片都具有FPU浮点运算单元。可以加快浮点数的运算速度。 硬件:STM32F401CCU6系统板(淘宝十几块钱一个系统板)。 软件:CubeMX、Keil(5.38,建议使用新版本的,对于宏定义没有的部分会有灰色提示)。 首先打开 system_stm32f4xx.c 可

    2024年02月15日
    浏览(55)
  • STM32:CMSIS-DSP使用指南(在单片机上运用常用的数学运算)

    1.keil环境搭建 在STM32中使用DSP库_linuxweiyh的博客-CSDN博客 2.官方文档 [STM32官方DSP文档](file:///E:/Professional_APP/stm32_cubeMX/install_pack/STM32Cube_FW_F4_V1.27.1/Drivers/CMSIS/docs/DSP/html/modules.html) -1.基本数学运算函数 -2.快速数学运算函数 -3.复数运算函数 -4.滤波器 -5.矩阵函数 -6.数学变换 -7.电机

    2024年02月13日
    浏览(60)
  • STM32使用MAX7219控制点阵屏和点阵屏级联

    本文仅仅针对如何使用STM32通过使用MAX7219对点阵屏的控制和级联,提供相应的程序说明和简单的芯片说明,具体的芯片说明请查找数据手册(找淘宝商家要最简单) 目录 一、芯片简单介绍 1.芯片管脚配置 1.1管脚描述  2.时序图 2.1数据格式 二、 如何使用  1.单字节写入函数

    2024年02月04日
    浏览(34)
  • DSP与STM32的区别

    DSP(Digital Signal Processor,数字信号处理器)和STM32是在嵌入式系统领域中被广泛应用的两种技术。它们在功能和应用方面有一些相似之处,但也存在一些显著的区别。本文将详细介绍DSP和STM32之间的区别,并提供相关的源代码示例。 功能和应用领域: DSP:DSP是为数字信号处理

    2024年01月18日
    浏览(34)
  • STM32移植DSP库详细步骤

            先将下载的DSP库文件放到需要的项目目录下。                  随后打开keil项目进入配置。右键项目名称,点击管理项目选项;创建一个DSP文件添加依赖后点击OK。            点击小魔术棒,点击C/C++选项,在Define中添加ARM_MATH_CM3,然后添加DSP的.c和.h文件路径,

    2024年02月13日
    浏览(38)
  • 【STM32】STM32F4调用DSP库实现FFT运算

    最近在整理之前的stm32笔记,打算把一些有价值的笔记发到CSDN分享一下。 在进行模拟/数字信号的转换过程中,当采样频率F大于信号中最高频率 fmax 的 2 倍时(F2*fmax),采样之后的数字信号完整地保留了原始信号中的信息。 设采样频率(单位时间可以采多少个信号样本)为 F

    2023年04月24日
    浏览(41)
  • 【stm32开发笔记】基于HAL库的STM32F4添加DSP库

    本文分两种方法添加DSP库:1.CubeMX直接配置ioc添加; 2.KEIL内添加; 简述:补齐全部lib库-添加DSP包-使能DSP勾选-添加头文件及魔术棒配置-测试 1.补齐lib库。( 如果使用直接默认添加的库,是不支持FPU的,所以需要补齐后找到所需的lib文件进行替换,在MX的工程管理栏,选择复制所

    2024年02月16日
    浏览(58)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包