你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

【经验分享】STM32的DSP库的应用

[复制链接]
STMCU小助手 发布时间:2022-1-15 21:53
本篇内容将简要分析STM32自带的DSP库文件,其用汇编语言编写,代码执行效率明显优于C语言,ST公司封装好了了库文件,我们不必看懂其汇编代码,只要会调用接口函数即可。
1,代码分析
    首先我们需要在一个已经建立好的工程文件里添加如下编译路径:
262145381378421.jpg
工程需要添加的文件如下图:
262149227151512.jpg
6 Q5 f$ d: t) \" Y/ y5 T9 _
       为了产生fft变换信号,我们可以自己产生个采样信号:使用三角函数生成采样点,供FFT计算,fx  = 4000 * sin(PI2*i*50.0/Fs) + 4000 * sin(PI2*i*2500.0/Fs) + 4000*sin(PI2*i*2550.0/Fs)。& d- ?5 ~& C/ y. A1 u  ~
      模拟采样数据,采样数据中包含3种频率正弦波:50Hz,2500Hz,2550Hz, lBUFIN数组中,每个单元数据高字(高16位)中存储采样数据的实部,低字(低16位)存储采样数据的虚部(总是为0)。' E, Y" K2 w8 R# u" O
      其中dsp_asm_init()函数的作用是产生采样信号,实际工程应用中我们使用的是ADC采样的处理值。dsp_asm_test()函数的作用是进行FFT变换,并计算各次谐波幅值。具体代码参见下面:
