当前位置: 首页 > news >正文

【STM32-DSP库的使用】基于Keil5 + STM32CubeMX 手动添加、库添加方式

STM32-DSP库的使用

  • 一.CMSIS-DSP
    • 1.1 DSP库简介
    • 1.2 支持的函数类别
    • 1.3 宏定义
  • 二、操作
    • 2.1 STM32CubeMX 配置基本工程
    • 2.2 Lib库的方式实现(推荐)
    • 2.3 手动添加DSP文件(可以下载官方最新库,功能齐全)
  • 三、MFCC测试DSP加速效果

为验证语音识别MFCC用到快速傅里叶变换FFT,在工程中应用DSP库时对着网上各种教程暴雷难受,希望给大家提供帮助;并且以lib库手动src移植两种方式分别实现;测试环境Crotex-M4实测有效(相比于Cortex-M3增加了浮点运算单元和数字信号处理(DSP)指令集,适用于需要处理复杂算法的应用);

一.CMSIS-DSP

1.1 DSP库简介

CMSIS简述
通用微控制器软件接口标准 (CMSIS) 简化了微控制器软件开发, 为使用 Cortex-M 和入门级 Cortex-A 处理器的开发人员提供一致且高效的接口。 它促进了代码的重用、可移植性和互操作性, 使开发人员能够专注于应用程序级逻辑,而不是处理低级硬件细节。
CMSIS提供处理器和外围设备、实时操作系统、 和中间件组件,并包括交付机制 (CMSIS-Pack) 用于设备、主板和软件, 并支持组合来自多个供应商的软件组件。 keil.arm.com 上的内容直接从 CMSIS 包中提取。
CMSIS是与各种芯片和软件供应商密切合作定义的,并提供了一种与外设接口的通用方法。 实时操作系统和中间件组件。 它旨在实现来自多个供应商的软件组件的互操作性。
DSP库说明详情见官网
本用户手册介绍了 CMSIS DSP 软件库,这是一套用于基于 Cortex-M 和 Cortex-A 处理器的器件的常见信号处理功能

1.2 支持的函数类别

支持该库分为许多函数,每个函数涵盖一个特定的类别:

  • 基本数学函数
  • 快速数学函数
  • 复杂的数学函数
  • 过滤函数
  • 矩阵函数
  • 转换函数
  • 电机控制功能
  • 统计函数
  • 支持功能
  • 插值函数
  • 支持向量机函数 (SVM)
  • 贝叶斯分类器函数
  • 距离函数
  • 四元数函数

1.3 宏定义

该库通常具有单独的函数,用于对 8 位整数、16 位整数、32 位整数和 32 位浮点值进行操作。预处理器宏,每个库项目都有不同的预处理器宏。

ARM_MATH_BIG_ENDIAN:
定义宏ARM_MATH_BIG_ENDIAN,为大端目标构建库。默认情况下,库会为小端目标构建。ARM_MATH_MATRIX_CHECK:
定义用于检查矩阵的输入和输出大小的宏ARM_MATH_MATRIX_CHECKARM_MATH_ROUNDING:
定义用于舍入支持函数的宏ARM_MATH_ROUNDINGARM_MATH_LOOPUNROLL:
定义宏ARM_MATH_LOOPUNROLL,以便在 DSP 函数中启用手动循环展开ARM_MATH_NEON:
定义宏ARM_MATH_NEON以启用 DSP 功能的 Neon 版本。默认情况下,当 Neon 可用时,它不会启用,因为性能取决于编译器和目标体系结构。ARM_MATH_NEON_EXPERIMENTAL:
定义宏ARM_MATH_NEON_EXPERIMENTAL以启用某些 DSP 函数的实验性 Neon 版本。实验性 Neon 版本目前没有比标量版本更好的性能。ARM_MATH_HELIUM:
它意味着标志 ARM_MATH_MVEF 和 ARM_MATH_MVEI 和 ARM_MATH_MVE_FLOAT16。ARM_MATH_HELIUM_EXPERIMENTAL:
仅在定义ARM_MATH_MVEF、ARM_MATH_MVEI或ARM_MATH_MVE_FLOAT16时才考虑在内。启用一些矢量版本,这些版本的性能可能比标量差,具体取决于内核/编译器配置。ARM_MATH_MVEF:
选择 f32 算法的 Helium 版本。它意味着ARM_MATH_FLOAT16和ARM_MATH_MVEI。ARM_MATH_MVEI:
选择 int 和 fixed point 算法的 Helium 版本。ARM_MATH_MVE_FLOAT16:
某些算法的 MVE Float16 实现(需要 MVE 扩展)。DISABLEFLOAT16:
当特定编译器/内核配置不支持 __fp16 时禁用 float16 算法。这仅对标量有效。当矢量体系结构支持 f16 时,无法禁用它。ARM_MATH_AUTOVECTORIZE:
使用 Helium 或 Neon,禁用带有 C 内部函数的矢量化代码,改用纯 C。然后由编译器完成矢量化。

