zoukankan      html  css  js  c++  java
  • STM32F4使用FPU+DSP库进行FFT运算的测试过程一

    测试环境:单片机:STM32F407ZGT6   IDE:Keil5.20.0.0  固件库版本:STM32F4xx_DSP_StdPeriph_Lib_V1.4.0

    第一部分:使用源码文件的方式,使用void arm_cfft_radix4_f32(const arm_cfft_radix4_instance_f32 * S,float32_t * pSrc)函数进行FFT运算。

    准备空工程,配置Keil环境.使能STM32F4的FPU单元。

    开启硬件浮点运算,等效于在C/C++->define中定义__FPU_USED,__FPU_PRESENT两个宏

    添加全局宏定义,使能DSP库所有的功能

    图中STM32F4XX,USE_STDPERIPH_DRIVER是新建工程都会用到的配置宏,新建工程参考:http://blog.csdn.net/qianrushi_jinxifeng/article/details/19673755

    其他宏ARM_MATH_CM4,__CC_ARM,ARM_MATH_MATRIX_CHECK,ARM_MATH_ROUNDING 请参考:http://blog.csdn.net/desert187/article/details/20527921

    向工程中添加使用到的DSP库源码

    在stm32f4_dsp_stdperiph_libSTM32F4xx_DSP_StdPeriph_Lib_V1.4.0LibrariesCMSISDSP_LibSource目录下会有如下目录,都是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(离散余弦变换)和配套的初始化函数。

    我们需要CommonTables和TransformFunctions的下的部分文件
    添加到工程如图

    另外我们需要包含相应的头文件路径,所需的头文件在STM32F4xx_DSP_StdPeriph_Lib_V1.4.0LibrariesCMSISInclude路径下可以找到

    编写main()函数,
     1 #include "stm32f4xx_conf.h"
     2 //位带操作
     3 #include "sys.h"
     4 #include "delay.h"
     5 #include "usart.h"
     6 //LCD显示屏功能
     7 #include "Nick_lcd.h"
     8 #include "Nick_keys.h"
     9 
    10 #include "arm_math.h"
    11 #define FFT_LENGTH        1024         //FFT长度,默认是1024点FFT
    12 
    13 float fft_inputbuf[FFT_LENGTH*2];    //FFT输入输出数组,此数组为arm_cfft_radix4_f32的输入输出数组,前一个元素为实部,后一个为虚部,每两个元素代表一个点.
    14 float fft_outputbuf[FFT_LENGTH];     //arm_cmplx_mag_f32() 幅度输出数组
    15 arm_cfft_radix4_instance_f32 scfft;
    16 
    17 int main(void)
    18 { 
    19     delay_init(168);
    20     lcd_init(0);    //初始化LCD
    21     key_init();
    22     uart_init(115200);        //初始化串口波特率为115200
    23     
    24     arm_cfft_radix4_init_f32(&scfft,FFT_LENGTH,0,1);//初始化scfft结构体,设定FFT相关参数
    25     
    26     while(1)
    27     {
    28         u32 keyval = (u32)keys_scan(0);
    29         if(keyval==1)
    30         {
    31             for(int i=0;i<FFT_LENGTH;i++)//生成信号序列
    32             {
    33                  fft_inputbuf[2*i]=15 + 10*arm_sin_f32(2*PI*i*100/FFT_LENGTH) + 
    34                                    5.5*arm_sin_f32(2*PI*i*150/FFT_LENGTH); //生成实部
    35                 
    36                  fft_inputbuf[2*i+1]=0;//虚部全部为0
    37             }
    38             arm_cfft_radix4_f32(&scfft,fft_inputbuf);    //FFT计算(基4)
    39             arm_cmplx_mag_f32(fft_inputbuf,fft_outputbuf,FFT_LENGTH);    //把运算结果复数求模得幅值 
    40             
    41             printf("FFT Result:
    ");
    42             for(int i=0;i<FFT_LENGTH;i++)
    43             {
    44                 printf("%f
    ",fft_outputbuf[i]);
    45             }
    46         }
    47         delay_ms(60);
    48     }
    49 }

    代码分析:如代码所示,利用arm_sin_f32函数产生了,一个基波幅度为15,频率100Hz是幅度为10,频率150Hz是幅度为5.5的信号。

    经过FFT运算后,用arm_cmplx_mag_f32()函数求出赋值,并通过串口打印出来。

    编译运行

    结果分析:

    对串口收到的数据用matlab绘图,如下

    如图,基波幅度为:15360/1024 = 15

    100Hz成分幅度为: 5120*2/1024 = 10

    150Hz成分幅度为: 2816*2/1024 = 5.5

    因此所得的结果是正确的。博主目前为测试相位,故在此不做说明。

    后记,这是使用源码的方式进行操作的,所有源码可跳转,可编辑。但添加麻烦。

    下一篇将使用ST提供的.lib库直接进行运算。链接:http://www.cnblogs.com/NickQ/p/8541156.html



  • 相关阅读:
    STS 创建 Maven 项目填坑
    JeeSite | 访问控制权限
    《Spring + MyBatis 企业应用实战》书评
    MyBatis-Generator 用法介绍
    Java描述数据结构之链表的增删改查
    Java中的Object类的几个方法
    设计模式之策略模式(Strategy Pattern)
    设计模式之模板方法(Template Method)
    JeeSite | 数据分页与翻页
    day 19
  • 原文地址:https://www.cnblogs.com/NickQ/p/8540487.html
Copyright © 2011-2022 走看看