[应用相关] STM32的DSP库的应用

[复制链接]
3770|8
 楼主| xuanhuanzi 发表于 2018-1-31 18:56 | 显示全部楼层 |阅读模式
本篇内容将简要分析STM32自带的DSP库文件,其用汇编语言编写,代码执行效率明显优于C语言,ST公司封装好了了库文件,我们不必看懂其汇编代码,只要会调用接口函数即可。
1,代码分析
    首先我们需要在一个已经建立好的工程文件里添加如下编译路径:
0.jpg
工程需要添加的文件如下图:
2.jpg
       为了产生fft变换信号,我们可以自己产生个采样信号:使用三角函数生成采样点,供FFT计算,fx  = 4000 * sin(PI2*i*50.0/Fs) + 4000 * sin(PI2*i*2500.0/Fs) + 4000*sin(PI2*i*2550.0/Fs)。
      模拟采样数据,采样数据中包含3种频率正弦波:50Hz,2500Hz,2550Hz, lBUFIN数组中,每个单元数据高字(高16位)中存储采样数据的实部,低字(低16位)存储采样数据的虚部(总是为0)。
      其中dsp_asm_init()函数的作用是产生采样信号,实际工程应用中我们使用的是ADC采样的处理值。dsp_asm_test()函数的作用是进行FFT变换,并计算各次谐波幅值。具体代码参见下面:

 楼主| xuanhuanzi 发表于 2018-1-31 18:56 | 显示全部楼层
  1. /*
  2. *********************************************************************************************************
  3. *                                     MICIRUM BOARD SUPPORT PACKAGE
  4. *
  5. *                             (c) Copyright 2007; Micrium, Inc.; Weston, FL
  6. *
  7. *               All rights reserved.  Protected by international copyright laws.
  8. *               Knowledge of the source code may NOT be used to develop a similar product.
  9. *               Please help us continue to provide the Embedded community with the finest
  10. *               software available.  Your honesty is greatly appreciated.
  11. *********************************************************************************************************
  12. */

  13. /*
  14. *********************************************************************************************************
  15. *
  16. *                                        BOARD SUPPORT PACKAGE
  17. *
  18. *                                     ST Microelectronics STM32
  19. *                                              with the
  20. *                                   STM3210B-EVAL Evaluation Board
  21. *
  22. * Filename      : bsp.c
  23. * Version       : V1.00
  24. * Programmer(s) : Brian Nagel
  25. *********************************************************************************************************
  26. */

  27. /*
  28. *********************************************************************************************************
  29. *                                             INCLUDE FILES
  30. *********************************************************************************************************
  31. */

  32. #define  DSP_ASM
  33. #include "stm32f10x.h"
  34. #include "dsp_asm.h"
  35. #include "stm32_dsp.h"
  36. #include "table_fft.h"
  37. #include <stdio.h>
  38. #include <math.h>


  39. /*
  40. *********************************************************************************************************
  41. *                                           LOCAL CONSTANTS
  42. *********************************************************************************************************
  43. */
  44. #define PI2 6.28318530717959
  45. #define NPT_1024 1024
  46. //#define NPT_256 256
  47. //#define NPT_1024 1024

  48. // N=64,Fs/N=50Hz,Max(Valid)=1600Hz
  49. #ifdef NPT_64
  50. #define NPT 64
  51. #define Fs  3200
  52. #endif

  53. // N=256,Fs/N=25Hz,Max(Valid)=3200Hz
  54. #ifdef NPT_256
  55. #define NPT 256
  56. #define Fs  6400
  57. #endif

  58. // N=1024,Fs/N=5Hz,Max(Valid)=2560Hz
  59. #ifdef NPT_1024
  60. #define NPT 1024
  61. #define Fs  5120
  62. #endif


  63. /*
  64. *********************************************************************************************************
  65. *                                          LOCAL DATA TYPES
  66. *********************************************************************************************************
  67. */


  68. /*
  69. *********************************************************************************************************
  70. *                                            LOCAL TABLES
  71. *********************************************************************************************************
  72. */


  73. /*
  74. *********************************************************************************************************
  75. *                                       LOCAL GLOBAL VARIABLES
  76. *********************************************************************************************************
  77. */
  78. long lBUFIN[NPT];         /* Complex input vector */
  79. long lBUFOUT[NPT];        /* Complex output vector */
  80. long lBUFMAG[NPT];/* Magnitude vector */
  81. /*
  82. *********************************************************************************************************
  83. *                                      LOCAL FUNCTION PROTOTYPES
  84. *********************************************************************************************************
  85. */
  86. void dsp_asm_powerMag(void);

  87. /*
  88. *********************************************************************************************************
  89. *                                     LOCAL CONFIGURATION ERRORS
  90. *********************************************************************************************************
  91. */


  92. /*
  93. ******************************************************************************************************************************
  94. ******************************************************************************************************************************
  95. **                                         Global Functions
  96. ******************************************************************************************************************************
  97. ******************************************************************************************************************************
  98. */

  99. void  dsp_asm_init()
  100. {
  101.   u16 i=0;
  102.   float fx;
  103.   for(i=0;i<NPT;i++)
  104.   {
  105.     fx  = 4000 * sin(PI2*i*50.0/Fs) + 4000 * sin(PI2*i*2500.0/Fs) + 4000*sin(PI2*i*2550.0/Fs);
  106.     lBUFIN[i] = ((long)fx)<<16;
  107.   }
  108. }

  109. void  dsp_asm_test()
  110. {

  111. #ifdef NPT_64
  112.   cr4_fft_64_stm32(lBUFOUT, lBUFIN, NPT);
  113. #endif

  114. #ifdef NPT_256
  115.   cr4_fft_256_stm32(lBUFOUT, lBUFIN, NPT);
  116. #endif

  117. #ifdef NPT_1024
  118.   cr4_fft_1024_stm32(lBUFOUT, lBUFIN, NPT);
  119. #endif

  120.   // 计算幅值
  121.   dsp_asm_powerMag();
  122.   
  123. }

  124. void dsp_asm_powerMag(void)
  125. {
  126.   s16 lX,lY;
  127.   u32 i;
  128.   for(i=0;i<NPT/2;i++)
  129.   {
  130.     lX  = (lBUFOUT[i] << 16) >> 16;
  131.     lY  = (lBUFOUT[i] >> 16);
  132.     {
  133.     float X    = NPT * ((float)lX) /32768;
  134.     float Y    = NPT * ((float)lY) /32768;
  135.     float Mag = sqrt(X*X + Y*Y)/NPT;
  136.     lBUFMAG[i]    = (u32)(Mag * 65536);
  137.     }
  138.   }
  139. }

  140. dsp_asm.c
 楼主| xuanhuanzi 发表于 2018-1-31 18:57 | 显示全部楼层
  1. /*
  2. *********************************************************************************************************
  3. *                                     MICIRUM BOARD SUPPORT PACKAGE
  4. *
  5. *                             (c) Copyright 2007; Micrium, Inc.; Weston, FL
  6. *
  7. *               All rights reserved.  Protected by international copyright laws.
  8. *               Knowledge of the source code may NOT be used to develop a similar product.
  9. *               Please help us continue to provide the Embedded community with the finest
  10. *               software available.  Your honesty is greatly appreciated.
  11. *********************************************************************************************************
  12. */

  13. /*
  14. *********************************************************************************************************
  15. *
  16. *                                        BOARD SUPPORT PACKAGE
  17. *
  18. *                                     ST Microelectronics STM32
  19. *                                              with the
  20. *                                   STM3210B-EVAL Evaluation Board
  21. *
  22. * Filename      : bsp.h
  23. * Version       : V1.00
  24. * Programmer(s) : Brian Nagel
  25. *********************************************************************************************************
  26. */

  27. #ifndef  __DSP_ASM_H__
  28. #define  __DSP_ASM_H__

  29. /*
  30. *********************************************************************************************************
  31. *                                               EXTERNS
  32. *********************************************************************************************************
  33. */

  34. #ifdef   DSP_ASM
  35. #define  DSP_EXT
  36. #else
  37. #define  DSP_EXT  extern
  38. #endif

  39. /*
  40. *********************************************************************************************************
  41. *                                             INCLUDE FILES
  42. *********************************************************************************************************
  43. */




  44. /*
  45. *********************************************************************************************************
  46. *                                          GLOBAL VARIABLES
  47. *********************************************************************************************************
  48. */


  49. /*
  50. *********************************************************************************************************
  51. *                                               MACRO'S
  52. *********************************************************************************************************
  53. */


  54. /*
  55. *********************************************************************************************************
  56. *                                            FUNCTION PROTOTYPES
  57. *********************************************************************************************************
  58. */

  59. void    dsp_asm_test(void);
  60. void  dsp_asm_init(void);

  61. #endif                                                          /* End of module include.                               */

  62. dsp_asm.h
 楼主| xuanhuanzi 发表于 2018-1-31 18:57 | 显示全部楼层