官方github最新库版本

二、操作

2.1 STM32CubeMX 配置基本工程

工程用的STM32407IGT6实现
在这里插入图片描述
简单配置一下时钟和Keil项目,这里略过细节重点在Keil中的配置
在这里插入图片描述
在这里插入图片描述

2.2 Lib库的方式实现(推荐)

用Keil 自带的 CMSIS-DSP包,一键添加非常方便也不需要添加头文件路径之类的
在这里插入图片描述

添加编译宏,可以根据(1.3)实际功能进行配置,点击OK

,ARM_MATH_CM4,__CC_ARM,ARM_MATH_MATRIX_CHECK,ARM_MATH_ROUNDING,__TARGET_FPU_VFP,__FPU_PRESENT=1

在这里插入图片描述
编译出现如下图,是因为重复宏定义导致的,宏的作用域CMSIS-DSP中获取不到,不添加不行

warning:  #47-D: incompatible redefinition of macro "__FPU_PRESENT" 

在这里插入图片描述
可以注释掉代码中的一个即可,就不会出现warring了
在这里插入图片描述
终于编译过了(期间有一次遇到keil全局宏修改不生效的问题,导致死都编译不过,最后只能在keil的配置表里面修改,正常不会有这个问题)
在这里插入图片描述

2.3 手动添加DSP文件(可以下载官方最新库,功能齐全)

添加编译宏,和(2.1)一致

,ARM_MATH_CM4,__CC_ARM,ARM_MATH_MATRIX_CHECK,ARM_MATH_ROUNDING,__TARGET_FPU_VFP,__FPU_PRESENT=1

添加DSP src文件
在这里插入图片描述
可以根据实际使用的API添加,基本功能添加下图所示三个文件夹所有.C文件

在这里插入图片描述
这里要注意的是,别漏了 arm_bitreversal2.S
在这里插入图片描述
关于汇编文件编译报错的问题,–cpreproc选项是告诉armasm在汇编代码时先调用armclang来处理该汇编代码,然后再将处理后的代码给armasm来汇编成机器码。

error: A1163E: Unknown opcode defined , expecting opcode or Macro

在这里插入图片描述
在这里插入图片描述

添加DSP的头文件路径
在这里插入图片描述
编译是发现arm_dct4_X相关功能没用到这边就直接在工程中剔除,避免牵连更多的引用到工程中

Undefined symbol arm_cmplx_mult_cmplx_f32 (referred from arm_dct4_f32.o).

在这里插入图片描述
最终编译OK
在这里插入图片描述

三、MFCC测试DSP加速效果

		// MFCC// do the first mfcc with half old data(256) and half new data(256)// then do the second mfcc with all new data(512). // take mfcc bufferfloat startTime = __HAL_TIM_GetCounter(&htim2)/100.0;osMutexAcquire(mfcc_bufHandle, osWaitForever);for(int i=0; i<2; i++){mfcc_compute(mfcc, &audio_buffer_16bit[i*AUDIO_FRAME_LEN/2], mfcc_features_f);// quantise them using the same scale as training data (in keras), by 2^n. quantize_data(mfcc_features_f, mfcc_features[mfcc_feat_index], MFCC_COEFFS, 3);// debug only, to print mfcc data on consoleif(is_print_mfcc){for(int i=0; i<MFCC_COEFFS; i++)printf("%d ",  mfcc_features[mfcc_feat_index][i]);printf("\n");}mfcc_feat_index++;if(mfcc_feat_index >= MFCC_LEN)mfcc_feat_index = 0;}osMutexRelease(mfcc_bufHandle);printf("mfcc time %0.2f ms\r\n", __HAL_TIM_GetCounter(&htim2)/100.0-startTime);

