第17章ARM官方DSP库的ComplexMathFunctions的使用教程(一)
- 格式:pdf
- 大小:520.08 KB
- 文档页数:12
SES如何使用数学库arm_math让程序起飞?来源:技术让梦想更伟大作者:李肖遥最近在使用Nordic的52832开发,这也属于ARM Cortex M4架构,芯片具体不介绍了,主要是M4与M0、M3的最大不同就是具有FPU(浮点运算单元),这也正是我所需要的。
因为项目中有相关算法,涉及到卡尔曼滤波等等,需要支持浮点指令集,因此速度很重要。
使用了CMSIS DSP软件库的数学库arm_math后,在处理数学运算时能比M0/M3高出数十倍甚至上百倍的性能。
CMSIS DSP软件库是什么CMSIS DSP软件库是一套用于基于Cortex-M和Cortex-A处理器的设备的常用信号处理功能。
该库涵盖以下类别的功能:•基本的数学功能•快速的数学功能•复杂的数学函数•过滤功能•矩阵函数•转换功能•电机控制功能•统计功能•支持功能•插值功能•支持向量机功能(SVM)•贝叶斯分类器功能•距离功能该库通常具有单独的函数,用于对8位整数、16位整数、32位整数和32位浮点值进行运算。
库的使用介绍库安装程序在Lib文件夹中包含库的预构建版本,以下是预构建库的列表:•arm_cortexM7lfdp_math.lib(Cortex-M7,小端,双精度浮点单元)•arm_cortexM7bfdp_math.lib(Cortex-M7,大字节序,双精度浮点单元)•arm_cortexM7lfsp_math.lib(Cortex-M7,小端,单精度浮点单元)•arm_cortexM7bfsp_math.lib(Cortex-M7,大字节序和单精度浮点单元打开)•arm_cortexM7l_math.lib(Cortex-M7,小端)•arm_cortexM7b_math.lib(Cortex-M7,大端)•arm_cortexM4lf_math.lib(Cortex-M4,小端,浮点单元)•arm_cortexM4bf_math.lib(Cortex-M4,大端,浮点单元)•arm_cortexM4l_math.lib(Cortex-M4,小端)•arm_cortexM4b_math.lib(Cortex-M4,大端)•arm_cortexM3l_math.lib(Cortex-M3,小端)•arm_cortexM3b_math.lib(Cortex-M3,大端)•arm_cortexM0l_math.lib(Cortex-M0 / Cortex-M0 ,小端)•arm_cortexM0b_math.lib(Cortex-M0 / Cortex-M0 ,大端)•arm_ARMv8MBLl_math.lib(Armv8-M基线,小端)•arm_ARMv8MMLl_math.lib(Armv8-M主线,小端)•arm_ARMv8MMLlfsp_math.lib(Armv8-M主线,小字节序,单精度浮点单元)•arm_ARMv8MMLld_math.lib(Armv8-M主线,小端,DSP 指令)•arm_ARMv8MMLldfsp_math.lib(Armv8-M主线,小字节序,DSP指令,单精度浮点单元)库函数在位于Include文件夹中的公共文件arm_math.h中声明,只需包括此文件并在应用程序中链接适当的库,然后开始调用库函数就可以使用了。
安富莱 DSP 教程UM403 STM32-V5 开发板系统篇手册第22章 math_help 中函数的使用本期教程主要讲解 math_help 文件中函数的使用, 这个文件也是 ARM 官方提供的, 这些函数相对都 比较容易,同时使用频率也很高。
希望初学的同学学习并掌握。
21.1 函数讲解 21.3 总结22.1 函数讲解 22.1.1 函数目录在文件 math_help 文件中主要有以下函数:float arm_snr_f32(float *pRef, float *pTest, uint32_t buffSize); void arm_float_to_q12_20(float *pIn, q31_t * pOut, uint32_t numSamples); void arm_provide_guard_bits_q15(q15_t *input_buf, uint32_t blockSize, uint32_t guard_bits); void arm_provide_guard_bits_q31(q31_t *input_buf, uint32_t blockSize, uint32_t guard_bits); void arm_float_to_q14(float *pIn, q15_t *pOut, uint32_t numSamples); void arm_float_to_q30(float *pIn, q31_t *pOut, uint32_t numSamples); void arm_clip_f32(float *pIn, uint32_t numSamples); uint32_t arm_calc_guard_bits(uint32_t num_adds); void arm_apply_guard_bits (float32_t * pIn, uint32_t numSamples, uint32_t guard_bits); uint32_t arm_compare_fixed_q15(q15_t *pIn, q15_t * pOut, uint32_t numSamples); uint32_t arm_compare_fixed_q31(q31_t *pIn, q31_t *pOut, uint32_t numSamples); uint32_t arm_calc_2pow(uint32_t guard_bits);22.1.2 arm_snr_f32这个函数用于求信噪比:/** * @brief Caluclation of SNR * @param float* Pointer to the reference buffer * @param float* Pointer to the test buffer * @param uint32_t total number of samples * @return float SNR * The function Caluclates signal to noise ratio for the reference output * and test output */ float arm_snr_f32(float *pRef, float *pTest, uint32_t buffSize) { float EnergySignal = 0.0, EnergyError = 0.0; uint32_t i; float SNR; int temp; int *test; for (i = 0; i < buffSize; i++) { /* Checking for a NAN value in pRef array */ test = (int *)(&pRef[i]); temp = *test; (1)2015年01月15日版本:1.0第 1 页 共 7 页安富莱 DSP 教程if(temp == 0x7FC00000) { return(0); } /* Checking for a NAN value in pTest array */ test = (int *)(&pTest[i]); temp = *test; if(temp == 0x7FC00000) { return(0); } EnergySignal += pRef[i] * pRef[i]; EnergyError += (pRef[i] - pTest[i]) * (pRef[i] - pTest[i]); } /* Checking for a NAN value in EnergyError */ test = (int *)(&EnergyError); temp = *test; if(temp == 0x7FC00000) { return(0); } SNR = 10 * log10 (EnergySignal / EnergyError); return (SNR); }UM403 STM32-V5 开发板系统篇手册(2)1. 这里先补充一些信噪比方面的基础知识: 信噪比,即 SNR(Signal to Noise Ratio) ,又称为讯噪比。
【CLion开发stm32】如何使⽤DSP库1. 添加DSP1. ⽣成STM32CubeMX⼯程2. 根⽬录下新建⽂件夹,命名为DSP_LIB3. 将⽬录STM32Cube\Repository\STM32Cube_FW_F4_V1.26.1\Drivers\CMSIS\DSP下的Include⽂件夹和Sources⽂件夹复制到DSP_LIB⽂件夹中,注意Repository⽬录中可能有多个固件库版本,要选择与当前STM32CubeMX⼯程所使⽤相同的版本。
4. 在Include⽂件夹中,仅保留arm_common_tables.h,arm_const_structs.h,arm_math.h三个头⽂件,删除其余头⽂件。
5. 全部修改完成后,DSP_LIB⽬录⽂件结构如图所⽰。
DSP_LIB2. 修改1. CMakeLists.txt⽂件中,取消22⾏-24⾏的注释,使编译器加⼊对硬件浮点数计算的宏定义。
#Uncomment for hardware floating pointadd_compile_definitions(ARM_MATH_CM4;ARM_MATH_MATRIX_CHECK;ARM_MATH_ROUNDING)add_compile_options(-mfloat-abi=hard spadd_link_options(-mfloat-abi=hard sp修改完成后,在CMakeLists_template.txt⽂件中做出同样的修改,这样就不会被STM32CubeMX更新⼯程时刷掉了。
2. CMakeLists.txt⽂件中,分别在49⾏include_directories指令和53⾏file指令中分别加⼊DSP_LIB⽂件夹的包含。
file(GLOB_RECURSE SOURCES "startup/*.*""Drivers/*.*""Core/*.*""DSP_LIB/*.*")然后同样在CMakeLists_template.txt中同步修改。
第21章ARM官方DSP库的InterpolationFunctions的使用ARM官方DSP库中的InterpolationFunctions模块提供了一系列插值函数,用于在给定输入数据集的情况下,对数据进行插值操作。
这些插值函数可以用于音频处理、图像处理、信号处理等多个领域中。
在ARM官方DSP库中,InterpolationFunctions模块提供了不同级别的插值函数,包括线性插值、二次插值、三次插值等。
这些函数可以满足不同场景下的插值需求。
在进行插值操作之前,首先需要初始化插值结构体。
ARM官方DSP库提供了相应的初始化函数,例如arm_linear_interp_instance_init(、arm_bilinear_interp_instance_init(等。
这些初始化函数会设置插值结构体中的相关参数,为后续的插值操作做好准备工作。
以线性插值函数为例,ARM官方DSP库提供了arm_linear_interp_f32(和arm_linear_interp_q31(等函数,在处理单精度浮点数和Q31格式数据时提供了不同的接口。
这些函数通过输入插值结构体、输入数据数组和输出数据数组,对数据进行线性插值操作。
在使用线性插值函数时,首先需要创建一个插值结构体,并通过相应的初始化函数对其进行初始化。
然后,将待插值的数据作为输入数据数组传递给插值函数,设置插值结构体中的输入数据数组。
接着,将插值的横坐标数组传递给插值函数,设置插值结构体中的横坐标数组。
最后,将插值结果保存在输出数据数组中。
除了线性插值函数之外,ARM官方DSP库还提供了其他插值函数,如二次插值函数arm_bilinear_interp_f32(和三次插值函数arm_cubic_interp_f32(。
这些函数操作类似,只是采用了不同的插值算法。
综上所述,ARM官方DSP库的InterpolationFunctions模块提供了一系列插值函数,用于实现数据的插值操作。