着重分析下dsp_asm_powerMag()函数的作用,其函数就是求幅值,首先定义的的一个16位的有符号的数据IX 和IY 这两个只是中间变量,然后定义的i,是32位的无符号型。语句的目的是Mag = sqrt(X*X + Y*Y)/NPT。但直接这么写不符合DSP的计算习惯也就是不符合浮点运算的习惯。因此语句在for函数i写道 lX  = (lBUFOUT[i] << 16) >> 16 就是取32位的i的低16位数据,lY  = (lBUFOUT[i] >> 16);是取高16位数据。下面的两句
    float X    = NPT * ((float)lX) /32768;   
    float Y    = NPT * ((float)lY) /32768
    目的就是把数据浮点化,至于为什么是除以32768 。可以这么说,浮点化就好像10进制里面的科学计数法。32768=2的15次。除以32768也就是去除了浮点数后面的那个基数,只剩下前面的。比如1991 改写成1.991*10的三次幂,再除以10的三次方,只剩下1.991,便于余下的运算。至于最后一句要乘以65536是因为我们定义的数据和我们需要求得的数据都是无符号32位的,之前已经把32位的数据拆开又分别浮点化了又开了个根号,所以再把它变回来 只需要乘以2的16次,也就是65536.比如说问你什么时候生日,你说是19911030,然而DSP是不习惯这么干的,他需要把它拆开为1991和1030。再写成1.991x10的3次方和1.030x10的3次方。然后才能进行其他的运算。
     这里是ST公司采用了DSP专用芯片(主要是指TI)的写法,也就是说尽管DSP的芯片类型很多,数据变量的定义也各有差异,但原理是一样的,最终还是要采用DSP习惯的运算方式。至于为什么一定要采用浮点运算,因为机器是傻子,然而TI公司的工程师是天才。

     main函数中我们只需在while(1)前加上dsp_asm_init();  dsp_asm_test();即可。
 楼主| xuanhuanzi 发表于 2018-1-31 18:59 | 显示全部楼层
