【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文件(可以下载官方最新库,功能齐全) 三、MFCC测试DSP加速效果 为验证语音识别MFC…...
createElement的用法
目录 一:介绍 二:语法与例子 1、语法 2、一些例子 例1: 例2: 例3: 3、第二种写法 一:介绍 document.createElement()是在对象中创建一个对象,要与appendChild() 或 insertBefore()方法…...
Mabitys总结
一、ORM ORM(Object/Relation Mapping),中文名称:对象/关系 映射。是一种解决数据库发展和面向对象编程语言发展不匹配问题而出现的技术。 使用JDBC技术时,手动实现ORM映射: 使用ORM时,自动关系映射: &am…...
JAVA安全之Log4j-Jndi注入原理以及利用方式
什么是JNDI? JDNI(Java Naming and Directory Interface)是Java命名和目录接口,它提供了统一的访问命名和目录服务的API。 JDNI主要通过JNDI SPI(Service Provider Interface)规范来实现,该规…...
Spring源码系列-框架中的设计模式
简单工厂 实现方式: BeanFactory。Spring中的BeanFactory就是简单工厂模式的体现,根据传入一个唯一的标识来获得Bean对象,但是否是在传入参数后创建还是传入参数前创建这个要根据具体情况来定。 实质: 由一个工厂…...
数据的读取和保存-MATLAB
1 序言 在进行数据处理时,经常需要写代码对保存在文件中的数据进行读取→处理→保存的操作,流程图如下: 笔者每次在进行上述操作时,都需要百度如何“选中目标文件”以及如何“将处理好的数据保存到目标文件中”,对这一…...
C++ 输入、输出和整数运算
【问题描述】 编写一个程序,读入两个整数,计算并输出他们的和、积、商和余数。 【输入形式】 程序运行到输入时,不要显示输入提示信息。 输入为两个整数(在问题描述中记作A和B,程序中请自定变量名),A和B使…...
Element Plus 解决组件显示英文问题
要解决Element Plus日历组件显示英文的问题,可以使用Element Plus提供的国际化功能,切换成中文语言。下面是一个简单的示例: 首先,在main.ts或者你的入口文件中引入Element Plus的中文语言包和Vue I18n: 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 👍 点赞,你的认可是我创作的动力! ⭐️ 收藏,你的青睐是我努力的方向! ✏️ 评论,你的意见是我进步的财富! 单线程介绍 单线…...
【Docker】iptables基本原理
在当今数字化时代,网络安全问题变得越来越重要。为了保护我们的网络免受恶意攻击和未经授权的访问,我们需要使用一些工具来加强网络的安全性。其中,iptables是一个强大而受欢迎的防火墙工具,它可以帮助我们控制网络流量并保护网络…...
微服务架构——笔记(3)Eureka
微服务架构——笔记(3) 基于分布式的微服务架构 本次笔记为 此次项目的记录,便于整理思路,仅供参考,笔者也将会让程序更加完善 内容包括: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有以下几种机制: 行级锁:行极锁在mysql 中最常用的锁机制,它只针对表的某一行进行加锁不受影响。MySQL的行级锁分为共享锁和排他锁两种类型,共享锁和排它锁不能同时存在于一行。 表级锁:表…...
hbuilderx打包应用上传到app store构建版本的教程
简介: 将ipa上架app store的过程中,发现需要将打包的ipa文件上传到app store的构建版本里,但是苹果官方推荐的上传工具,只有xcode和transporter等工具,这些工具是不能安装在windows电脑的。那么有没有windows电脑的上传…...
第五届泰迪杯数据分析技能赛B题源码图片分享
需要B题源码以及第六届带队”指导“请私信本人,团队包含技能赛双一等,数学建模省一,泰迪杯挖掘国一,研究生队友。 去年一等作品可视化图如下,私信获取源码...
【小白专用】VSCode下载和安装与配置PHP开发环境(详细版) 23.11.08
1. 下载VSCode2. 解决VSCode下载速度特别慢3. 安装VSCode 一、VSCode介绍 VSCode 是一款由微软开发且跨平台的免费源代码编辑器;该软件支持语法高亮、代码自动补全、代码重构、查看定义功能,并且内置了命令行工具和 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故障分析的重要性
一:背景 1. 讲故事 这段时间分析了几个和网络故障有关的.NET程序之后,真的越来越体会到计算机基础课的重要,比如 计算机网络 课,如果没有对 tcpip协议 的深刻理解,解决这些问题真的很难,因为你只能在高层做…...
利用梯度上升可视化卷积核:基于torch实现
利用梯度上升可视化卷积核 文章目录 前言基本原理版本和包结果展示 简单绘图修改源码绘图方法一 方法二(推荐) 报错解决总结 前言 基于梯度上升的可视化是一种常用的技术,用于理解卷积神经网络(CNN)中的卷积核是如何对…...
Qwen2.5-Coder-1.5B效果实测:生成代码质量与准确性评估
Qwen2.5-Coder-1.5B效果实测:生成代码质量与准确性评估 1. 模型概述与测试背景 Qwen2.5-Coder-1.5B是阿里云通义大模型团队推出的专业代码生成模型,属于Qwen2.5-Coder系列中的轻量级版本。作为1.5亿参数的代码专用大模型,它在代码生成、补全…...
终极英语词库指南:如何高效利用47万单词资源构建智能应用
终极英语词库指南:如何高效利用47万单词资源构建智能应用 【免费下载链接】english-words :memo: A text file containing 479k English words for all your dictionary/word-based projects e.g: auto-completion / autosuggestion 项目地址: https://gitcode.co…...
LangChain4j工作流编排深度解析:构建企业级AI智能体的5大核心模式
LangChain4j工作流编排深度解析:构建企业级AI智能体的5大核心模式 【免费下载链接】langchain4j-examples 项目地址: https://gitcode.com/GitHub_Trending/la/langchain4j-examples 在当今AI应用开发领域,LangChain4j-examples项目为Java开发者…...
从MySQL迁移到人大金仓KingbaseES:Hibernate项目需要改哪些配置和SQL?
从MySQL迁移到人大金仓KingbaseES:Hibernate项目改造实战指南 当Java技术栈遇上国产化数据库浪潮,Hibernate作为企业级应用中最常用的ORM框架之一,其与KingbaseES的适配成为许多技术团队必须面对的课题。去年参与某金融系统迁移项目时&#…...
从手抖到丝滑:AI Illustrator钢笔工具控笔完全指南(附练习源文件)
从手抖到丝滑:AI Illustrator钢笔工具控笔完全指南(附练习源文件) 第一次接触AI Illustrator的钢笔工具时,那种"明明想画流畅曲线却总是不听使唤"的挫败感,相信每个设计师都深有体会。就像学书法需要控笔训练…...
全面掌握RTL8852BE Wi-Fi 6网卡驱动:Linux用户的终极优化指南
全面掌握RTL8852BE Wi-Fi 6网卡驱动:Linux用户的终极优化指南 【免费下载链接】rtl8852be Realtek Linux WLAN Driver for RTL8852BE 项目地址: https://gitcode.com/gh_mirrors/rt/rtl8852be 在Linux系统上获得稳定的Wi-Fi 6连接一直是许多用户面临的挑战&a…...
前端构建缓存:从本地到CI/CD
前端构建缓存:从本地到CI/CD 毒舌开场 嘿,前端er们!你们是不是还在为构建速度而头疼?是不是还在为CI/CD流水线的时间而抓耳挠腮?是不是还在为缓存管理而不知所措?醒醒吧!前端构建缓存来了&#…...
三步搞定黑苹果OpenCore EFI配置:OpCore Simplify终极指南
三步搞定黑苹果OpenCore EFI配置:OpCore Simplify终极指南 【免费下载链接】OpCore-Simplify A tool designed to simplify the creation of OpenCore EFI 项目地址: https://gitcode.com/GitHub_Trending/op/OpCore-Simplify 你是否曾经因为复杂的OpenCore配…...
Outfit字体:为品牌自动化而生的终极开源几何无衬线字体解决方案
Outfit字体:为品牌自动化而生的终极开源几何无衬线字体解决方案 【免费下载链接】Outfit-Fonts The most on-brand typeface 项目地址: https://gitcode.com/gh_mirrors/ou/Outfit-Fonts 在当今数字时代,品牌视觉一致性变得前所未有的重要&#x…...
别再被‘unknown series liquidfill‘卡住了!手把手教你为ECharts 5.x正确安装echarts-liquidfill@3
别再被unknown series liquidfill卡住了!手把手教你为ECharts 5.x正确安装echarts-liquidfill3 最近在数据可视化项目中尝试使用ECharts的水球图(Liquid Fill Chart)时,不少开发者都遇到了一个令人头疼的错误提示:&quo…...