2 R( s% E- U, @9 m# G9 a
  1. 1 /*
    0 l1 e% i* x7 v- N' R( t
  2.   2 *********************************************************************************************************
    8 P1 D+ {' v) U% m& J, f' C
  3.   3 *                                     MICIRUM BOARD SUPPORT PACKAGE
    & N, |" Q2 \5 ~$ o5 G
  4.   4 *0 D; X7 A0 b/ `6 l3 N1 e" a
  5.   5 *                             (c) Copyright 2007; Micrium, Inc.; Weston, FL1 }1 n3 t$ W! J8 g" o- H
  6.   6 *1 c  Z( {- j0 S, I' h. x; u! o
  7.   7 *               All rights reserved.  Protected by international copyright laws.+ q! y; r0 }+ T1 R3 I# ~
  8.   8 *               Knowledge of the source code may NOT be used to develop a similar product.  R2 _$ }# @! D0 [9 _
  9.   9 *               Please help us continue to provide the Embedded community with the finest8 e/ w$ R; P; f9 J% V; M; M' N' B
  10. 10 *               software available.  Your honesty is greatly appreciated." q! E6 q9 W. E& G2 q$ W/ J0 [
  11. 11 *********************************************************************************************************
    3 W8 K# u- y* ?4 U
  12. 12 */: G; `! r! e8 `7 ^$ a, M" Q
  13. 13 ; d0 R) e+ N. g! f5 t: h! x
  14. 14 /*% n# W) L+ _; U! G& x6 r
  15. 15 *********************************************************************************************************
    2 M; i  O' H  P% q8 s5 U2 e+ c9 G
  16. 16 *1 u6 }  r* `/ i' \" x( r. M( ]
  17. 17 *                                        BOARD SUPPORT PACKAGE* q& H' C% \: G( R
  18. 18 *) A$ s6 \0 Z9 U0 r% Y# }
  19. 19 *                                     ST Microelectronics STM32
    ( l3 ?0 _5 a9 C% Q
  20. 20 *                                              with the* y/ Q. P6 f) s
  21. 21 *                                   STM3210B-EVAL Evaluation Board
    - @" r+ d" Z3 F. |& V, H. C3 {3 X' t5 Z
  22. 22 *
    2 i6 Q% d$ D4 H: X4 {' J: O
  23. 23 * Filename      : bsp.c$ N9 [! P& h" {* E- {
  24. 24 * Version       : V1.005 Q  _( `2 ^2 `3 s5 x3 \- K+ [
  25. 25 * Programmer(s) : Brian Nagel
    , S. @4 O+ t5 y! m& i8 y0 O
  26. 26 *********************************************************************************************************! T9 p2 m3 b$ x" l6 C9 E' s
  27. 27 */- n/ y5 l& r; B7 H: Q2 p
  28. 28
    9 M4 ]2 U+ |" [$ {$ J) h6 {
  29. 29 /*
    2 k6 H% U) E4 w3 i# H. h6 X
  30. 30 *********************************************************************************************************
      |# Z2 }! x" w& B6 A" Z9 y
  31. 31 *                                             INCLUDE FILES
    % J4 R) f7 ^0 U' d- M( Q1 Y
  32. 32 *********************************************************************************************************# [: Y; N+ o! ^7 D' r4 ^; N0 [
  33. 33 */6 j! E% w& y# r. C! [. E* C
  34. 34
    0 {$ |4 O" [5 e: n* i6 x; C
  35. 35 #define  DSP_ASM. O  X9 r! b% G8 Z# s
  36. 36 #include "stm32f10x.h"
    , h$ y+ @9 M/ O: ~) G- Q
  37. 37 #include "dsp_asm.h"$ [+ h, r# j0 ^
  38. 38 #include "stm32_dsp.h"/ ~+ q8 I% b+ D# N
  39. 39 #include "table_fft.h"  y6 T! i+ R  a# S5 D3 t' ^  Z
  40. 40 #include <stdio.h>) `. g+ K9 I3 P
  41. 41 #include <math.h>
    1 h- H/ a: V/ C# c7 {+ t
  42. 42 3 z* k' C/ w: m0 z: K2 s8 S% g
  43. 43 # }0 H. n( j" \
  44. 44 /*: q+ f' x7 w2 C  O, H
  45. 45 *********************************************************************************************************+ A% m6 I  H+ l/ _8 X6 @
  46. 46 *                                           LOCAL CONSTANTS6 m' f. N6 v6 z: {- N! H9 E
  47. 47 *********************************************************************************************************
    ( l7 d1 [( C% d, _: b
  48. 48 */
    & h& T2 `4 X9 ]5 S0 M4 c' E( `
  49. 49 #define PI2 6.28318530717959- [0 t& l  j5 d/ B+ Z. _
  50. 50 #define NPT_1024 1024
    ! o. F; K  |% v
  51. 51 //#define NPT_256 2569 G7 U+ ~2 _+ A* Z( r
  52. 52 //#define NPT_1024 1024
    2 T7 i4 u: w% s: c9 q1 c- d
  53. 53 ( R  D$ w, k* _
  54. 54 // N=64,Fs/N=50Hz,Max(Valid)=1600Hz& R) Q% \  }  [( s; h# J  p/ P
  55. 55 #ifdef NPT_64
      A; r) l  }: O
  56. 56 #define NPT 64
    9 }, S2 U7 D. p& v
  57. 57 #define Fs  3200/ A9 U0 k( A) ?# s' l
  58. 58 #endif9 o- ?, ^- R( Y- t' L5 G
  59. 59 3 X! o  @! j3 R% T
  60. 60 // N=256,Fs/N=25Hz,Max(Valid)=3200Hz
    4 r( a1 r8 Z) N8 [/ b0 ^7 D
  61. 61 #ifdef NPT_256+ H+ r. v; L3 v% f+ v
  62. 62 #define NPT 256
    : w& T* q# g& d% U0 l& X
  63. 63 #define Fs  6400+ P* A: f. K4 K7 _* A+ ?" u9 J
  64. 64 #endif
    . T$ C" C! K* l# I
  65. 65
    ( }- n1 T: F7 L  b4 [# D
  66. 66 // N=1024,Fs/N=5Hz,Max(Valid)=2560Hz
    " T  {  s7 z6 `9 W6 ?7 H
  67. 67 #ifdef NPT_1024
    $ B* Z+ G! j6 Y3 X
  68. 68 #define NPT 10244 k; x5 U% i. W
  69. 69 #define Fs  5120
    & m7 H; f1 ~1 d0 g3 H% `3 o! o
  70. 70 #endif; s% l/ M  O( K) I
  71. 71
    # ~0 ~# `, O8 n# J4 c
  72. 72
    & J& P8 \( T. v6 l$ R0 \6 ]$ C
  73. 73 /*
    - T9 Z9 L5 t4 x' o+ d5 c. ^
  74. 74 *********************************************************************************************************3 }! Z6 e* i, n3 }2 v# d3 [
  75. 75 *                                          LOCAL DATA TYPES: a4 S7 G3 d' K
  76. 76 *********************************************************************************************************% u  C" o4 l; u# [- k8 b) E
  77. 77 */
    ; D( G8 C3 W9 S2 k
  78. 78
    , T  m5 J! B8 z% S4 e
  79. 79
    ! o! L! Y! C' g& w/ U5 D
  80. 80 /*1 z6 h# o- z$ x( d" e
  81. 81 *********************************************************************************************************
    ! s9 D+ z, ^$ A4 K5 |2 W2 }
  82. 82 *                                            LOCAL TABLES) L+ H  U9 Z! P. p
  83. 83 *********************************************************************************************************! Y' m; M3 w2 ~% J/ j2 H
  84. 84 */6 C8 e9 A  X' @& {
  85. 85
    , y# o! e# ~( K# r
  86. 86
    9 C* g6 |3 z; r& L
  87. 87 /*
    " r* P0 v" M  Y- c
  88. 88 *********************************************************************************************************2 T: Y' {0 T5 C, f' S" f
  89. 89 *                                       LOCAL GLOBAL VARIABLES
    ) U# `1 Z3 _. v6 B+ Z3 A$ D
  90. 90 *********************************************************************************************************
    2 U  v  C. G6 M$ H% S0 ]) k/ D& i
  91. 91 */; g* ?) X! }) P) G2 ]7 J' g( A- V2 ^
  92. 92 long lBUFIN[NPT];         /* Complex input vector */
    ( e+ G4 G- C- z. W3 M7 Z% ?* d: _) M
  93. 93 long lBUFOUT[NPT];        /* Complex output vector *// k$ d3 z% E: L$ U9 ~
  94. 94 long lBUFMAG[NPT];/* Magnitude vector */5 c5 v& m0 W) E# k" m1 {- h5 D
  95. 95 /*3 y1 _2 \$ ~& Y; ^0 r7 J
  96. 96 *********************************************************************************************************
    3 Z1 b$ V+ y/ I  ]; t8 L1 o( A" W
  97. 97 *                                      LOCAL FUNCTION PROTOTYPES
    - ^+ v& i7 B1 A5 o
  98. 98 *********************************************************************************************************2 G$ X: W! g, \- M
  99. 99 */! d. _" U  _" A/ e1 \+ K
  100. 100 void dsp_asm_powerMag(void);& ]) u9 k7 N1 X' F& I8 V8 \+ s
  101. 101
    6 C1 o, Z4 }# y) M9 g( u) |
  102. 102 /*
    % t, d7 h6 G2 d& \1 V% m% Y
  103. 103 *********************************************************************************************************
      K3 j- k' K, C3 K) N5 o, }
  104. 104 *                                     LOCAL CONFIGURATION ERRORS
    6 k2 I, F( s8 ~8 h" @" H
  105. 105 *********************************************************************************************************
    9 J) l% B  l- B3 m
  106. 106 */
      x' [" ?) P; U1 n, k
  107. 107
    , ~% t. w' O: ?5 |! S
  108. 108
    + R* a  w+ K! H7 c/ d
  109. 109 /*
    + M5 ~0 m- d- y: E, V( O
  110. 110 ******************************************************************************************************************************
    - y0 }' o& A" |5 N2 O1 Z
  111. 111 ******************************************************************************************************************************
    5 L$ W9 n/ B, \, ]
  112. 112 **                                         Global Functions! j+ ?8 N+ r% Y0 e# o9 ^% c% B
  113. 113 ******************************************************************************************************************************& B3 t: O% J5 v8 A( I4 w1 J
  114. 114 ******************************************************************************************************************************  P4 y+ m7 D4 ~: ]' x/ k$ w/ x
  115. 115 */
    / Z$ b$ a9 Q, w& `& v7 c
  116. 116 ' d& r6 c6 N( I$ A$ a
  117. 117 void  dsp_asm_init()0 O1 \4 z) k! z' |4 }: k3 w+ _" v
  118. 118 {
    8 h5 @6 C. A2 t! @
  119. 119   u16 i=0;
    $ j5 M9 E: [. S/ Y% s0 o
  120. 120   float fx;/ `4 N3 M! p( {, I- S. D5 t0 S6 X
  121. 121   for(i=0;i<NPT;i++)& n2 n5 q7 Q! b! a+ h
  122. 122   {; t# b* M5 H) E0 @& S  A
  123. 123     fx  = 4000 * sin(PI2*i*50.0/Fs) + 4000 * sin(PI2*i*2500.0/Fs) + 4000*sin(PI2*i*2550.0/Fs);
    3 E, C9 J) \8 X# M0 |
  124. 124     lBUFIN[i] = ((long)fx)<<16;
    2 b! B/ I* _1 w" e
  125. 125   }
    % C0 \5 Z2 r+ i: ]
  126. 126 }
    ! D1 ?! ?$ S4 E" u  i9 u4 W4 }9 T
  127. 127   Z  N" F$ [1 ^
  128. 128 void  dsp_asm_test() 2 r4 |% u- H3 E6 q! ^3 f
  129. 129 {$ B0 s4 q( w7 ^- e+ t9 }0 D
  130. 130
    ' H6 N4 L8 F* _6 C
  131. 131 #ifdef NPT_64
      P, `2 ^# V" x! j2 g% C1 o; }5 B
  132. 132   cr4_fft_64_stm32(lBUFOUT, lBUFIN, NPT);( \& f8 C: t) o, i
  133. 133 #endif4 q' Z3 L+ a( ~' u
  134. 134 9 g& r8 i$ \4 `9 g
  135. 135 #ifdef NPT_256( ^, l% j, z) M
  136. 136   cr4_fft_256_stm32(lBUFOUT, lBUFIN, NPT);$ M( [3 ]- V$ o( X" f
  137. 137 #endif. B6 [/ j& [$ ]' {2 N' Y8 {
  138. 138
    7 h" N+ L' A  M7 V2 y' r1 @. \
  139. 139 #ifdef NPT_1024
    , D% v: B6 A$ c. A9 n
  140. 140   cr4_fft_1024_stm32(lBUFOUT, lBUFIN, NPT);
    9 h$ Q+ W6 r3 k0 X+ Y3 I6 W
  141. 141 #endif  a( R! V/ U" o% C! Z$ v
  142. 142 & t+ m9 @: ^' }( r# d9 a% k- w
  143. 143   // 计算幅值. n% D9 }  L# K( n' P
  144. 144   dsp_asm_powerMag();7 P2 s+ }+ G" g3 }2 @% I% ~
  145. 145   
    5 P* X& N6 n0 x, F# p
  146. 146 }
    2 T. B% w) B! v7 N0 Z2 |& @. w, }
  147. 147
    ! a+ i3 l" }: Q6 i7 E5 z% H+ y
  148. 148 void dsp_asm_powerMag(void)
    " ?& t. ~8 h% R; m/ i6 C! R8 M
  149. 149 {& e9 Q! G, a+ @9 X' t  H9 U8 w
  150. 150   s16 lX,lY;
    $ a" ^% W6 C$ l4 a8 I0 ^  W: u' h0 y
  151. 151   u32 i;6 ^: K' s3 i$ u; ^. X1 c
  152. 152   for(i=0;i<NPT/2;i++)
    8 {9 e3 E( |8 R; P) l1 D1 k
  153. 153   {( ^# j& C7 c+ x  s% t* y, Y' Q) a
  154. 154     lX  = (lBUFOUT[i] << 16) >> 16;* E  H5 p6 I/ L8 f- S0 M
  155. 155     lY  = (lBUFOUT[i] >> 16);
    4 k/ u/ p' l4 q) V; a# O9 K
  156. 156     {9 _2 _, ~4 s: p! n' G9 l1 z5 m; O
  157. 157     float X    = NPT * ((float)lX) /32768;6 X9 D' U( ^0 Y- r
  158. 158     float Y    = NPT * ((float)lY) /32768;1 P2 [5 @! T) Y1 Q8 O
  159. 159     float Mag = sqrt(X*X + Y*Y)/NPT;8 h& j* E3 ^+ A
  160. 160     lBUFMAG[i]    = (u32)(Mag * 65536);+ g- W7 C7 ^' l3 j, N. |
  161. 161     }# M6 D: T0 R$ t
  162. 162   }
    5 @- |* K  `& q! G+ u2 Q) q0 I9 W
  163. 163 }
复制代码
  1. 1 /** _! E" @6 h9 h. D
  2. 2 *********************************************************************************************************  K0 ]* Z: r6 |
  3. 3 *                                     MICIRUM BOARD SUPPORT PACKAGE
    - O0 @3 w3 O7 z! @6 x8 G
  4. 4 *
    ( x5 c# M" j2 y( L! a( ~# R
  5. 5 *                             (c) Copyright 2007; Micrium, Inc.; Weston, FL
    ; U1 E5 o0 I4 c% Z0 f
  6. 6 ** g4 [6 d6 Z" D7 x
  7. 7 *               All rights reserved.  Protected by international copyright laws.
    ( `; d$ P; p! k  e' N' r
  8. 8 *               Knowledge of the source code may NOT be used to develop a similar product.
    : a$ f5 k1 L2 `# j* V0 I- L
  9. 9 *               Please help us continue to provide the Embedded community with the finest& T& v# Z7 q. X/ P8 U: |
  10. 10 *               software available.  Your honesty is greatly appreciated.: C+ R5 O' I5 @! p3 ~) s2 B9 O0 m
  11. 11 *********************************************************************************************************8 }/ b7 Y3 g5 x( i; z% j
  12. 12 */$ T: M/ z- U; J4 f4 i6 a
  13. 13
    1 o9 a( C! z# ^  x7 [; p- M
  14. 14 /*. t. J6 C  Z  K: W9 A; S9 T% X, j* H
  15. 15 *********************************************************************************************************! M. p7 B; `& Q' C8 P5 E2 c1 ^+ J2 `
  16. 16 *' K  J+ y3 J; G* v# B. f
  17. 17 *                                        BOARD SUPPORT PACKAGE9 S/ R% N5 a; l  r6 F
  18. 18 *
    , W+ \/ U8 o8 }* Z
  19. 19 *                                     ST Microelectronics STM32
      q. Y9 T" z. ?; n" v
  20. 20 *                                              with the% o1 `$ ~' w' F0 L3 {$ C
  21. 21 *                                   STM3210B-EVAL Evaluation Board) U! V7 c# a2 y7 Q6 K  o) i: E6 T
  22. 22 *
    : E  E; C! ]+ P5 ^5 q
  23. 23 * Filename      : bsp.h
    / T/ P4 l! l0 }( E3 E  t( }' {* _
  24. 24 * Version       : V1.00
    6 V% W* B9 N5 Q, ^9 o# D2 A
  25. 25 * Programmer(s) : Brian Nagel, |# v5 s& S. I4 [6 `) ?# C
  26. 26 *********************************************************************************************************
    4 r/ |& ^( {7 b# O
  27. 27 */
    , A5 U) r* l$ \5 a' u, o- O
  28. 28 - N4 [) R' b& a5 @' ~1 ]
  29. 29 #ifndef  __DSP_ASM_H__
    # ?/ C; g7 W9 m9 R
  30. 30 #define  __DSP_ASM_H__9 T3 N. y+ L% o) k7 _- V0 K# C7 `
  31. 31 ) a/ U' A) M$ i& o! x/ x- T
  32. 32 /*: t( Q( R$ s/ r
  33. 33 *********************************************************************************************************
    ! @. f: [, d* z7 b+ A
  34. 34 *                                               EXTERNS2 ]" b/ p1 X9 d* N1 X) y3 u% Y/ T- A
  35. 35 *********************************************************************************************************9 k/ `5 L  j% P, _" R# b: u; G
  36. 36 */
    ; d3 R. Z6 v& J4 R- O
  37. 37 2 r) e. s; z1 i0 \
  38. 38 #ifdef   DSP_ASM6 J* _" ]6 ~4 a8 o1 g
  39. 39 #define  DSP_EXT
    5 _1 P/ F' [% i& H- A2 O
  40. 40 #else) O1 j( u8 _  k6 J3 V5 {2 {
  41. 41 #define  DSP_EXT  extern% q% ]9 W/ l5 g2 j7 r4 H
  42. 42 #endif, J6 Q3 O' _- s2 k) ], f
  43. 43 6 U" M# J, C1 \5 l: B
  44. 44 /*5 @: `5 b8 T! V% C, n0 G4 ]# r
  45. 45 *********************************************************************************************************- {( g0 v5 l, y
  46. 46 *                                             INCLUDE FILES8 T- |& l+ e1 }
  47. 47 *********************************************************************************************************
      V7 X1 i2 I0 x) w
  48. 48 */
    7 w) w0 q- J. c. {- ~3 g9 p4 R! E
  49. 49 2 Y1 R; E( G4 M2 C7 M
  50. 50
    2 \* ^, Z3 u! ~+ l* ?" j. b
  51. 51
    % ~7 n4 @$ f% m7 o6 N& b! K
  52. 52 ) i0 n, o4 X3 G; k5 k
  53. 53 /*4 l* r' _2 w. v5 Y1 m9 k8 P5 i
  54. 54 *********************************************************************************************************1 l- M6 A4 U; v
  55. 55 *                                          GLOBAL VARIABLES
    ) E8 c6 N0 w" r3 p2 t# }
  56. 56 *********************************************************************************************************0 @, ]( q4 x: I% L# @
  57. 57 */
    & W1 v( s. B2 x" Y+ ~# F4 S
  58. 58
    4 l, T# \0 C1 @5 ?" C7 u
  59. 59 0 j3 O2 F! q2 N8 k% I) z
  60. 60 /*# u9 ?  U6 U/ W( y! e+ g% r1 z$ t
  61. 61 *********************************************************************************************************; G' d% g& C8 N
  62. 62 *                                               MACRO'S7 Y! O2 S# h  ^: G. q0 N, O
  63. 63 *********************************************************************************************************
    9 b- T7 d5 R' M! E4 s4 L- k
  64. 64 */2 ^5 q% q: Q6 S8 \
  65. 65 , X( T! h4 N# x. C/ \: y+ S
  66. 66 ' |1 \. W2 f7 F: C3 o5 h
  67. 67 /*
    ; ?* C) l' y  R! @8 q
  68. 68 *********************************************************************************************************
    $ X7 R- K2 _# V" a7 v( v5 w: |
  69. 69 *                                            FUNCTION PROTOTYPES
    8 {) m( |8 X% D9 q- i+ _2 R6 h
  70. 70 *********************************************************************************************************
      h$ F- L, x- U; P! ^
  71. 71 */
    2 O( A; l: X0 N" Z5 `
  72. 72 9 c  g' I0 a; j  g
  73. 73 void    dsp_asm_test(void);3 u* L- I# u! l6 a
  74. 74 void  dsp_asm_init(void);
    / h- J  w2 V" }; f8 m+ m
  75. 75
    $ @: _3 h- ^; W0 r! [7 I# U$ i9 T
  76. 76 #endif                                                          /* End of module include.                               */
复制代码

# z8 k2 Y. Q+ c1 E$ F2 Z% G1 |
     着重分析下dsp_asm_powerMag()函数的作用,其函数就是求幅值,首先定义的的一个16位的有符号的数据IX 和IY 这两个只是中间变量,然后定义的i,是32位的无符号型。语句的目的是Mag = sqrt(X*X + Y*Y)/NPT。但直接这么写不符合DSP的计算习惯也就是不符合浮点运算的习惯。因此语句在for函数i写道 lX  = (lBUFOUT << 16) >> 16 就是取32位的i的低16位数据,lY  = (lBUFOUT >> 16);是取高16位数据。下面的两句
1 }( d3 |! _1 D0 m9 ?' B    float X    = NPT * ((float)lX) /32768;  , X3 Z) S+ t0 M, Q3 |5 v
    float Y    = NPT * ((float)lY) /327682 e8 y$ ?' @; i
    目的就是把数据浮点化,至于为什么是除以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次方。然后才能进行其他的运算。1 T) C5 Q% e  H# z
     这里是ST公司采用了DSP专用芯片(主要是指TI)的写法,也就是说尽管DSP的芯片类型很多,数据变量的定义也各有差异,但原理是一样的,最终还是要采用DSP习惯的运算方式。至于为什么一定要采用浮点运算,因为机器是傻子,然而TI公司的工程师是天才。
     main函数中我们只需在while(1)前加上dsp_asm_init();  dsp_asm_test();即可。$ z- l+ i9 U' S( y
2,实验现象
       注意FFT运算结果的对称性,也即256点的运算结果,只有前面128点的数据是有效可用的。
     ① N=64,Fs/N=50Hz,Max(Valid)=1600Hz,64点FFt,采样率3200Hz,频率分辨率50Hz,测量最大有效频率1600Hz
64点FFT运算结果图(局部):
262213093876622.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( j' }! K3 I; V' R5 o) G
256点FFT运算结果图(局部):
262216596836465.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运算结果图(局部):
262221245744340.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谐波幅值

0 }- v5 K& L/ |0 k* }
总结:该工程中模拟信号源为: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。
8 U! H6 z$ l% a) Z* }7 s
收藏 评论0 发布时间:2022-1-15 21:53

举报

0个回答

所属标签

相似技术帖

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版