2,实验现象

       注意FFT运算结果的对称性,也即256点的运算结果,只有前面128点的数据是有效可用的。

     ① N=64,Fs/N=50Hz,Max(Valid)=1600Hz,64点FFt,采样率3200Hz,频率分辨率50Hz,测量最大有效频率1600Hz

64点FFT运算结果图(局部): 00.jpg


     上图中,数组下标X对应的谐波频率为:N×Fs/64=N×3200/64=N*50Hz.

     lBUFMAG[1] 对应 50Hz谐波幅值。

    上图中由于FFT分辨率50HZ,最大只能识别1600Hz谐波,导致结果中出现错误的数据。

         ②N=256,Fs/N=25Hz,Max(Valid)=3200Hz,256点FFt,采样率6400Hz,频率分辨率25Hz,测量最大有效频率3200Hz
256点FFT运算结果图(局部):

01.jpg

     上图中,数组下标X对应的谐波频率为:N×Fs/256=N×6400/256=N*25Hz.

     lBUFMAG[2] 对应 2×25 =50Hz谐波幅值

     lBUFMAG[100] 对应 100×25=2500Hz谐波幅值

     lBUFMAG[102] 对应 102×25=2550Hz谐波幅值

    ③N=1024,Fs/N=5Hz,Max(Valid)=2560Hz,1024点FFt,采样率5120Hz,频率分辨率5Hz,测量最大有效频率2560Hz

1024点FFT运算结果图(局部):

02.jpg

    上图中,数组下标X对应的谐波频率为:N×Fs/1024=N×5120/1024=N*5Hz.

     lBUFMAG[10] 对应 10×5 =50Hz谐波幅值

     lBUFMAG[500] 对应 500×5=2500Hz谐波幅值

     lBUFMAG[510] 对应 510×5=2550Hz谐波幅值



总结:该工程中模拟信号源为:4000 * sin(PI2*i*50.0/Fs) + 4000 * sin(PI2*i*2500.0/Fs) + 4000*sin(PI2*i*2550.0/Fs)。

信号为1个50Hz、1个2500Hz、1个2550Hz的正弦波混合信号,幅值为均为4000。

ylslib 发表于 2018-1-31 21:45 | 显示全部楼层
确实好多都是内嵌汇编写的,为了提高速度,ST写这个库也是费了大工夫的。
 楼主| xuanhuanzi 发表于 2018-2-6 18:01 | 显示全部楼层
是的 ,这个肯定开发人员费了不少心血。
M++ 发表于 2018-7-27 16:35 | 显示全部楼层
请问楼主有没有完整的DSP库?可以分享一下吗,感谢!
Thorald 发表于 2018-7-30 16:13 | 显示全部楼层
DSP的芯片类型很多,数据变量的定义也各有差异,但原理是一样的
您需要登录后才可以回帖 登录 | 注册

本版积分规则

183

主题

2331

帖子

3

粉丝
快速回复 在线客服 返回列表 返回顶部