//不增加DSP库
mfcc time 2.66 ms

//增加DSP库MFCC处理速度提升 56.0%
mfcc time 1.17 ms

相关文章:

【STM32-DSP库的使用】基于Keil5 + STM32CubeMX 手动添加、库添加方式

STM32-DSP库的使用 一.CMSIS-DSP1.1 DSP库简介1.2 支持的函数类别1.3 宏定义 二、操作2.1 STM32CubeMX 配置基本工程2.2 Lib库的方式实现(推荐)2.3 手动添加DSP文件&#xff08;可以下载官方最新库&#xff0c;功能齐全&#xff09; 三、MFCC测试DSP加速效果 为验证语音识别MFC…...

createElement的用法

目录 一&#xff1a;介绍 二&#xff1a;语法与例子 1、语法 2、一些例子 例1&#xff1a; 例2&#xff1a; 例3&#xff1a; 3、第二种写法 一&#xff1a;介绍 document.createElement()是在对象中创建一个对象&#xff0c;要与appendChild() 或 insertBefore()方法…...

Mabitys总结

一、ORM ORM(Object/Relation Mapping)&#xff0c;中文名称&#xff1a;对象/关系 映射。是一种解决数据库发展和面向对象编程语言发展不匹配问题而出现的技术。 使用JDBC技术时&#xff0c;手动实现ORM映射&#xff1a; 使用ORM时&#xff0c;自动关系映射&#xff1a; &am…...

JAVA安全之Log4j-Jndi注入原理以及利用方式

什么是JNDI&#xff1f; JDNI&#xff08;Java Naming and Directory Interface&#xff09;是Java命名和目录接口&#xff0c;它提供了统一的访问命名和目录服务的API。 JDNI主要通过JNDI SPI&#xff08;Service Provider Interface&#xff09;规范来实现&#xff0c;该规…...

Spring源码系列-框架中的设计模式

简单工厂 实现方式&#xff1a; BeanFactory。Spring中的BeanFactory就是简单工厂模式的体现&#xff0c;根据传入一个唯一的标识来获得Bean对象&#xff0c;但是否是在传入参数后创建还是传入参数前创建这个要根据具体情况来定。 实质&#xff1a; 由一个工厂…...

数据的读取和保存-MATLAB

1 序言 在进行数据处理时&#xff0c;经常需要写代码对保存在文件中的数据进行读取→处理→保存的操作&#xff0c;流程图如下&#xff1a; 笔者每次在进行上述操作时&#xff0c;都需要百度如何“选中目标文件”以及如何“将处理好的数据保存到目标文件中”&#xff0c;对这一…...

C++ 输入、输出和整数运算

【问题描述】 编写一个程序&#xff0c;读入两个整数&#xff0c;计算并输出他们的和、积、商和余数。 【输入形式】 程序运行到输入时&#xff0c;不要显示输入提示信息。 输入为两个整数&#xff08;在问题描述中记作A和B&#xff0c;程序中请自定变量名&#xff09;,A和B使…...

Element Plus 解决组件显示英文问题

要解决Element Plus日历组件显示英文的问题&#xff0c;可以使用Element Plus提供的国际化功能&#xff0c;切换成中文语言。下面是一个简单的示例&#xff1a; 首先&#xff0c;在main.ts或者你的入口文件中引入Element Plus的中文语言包和Vue I18n&#xff1a; import { cr…...

sqlite3.NotSupportedError: deterministic=True requires SQLite 3.8.3 or higher

问题描述 sqlite3.NotSupportedError: deterministicTrue requires SQLite 3.8.3 or higher 解决方法 A kind of solution is changing the database from sqlite3 to pysqlite3. After acticate the virtualenv, install pysqlite. pip3 install pysqlite3 pip3 install …...

单线程介绍、ECMAScript介绍、操作系统Windows、Linux 和 macOS

