微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > +使用ARM的DSP库

+使用ARM的DSP库

时间:10-02 整理:3721RD 点击:

STM32F4 采用 Cortex-M4 内核,相比 Cortex-M3 系列除了内置硬件 FPU 单元,在数字信号处理方面还增加了 DSP 指令集,支持诸如单周期乘加指令(MAC),优化的单指令多数据指令(SIMD),饱和算数等多种数字信号处理指令集。相比 Cortex-M3,Cortex-M4 在数字信号处理能力方面得到了大大的提升。Cortex-M4 执行所有的 DSP 指令集都可以在单周期内完成,而Cortex-M3 需要多个指令和多个周期才能完成同样的功能。STM32F4 的 DSP 库源码和测试实例在 ST 提供的标准库:STM32F4xx_DSP_StdPeriph_Lib_V1.7.1里面就有



DSP_Lib 源码包的 Source 文件夹是所有 DSP 库的源码,Examples 文件夹是相对应的一些测试实例。这些测试实例都是带 main 函数的,也就是拿到工程中可以直接使用。

我们可以不用去ST官网下载DSP库文件,因为KEIL安装目录下面会自带这些DSP库函数,在XX:\Keil_v5\ARM\CMSIS下面,如下图所示:



所有DSP函数都是以*.lib提供的,总共有4个文件:

arm_cortexM0l_math.lib  (Cortex-M0 小端模式)

arm_cortexM3l_math.lib  (Cortex-M3 小端模式)

arm_cortexM4l_math.lib  (浮点 Cortex-M4 大端模式)

arm_cortexM4lf_math.lib  (浮点 Cortex-M4 小端模式)

我们得根据所用 MCU 内核类型以及端模式来选择符合要求的.lib 文件,我们所用的STM32F4 属于 CortexM4F 内核,小端模式,应选择:arm_cortexM4lf_math.lib(浮点 Cortex-M4小端模式)。

在工程中添加库文件,如下图所示:



在程序中添加头文件:

#include"math.h"

#include"arm_math.h"

还要添加全局宏定义,

1,__FPU_USED

2,__FPU_PRESENT

3,ARM_MATH_CM4

4,__CC_ARM

5,ARM_MATH_MATRIX_CHECK

6,ARM_MATH_ROUNDING

在KEIL里面C/C++选项卡,然后在 Define 里面进行设置,如下图



至此可以使用ARM的DSP库函数了,有很多人找不到DSP库函数说明文档,所以有些人使用起来会出错;其实在KEIL5安装目录下面有帮助文件,在

XX:\Keil_v5\ARM\CMSIS\Documentation\DSP\html



DSP库包括以下几个系列:

BasicMathFunctions

基本数学函数:提供浮点数的各种基本运算函数,如向量加减乘除等运算。

CommonTables

arm_common_tables.c 文件提供位翻转或相关参数表。

ComplexMathFunctions

复杂数学功能,如向量处理,求模运算的。

ControllerFunctions

控制功能函数。包括正弦余弦,PID电机控制,矢量 Clarke变换,矢量 Clarke 逆变换等。

FastMathFunctions

快速数学功能函数。提供了一种快速的近似正弦,余弦和平方根等相比 CMSIS 计算库要快

的数学函数。

FilteringFunctions

滤波函数功能,主要为 FIR和 LMS(最小均方根)等滤波函数。

MatrixFunctions

矩阵处理函数。包括矩阵加法、矩阵初始化、矩阵反、矩阵乘法、矩阵规模、矩阵减法、

矩阵转置等函数。

StatisticsFunctions

统计功能函数。如求平均值、最大值、最小值、计算均方根 RMS、计算方差/标准差等。

SupportFunctions

支持功能函数,如数据拷贝,Q格式和浮点格式相互转换,Q 任意格式相互转换。

TransformFunctions

变换功能。包括复数 FFT(CFFT)/复数 FFT 逆运算(CIFFT)、实数 FFT(RFFT)/实数

FFT 逆运算(RIFFT)、和 DCT(离散余弦变换)和配套的初始化函数。

下面测试一下复数求模运算。函数定义如下:

void arm_cmplx_mag_f32(float32_t * pSrc,float32_t * pDst, uint32_t numSamples)

参数定义:

*pSrcA  points to the first input vector

*pSrcB  points to the second input vector

numSamples number of complex samples in each vector

*realResult   real part of the result returned here

*imagResult imaginary part of the result returned here

其中pSrc代表输入复数数据(第一个数实部、第一个数虚部、……)

     pDst代表结果输出(第一个数模值、第二个数模值……)

     numSamples代表需要做几个复数求模数据个数

用matlab直接生成复数数据和结果数据(用来做对比使用)

复数数据是信号的FFT结果,因为这些在实际项目中也会经常使用FFT求模。




在Keil中用arm_cmplx_mag_f32进行计算和data_abs进行对比,把结果通过debug printf输出,可以看出结果相当精确。



将KEIL计算结果发送到串口,然后和Matlab中数据进行对比。






虽然没看懂,但是觉得和牛逼。

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top