东阳网站建设,深圳家园网社区论坛,内蒙网,wordpress epix v1.2STM32-DSP库的使用 一.CMSIS-DSP1.1 DSP库简介1.2 支持的函数类别1.3 宏定义 二、操作2.1 STM32CubeMX 配置基本工程2.2 Lib库的方式实现(推荐)2.3 手动添加DSP文件#xff08;可以下载官方最新库#xff0c;功能齐全#xff09; 三、MFCC测试DSP加速效果 为验证语音识别MFC… STM32-DSP库的使用 一.CMSIS-DSP1.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_PRESENT1编译出现如下图是因为重复宏定义导致的宏的作用域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_PRESENT1添加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 i0; i2; 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 i0; iMFCC_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