目录 单线程介绍ECMAScript介绍操作系统Windows、Linux 和 macOS &#x1f44d; 点赞&#xff0c;你的认可是我创作的动力&#xff01; ⭐️ 收藏&#xff0c;你的青睐是我努力的方向&#xff01; ✏️ 评论&#xff0c;你的意见是我进步的财富&#xff01; 单线程介绍 单线…...

【Docker】iptables基本原理

在当今数字化时代&#xff0c;网络安全问题变得越来越重要。为了保护我们的网络免受恶意攻击和未经授权的访问&#xff0c;我们需要使用一些工具来加强网络的安全性。其中&#xff0c;iptables是一个强大而受欢迎的防火墙工具&#xff0c;它可以帮助我们控制网络流量并保护网络…...

微服务架构——笔记(3)Eureka

微服务架构——笔记&#xff08;3&#xff09; 基于分布式的微服务架构 本次笔记为 此次项目的记录&#xff0c;便于整理思路&#xff0c;仅供参考&#xff0c;笔者也将会让程序更加完善 内容包括&#xff1a;1.支付模块、2.消费者订单模块、支付微服务入驻Eureka、Eureka集群…...

网络编程套接字(2)——简单的TCP网络程序

文章目录 一.简单的TCP网络程序1.服务端创建套接字2.服务端绑定3.服务端监听4.服务端获取连接5.服务端处理请求6.客户端创建套接字7.客户端连接服务器8.客户端发起请求9.服务器测试10.单执行流服务器的弊端 二.多进程版的TCP网络程序1.捕捉SIGCHLD信号2.让孙子进程提供服务 三.…...

MySQL数据库的简单的面试题

1、MySQL有哪些锁机制 MySQL有以下几种机制&#xff1a; 行级锁&#xff1a;行极锁在mysql 中最常用的锁机制&#xff0c;它只针对表的某一行进行加锁不受影响。MySQL的行级锁分为共享锁和排他锁两种类型&#xff0c;共享锁和排它锁不能同时存在于一行。 表级锁&#xff1a;表…...

hbuilderx打包应用上传到app store构建版本的教程

简介&#xff1a; 将ipa上架app store的过程中&#xff0c;发现需要将打包的ipa文件上传到app store的构建版本里&#xff0c;但是苹果官方推荐的上传工具&#xff0c;只有xcode和transporter等工具&#xff0c;这些工具是不能安装在windows电脑的。那么有没有windows电脑的上传…...

第五届泰迪杯数据分析技能赛B题源码图片分享

需要B题源码以及第六届带队”指导“请私信本人&#xff0c;团队包含技能赛双一等&#xff0c;数学建模省一&#xff0c;泰迪杯挖掘国一&#xff0c;研究生队友。 去年一等作品可视化图如下&#xff0c;私信获取源码...

【小白专用】VSCode下载和安装与配置PHP开发环境(详细版) 23.11.08

1. 下载VSCode2. 解决VSCode下载速度特别慢3. 安装VSCode 一、VSCode介绍 VSCode 是一款由微软开发且跨平台的免费源代码编辑器&#xff1b;该软件支持语法高亮、代码自动补全、代码重构、查看定义功能&#xff0c;并且内置了命令行工具和 Git 版本控制系统。 二、官方下载地址…...

Qlik Sense : Fetching data with Qlik Web Connectors

目录 Connecting to data sources Opening a connector Connecting to a data source Authenticating the connector Defining table parameters Using standard mode or legacy mode Standard mode Connector overview Using multi-line input parameters to fetch da…...

聊一聊 tcp/ip 在.NET故障分析的重要性

一&#xff1a;背景 1. 讲故事 这段时间分析了几个和网络故障有关的.NET程序之后&#xff0c;真的越来越体会到计算机基础课的重要&#xff0c;比如 计算机网络 课&#xff0c;如果没有对 tcpip协议 的深刻理解&#xff0c;解决这些问题真的很难&#xff0c;因为你只能在高层做…...

利用梯度上升可视化卷积核:基于torch实现

利用梯度上升可视化卷积核 文章目录 前言基本原理版本和包结果展示 简单绘图修改源码绘图方法一 方法二&#xff08;推荐&#xff09; 报错解决总结 前言 基于梯度上升的可视化是一种常用的技术&#xff0c;用于理解卷积神经网络&#xff08;CNN&#xff09;中的卷积核是如何对…...

