it编程 > 硬件开发 > stm32

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

65人参与 2024-08-06 stm32

为验证语音识别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 支持的函数类别

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

1.3 宏定义

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

arm_math_big_endian:
定义宏arm_math_big_endian,为大端目标构建库。默认情况下,库会为小端目标构建。

arm_math_matrix_check:
定义用于检查矩阵的输入和输出大小的宏arm_math_matrix_check

arm_math_rounding:
定义用于舍入支持函数的宏arm_math_rounding

arm_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来汇编成机器码。

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

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

在这里插入图片描述
最终编译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 buffer
    	float 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 console
			if(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);
(0)
打赏 微信扫一扫 微信扫一扫

您想发表意见!!点此发布评论

推荐阅读

视觉巡线小车——STM32+OpenMV(三)

08-06

STM32 proteus + STM32Cubemx仿真教程(第五课ADC光敏电阻采样教程)

08-06

STM32 CUBEMX主从定时器配置PWM任意相位可调,占空比以及频率可调(学习记录)

08-06

第一 二章 小车硬件介绍-(全网最详细)基于STM32智能小车-蓝牙遥控、避障、循迹、跟随、PID速度控制、视觉循迹、openmv与STM32通信、openmv图像处理、smt32f103c8t6

08-06

【STM32】FPU的启用和基于ARM-DSP库函数的实时信号RMS计算

08-06

探索STM32与OLED显示屏:SSD1306库使用指南与实战

08-06

猜你喜欢

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论