Java 语言特性(面试系列1)

一、面向对象编程 1. 封装&#xff08;Encapsulation&#xff09; 定义&#xff1a;将数据&#xff08;属性&#xff09;和操作数据的方法绑定在一起&#xff0c;通过访问控制符&#xff08;private、protected、public&#xff09;隐藏内部实现细节。示例&#xff1a; public …...

【OSG学习笔记】Day 18: 碰撞检测与物理交互

物理引擎&#xff08;Physics Engine&#xff09; 物理引擎 是一种通过计算机模拟物理规律&#xff08;如力学、碰撞、重力、流体动力学等&#xff09;的软件工具或库。 它的核心目标是在虚拟环境中逼真地模拟物体的运动和交互&#xff0c;广泛应用于 游戏开发、动画制作、虚…...

在鸿蒙HarmonyOS 5中实现抖音风格的点赞功能

下面我将详细介绍如何使用HarmonyOS SDK在HarmonyOS 5中实现类似抖音的点赞功能&#xff0c;包括动画效果、数据同步和交互优化。 1. 基础点赞功能实现 1.1 创建数据模型 // VideoModel.ets export class VideoModel {id: string "";title: string ""…...

【机器视觉】单目测距——运动结构恢复

ps&#xff1a;图是随便找的&#xff0c;为了凑个封面 前言 在前面对光流法进行进一步改进&#xff0c;希望将2D光流推广至3D场景流时&#xff0c;发现2D转3D过程中存在尺度歧义问题&#xff0c;需要补全摄像头拍摄图像中缺失的深度信息&#xff0c;否则解空间不收敛&#xf…...

[ICLR 2022]How Much Can CLIP Benefit Vision-and-Language Tasks?

论文网址&#xff1a;pdf 英文是纯手打的&#xff01;论文原文的summarizing and paraphrasing。可能会出现难以避免的拼写错误和语法错误&#xff0c;若有发现欢迎评论指正&#xff01;文章偏向于笔记&#xff0c;谨慎食用 目录 1. 心得 2. 论文逐段精读 2.1. Abstract 2…...

12.找到字符串中所有字母异位词

&#x1f9e0; 题目解析 题目描述&#xff1a; 给定两个字符串 s 和 p&#xff0c;找出 s 中所有 p 的字母异位词的起始索引。 返回的答案以数组形式表示。 字母异位词定义&#xff1a; 若两个字符串包含的字符种类和出现次数完全相同&#xff0c;顺序无所谓&#xff0c;则互为…...

AI病理诊断七剑下天山,医疗未来触手可及

一、病理诊断困局&#xff1a;刀尖上的医学艺术 1.1 金标准背后的隐痛 病理诊断被誉为"诊断的诊断"&#xff0c;医生需通过显微镜观察组织切片&#xff0c;在细胞迷宫中捕捉癌变信号。某省病理质控报告显示&#xff0c;基层医院误诊率达12%-15%&#xff0c;专家会诊…...

MyBatis中关于缓存的理解

MyBatis缓存 MyBatis系统当中默认定义两级缓存&#xff1a;一级缓存、二级缓存 默认情况下&#xff0c;只有一级缓存开启&#xff08;sqlSession级别的缓存&#xff09;二级缓存需要手动开启配置&#xff0c;需要局域namespace级别的缓存 一级缓存&#xff08;本地缓存&#…...

MySQL体系架构解析(三):MySQL目录与启动配置全解析

MySQL中的目录和文件 bin目录 在 MySQL 的安装目录下有一个特别重要的 bin 目录&#xff0c;这个目录下存放着许多可执行文件。与其他系统的可执行文件类似&#xff0c;这些可执行文件都是与服务器和客户端程序相关的。 启动MySQL服务器程序 在 UNIX 系统中&#xff0c;用…...

RabbitMQ 各类交换机

为什么要用交换机&#xff1f; 交换机用来路由消息。如果直发队列&#xff0c;这个消息就被处理消失了&#xff0c;那别的队列也需要这个消息怎么办&#xff1f;那就要用到交换机 交换机类型 1&#xff0c;fanout&#xff1a;广播 特点 广播所有消息​​&#xff1a;将消息…...