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

【经验分享】如何使用STM32提供的DSP库进行FFT

[复制链接]
STMCU小助手 发布时间:2022-1-15 23:08
前些日子,因为需要在STM32F103系列处理器上,对采集的音频信号进行FFT,所以花了一些时间来研究如何高效并精确的在STM32F103系列处理器上实现FFT。在网上找了很多这方面的资料做实验并进行比较,最终选择了使用STM32提供的DSP库这种方法。
  本文将以一个实例来介绍如何使用STM32提供的DSP库函数进行FFT。

9 V7 V, y$ T/ h
1.FFT运算效率
  使用STM32官方提供的DSP库进行FFT,虽然在使用上有些不灵活(因为它是基4的FFT,所以FFT的点数必须是4^n),但其执行效率确实非常高效,看图1所示的FFT运算效率测试数据便可见一斑。该数据来自STM32 DSP库使用文档。
092014394315467.png
图1 FFT运算效率测试数据
  由图1可见,在STM32F10x系列处理器上,如果使用72M的系统主频,进行64点的FFT运算,仅仅需要0.078ms而已。如果是进行1024点的FFT运算,也才需要2.138ms。
5 n9 q$ B+ H+ e+ @
2.如何使用STM32提供的DSP库函数
2.1下载STM32的DSP库
2.2添加DSP库到自己的工程项目中
  下载得到STM32的DSP库之后,就可以将其添加到自己的工程项目中了。
  其中,inc文件夹下的stm32_dsp.h和table_fft.h两个文件是必须添加的。stm32_dsp.h是STM32的DSP库的头文件。
  src文件夹下的文件可以有选择的添加(用到那个添加那个即可)。因为我只用到了256点的FFT,所以这里我只添加了cr4_fft_256_stm32.s文件。添加完成后的项目框架如图2所示。
092016446347416.png
图2 项目框架
2.3模拟采样数据
  根据采样定理,采样频率必须是被采样信号最高频率的2倍。这里,我要采集的是音频信号,音频信号的频率范围是20Hz到20KHz,所以我使用的采用频率是44800Hz。那么在进行256点FFT时,将得到44800Hz / 256 = 175Hz的频率分辨率。
  为了验证FFT运算结果的正确性,这里我模拟了一组采样数据,并将该采样数据存放到了long类型的lBufInArray数组中,且该数组中每个元素的高16位存储采样数据的实部,低16位存储采样数据的虚部(总是为0)。
  为什么要这样做呢?是因为后面要调用STM32的DSP库函数,需要传入的参数规定了必须是这样的数据格式。
  下面是具体的实现代码:
  1. /******************************************************************# [5 Y5 J: f$ v, p7 J( C9 z
  2. 函数名称:InitBufInArray()3 b  W( v* L- }- C; q6 s" F0 }
  3. 函数功能:模拟采样数据,采样数据中包含3种频率正弦波(350Hz,8400Hz,18725Hz)5 j5 ^, I+ q( h" I# Z0 t8 d
  4. 参数说明:1 |  s9 c' P8 O6 G
  5. 备    注:在lBufInArray数组中,每个数据的高16位存储采样数据的实部,$ U4 y6 K; \5 N! \
  6.           低16位存储采样数据的虚部(总是为0)% s; i9 i* N# N% ^% _
  7. 作  者:博客园 依旧淡然(http://www.cnblogs.com/menlsh/)( d: Z+ ]+ d; e% s; N. k) h
  8. *******************************************************************/2 ^) F, h# S, `* E
  9. void InitBufInArray()- J5 E& e, w' L0 n# {
  10. {6 m: ?( ?1 B8 ~8 ~' F
  11.     unsigned short i;
    3 D; L0 A% {. A! ~: t5 n* _
  12.     float fx;
    7 k9 \+ J! e- n3 H% M
  13.     for(i=0; i<NPT; i++)
    ! z+ Y8 A' N. E! b; E$ C
  14.     {
    : i7 a7 ]. i4 a4 X; V. F5 P
  15.         fx = 1500 * sin(PI2 * i * 350.0 / Fs) +
    # t( Y/ y# Y7 Q8 w+ H
  16.              2700 * sin(PI2 * i * 8400.0 / Fs) +2 m8 G) |% t$ y8 `6 T, ^
  17.              4000 * sin(PI2 * i * 18725.0 / Fs);  \' b. C! G6 @( ~- i! P
  18.         lBufInArray[i] = ((signed short)fx) << 16;& w0 U$ u1 B. K
  19.     }& j! o8 U; e: D; e- B6 C1 P* O6 x
  20. }
复制代码
3 F3 G3 i# k1 q
  其中,NPT是采样点数256,PI2是2π(即6.28318530717959),Fs是采样频率44800。可以看到采样数据中包含了3种频率的正弦波,分别为350Hz,8400Hz和18725Hz。
& D4 c. T+ E! ]- x& G3 E
2.4调用DSP库函数进行FFT
  进行256点的FFT,只需要调用STM32 DSP库函数中的cr4_fft_256_stm32()函数即可。该函数的原型为:
  void cr4_fft_256_stm32(void *pssOUT, void *pssIN, uint16_t Nbin);
  其中,参数pssOUT表示FFT输出数组指针,参数pssIN表示要进行FFT运算的输入数组指针,参数Nbin表示了点数。至于该函数的具体实现,因为是用汇编语言编写的,我也不懂,这里就不妄谈了。
  下面是具体的调用实例:
  cr4_fft_256_stm32(lBufOutArray, lBufInArray, NPT);
  其中,参数lBufOutArray同样是一个long类型的数组,参数lBufInArray就是存放模拟采样数据的采样数组,NPT为采样点数256。
  调用该函数之后,在lBufOutArray数组中就存放了进行FFT运算之后的结果数据。该数组中每个元素的数据格式为;高16位存储虚部,低16位存储实部。

' l% {2 d% |% n1 c
2.5计算各次谐波幅值
  得到FFT运算之后的结果数据之后,就可以计算各次谐波的幅值了。
  下面是具体的实现代码:
  1. /******************************************************************
    , W) w8 h  u6 @) ?5 I4 S1 S' Y# I, ^
  2. 函数名称:GetPowerMag()8 ?% {9 `+ ]1 _2 o
  3. 函数功能:计算各次谐波幅值
    / k# _% A5 _) S* y' _# ^  g  V% _
  4. 参数说明:
    & n6 n0 V* i% }* }2 C
  5. 备  注:先将lBufOutArray分解成实部(X)和虚部(Y),然后计算幅值(sqrt(X*X+Y*Y). S+ f3 c% K* h3 @0 f  r
  6. 作  者:博客园 依旧淡然(http://www.cnblogs.com/menlsh/)% e0 _6 o2 n) t. s& P
  7. *******************************************************************/$ ]! a* ^+ o8 j7 v; J+ r
  8. void GetPowerMag()- p+ z4 P) L  X) R) z. h
  9. {
    . T6 ^1 q0 S7 p3 d/ m: _
  10.     signed short lX,lY;7 \% C3 \7 E% J) G2 J* `6 G/ S8 a" ^
  11.     float X,Y,Mag;
      z0 q. z& _# F  V, k
  12.     unsigned short i;7 R4 w" G4 N9 E
  13.     for(i=0; i<NPT/2; i++)6 J- Y/ x( K: o. _: N
  14.     {- {" T3 k3 B# u4 X$ |+ ^# g) U& C
  15.         lX  = (lBufOutArray[i] << 16) >> 16;2 k6 |) {6 U& d7 j4 z& }& o5 R
  16.         lY  = (lBufOutArray[i] >> 16);
    + j8 |9 M" K6 Q5 X$ O+ s
  17.         X = NPT * ((float)lX) / 32768;1 e; L! j9 s8 F8 U3 e  }% T
  18.         Y = NPT * ((float)lY) / 32768;/ Z0 d/ o3 A0 q! Z  ?7 o4 w4 M2 q% a
  19.         Mag = sqrt(X * X + Y * Y) / NPT;0 ]. X' }! _9 J& k7 H7 t
  20.         if(i == 0)
    / n1 w  D  O" }; a: E+ Q0 W
  21.             lBufMagArray[i] = (unsigned long)(Mag * 32768);
    & k1 q: o* v- M+ |$ E, \' y7 W
  22.         else$ Z5 j  Y: j& ^" C
  23.             lBufMagArray[i] = (unsigned long)(Mag * 65536);, x  v$ W  y6 [% z
  24.     }- s# K4 M& H) o. d7 V9 o
  25. }
复制代码
5 F6 h* @& c3 c5 s. v: z' Z" c
  其中,数组lBufMagArray存储了各次谐波的幅值。
2.6实验结果
  通过串口,我们可以将lBufMagArray数组中各次谐波的幅值(即各个频率分量的幅值)输出打印出来,具体实验数据如下所示:
  1. i,         P,       Mag,         X,         Y
    5 L( I0 l7 B' s9 X" ^6 D" }. b
  2.    0,         0,         4,         0,        -4
    7 ]: i9 C# r) ?8 V
  3.    1,       175,        14,        -6,        -4
    6 }9 j' y% S/ N
  4.    2,       350,      1492,       746,        -3. |4 @" D5 B+ J
  5.    3,       525,        11,        -5,        -3
    . e; q0 ]' ^" e2 b! s- n( d
  6.    4,       700,         8,        -3,        -31 R* J5 A$ a6 y# f" e$ a
  7.    5,       875,         8,        -4,        -2' G+ W9 C! g9 }8 N2 V. N
  8.    6,      1050,         6,        -3,         0* v, ~- d) W6 y/ A5 w' W
  9.    7,      1225,         6,        -3,         05 O& k& e/ s" n5 x+ Q2 |
  10.    8,      1400,         8,        -4,        -2
    $ |! ]" L& W8 ?! e3 t; m: G1 g
  11.    9,      1575,         8,        -4,         09 Q0 {* O% p% y; A. y
  12.   10,      1750,         4,        -2,         0
    5 d% @1 t6 \6 C4 y# A# \# z
  13.   11,      1925,         8,        -4,        -19 Y1 _/ y) x( b
  14.   12,      2100,         6,        -3,         0
    7 g/ o2 m" @" f/ \. h4 H: ~; p3 f, U
  15.   13,      2275,         5,        -2,        -2
    & V5 g& u: b8 O, C7 \
  16.   14,      2450,         6,        -3,        -1
    9 {9 b; u7 ?- k* v& O% m0 J
  17.   15,      2625,         8,        -3,        -3
    % T- N; b4 v- w4 [
  18.   16,      2800,         4,        -2,         0
    * s: `, m- m9 }6 X0 U8 I4 p
  19.   17,      2975,         6,        -3,        -1
    % b5 x& x. _, o# t# z* g
  20.   18,      3150,         6,        -3,         0" o: @2 M8 ]; O6 ^. x
  21.   19,      3325,         6,        -3,         0
    : o# O2 l, m+ [1 E- F
  22.   20,      3500,         2,        -1,         0
    9 O% ]. V# A; G5 A' P
  23.   21,      3675,         4,        -2,         0! v+ |! ?* n- v; O* [" r# B
  24.   22,      3850,         4,        -2,         0( p3 p2 e) K8 x
  25.   23,      4025,         4,        -2,         0; |0 N5 \6 [3 G6 B/ R/ Z' O: e; V: g
  26.   24,      4200,         6,        -3,         0! X$ r. w4 b& P
  27.   25,      4375,         6,        -3,         0
    - H1 K: e* A% m0 O
  28.   26,      4550,         4,        -2,         0* F4 z+ C  W  \# j0 k1 J5 Y# O
  29.   27,      4725,         6,        -3,         0
    5 E' {& A) m. J6 o
  30.   28,      4900,         2,        -1,         0) f6 G! @, u" g
  31.   29,      5075,         4,        -2,        -1; `5 Y1 \& ?- D, a
  32.   30,      5250,         4,        -2,         0
    7 `; \6 X  r; z" n
  33.   31,      5425,         2,        -1,         0( P9 ]( S7 E. A2 w) ~: e
  34.   32,      5600,         4,        -2,        -1
    ! r& s# ?* ?0 N
  35.   33,      5775,         6,        -3,        -1
    2 j- E7 q, f2 K3 V6 ?, J
  36.   34,      5950,         2,        -1,        -1
    % F2 Z" t- \3 l5 ?% q
  37.   35,      6125,         6,        -3,        -1
    * V* E: i% k2 V8 x* p5 }
  38.   36,      6300,         2,        -1,         0( ]" L6 m; s/ T, n! r8 f
  39.   37,      6475,         6,        -3,         0/ r7 w) U7 U$ }& @, W$ G# e0 y
  40.   38,      6650,         4,        -2,         0# T% E* b, b7 Z8 _! y
  41.   39,      6825,         4,        -2,        -14 |5 s" H9 T5 X
  42.   40,      7000,         2,        -1,         0' N1 D. F( b9 N4 }% u, d! J4 u4 q
  43.   41,      7175,         6,        -3,         0
    8 j3 L7 z$ H, _! q4 S
  44.   42,      7350,         2,        -1,         0
    + e( G) X  q: X
  45.   43,      7525,         2,        -1,         0
    ! v2 d: ~7 z4 A( F, D2 A8 Q
  46.   44,      7700,         2,        -1,         0
    9 E; n3 G, S' ^9 ?6 ~) c! I( X, V
  47.   45,      7875,         2,        -1,         0; x7 k5 l1 L( }
  48.   46,      8050,         4,        -2,         0
      @6 r: k3 n! Y* \
  49.   47,      8225,         2,        -1,         0
    7 y) L& a" h" u! Y' R; X  J
  50.   48,      8400,      2696,      1348,         0
    $ ~1 h" u& N& i/ q
  51.   49,      8575,         2,        -1,        -1
    ) v$ S( i% x: \0 T, {: t
  52.   50,      8750,         0,         0,         09 j7 Q6 O& k. D7 ?
  53.   51,      8925,         4,        -2,        -10 ~( i+ V- D( b( e  m/ H
  54.   52,      9100,         2,         0,        -15 g4 Y8 a; U' E3 f: f1 j
  55.   53,      9275,         0,         0,         03 _1 i3 U- G. _1 ]7 p
  56.   54,      9450,         2,        -1,        -1
    . B' d  v. _* r4 |- |# T5 R
  57.   55,      9625,         2,        -1,         0, T, k. z' X, h$ C* @
  58.   56,      9800,         2,        -1,         05 q2 i# c  z3 s8 j$ Z  d3 [
  59.   57,      9975,         2,        -1,        -1  p& H, ?6 ~- e3 |* C4 T! E
  60.   58,     10150,         2,        -1,        -1
    * Q$ C1 ^) t. ?, {5 U6 e- E
  61.   59,     10325,         2,        -1,         0
    & J6 t! Q' L) R8 m
  62.   60,     10500,         0,         0,         0" Y: q+ z6 c, C1 W5 A2 E* E: S/ N) \
  63.   61,     10675,         2,        -1,         0  ]9 n* ]2 O5 o0 `& r
  64.   62,     10850,         4,        -2,        -18 p% N1 b* Z/ d- Z
  65.   63,     11025,         2,        -1,        -1
    1 s, ]- |6 S- k; w: C
  66.   64,     11200,         0,         0,         0+ k5 |! W! z9 ?* v* R0 X$ [/ |
  67.   65,     11375,         2,        -1,         0
    % S# c# U; n) Z( F* b
  68.   66,     11550,         0,         0,         0
    & z" p  t7 y& h6 @
  69.   67,     11725,         2,        -1,        -17 m6 P* M' k1 a' S3 E" `
  70.   68,     11900,         2,        -1,        -1- U: o3 ~; i$ {1 R9 W) p9 A
  71.   69,     12075,         2,        -1,         16 c4 R8 @- h+ i$ e) m# K! j8 i  C
  72.   70,     12250,         2,        -1,         1! ^8 B3 W- F. P0 U% _
  73.   71,     12425,         4,        -2,         16 R( X6 V: k, p
  74.   72,     12600,         4,        -2,        -1% l; s4 _2 z* i! v( G  u1 C
  75.   73,     12775,         2,        -1,         12 D3 A( O5 o* u2 B  V, N6 Q
  76.   74,     12950,         0,         0,         06 s! t  ?. `8 P( D3 G# k! L
  77.   75,     13125,         4,        -2,         0: v7 ]* w- E1 S) S
  78.   76,     13300,         4,        -2,         07 Q/ ^% U1 u  u7 |( e7 o: u
  79.   77,     13475,         2,        -1,         0
    ) J7 N4 l. b8 Y5 B4 x, |$ B! d
  80.   78,     13650,         2,        -1,         0
    , J5 r% N; s$ @6 l
  81.   79,     13825,         4,        -2,        -1
    # q" {8 \; E! k
  82.   80,     14000,         2,        -1,         0
    % `: R4 w, ^$ ^1 z- \% |- _; x
  83.   81,     14175,         4,        -2,         0% m) x, U- |  }4 C1 ?; d
  84.   82,     14350,         2,        -1,         1. H3 M4 p6 m' z. }; q
  85.   83,     14525,         4,        -2,         1
    9 Z( K# T  D2 j0 W3 e* V% d6 Y
  86.   84,     14700,         4,        -2,         19 ^) c5 T# B$ n- J+ s5 N9 c" Y  g
  87.   85,     14875,         2,        -1,         1
    6 C* }+ o% d. j9 s: R1 a0 e8 i
  88.   86,     15050,         4,        -2,         0
    8 l# \0 s' W  D" ]: I" J
  89.   87,     15225,         2,        -1,         0
    , I9 H6 t2 [+ J: W
  90.   88,     15400,         4,        -2,         1
    9 B% R2 [- ?$ m& @
  91.   89,     15575,         4,        -2,         11 D" s) s4 y. P1 y3 B
  92.   90,     15750,         2,        -1,         0- z) m5 h: T# S0 j$ @
  93.   91,     15925,         2,        -1,         1
    2 m4 e3 \4 \! {. k, c
  94.   92,     16100,         2,        -1,         1
    / H. ?$ K- @; j/ S7 z" i. O
  95.   93,     16275,         2,        -1,         14 u# f$ q* J0 u
  96.   94,     16450,         4,        -2,         1
    8 w3 f4 }  @) A, y
  97.   95,     16625,         2,        -1,         1
    8 J) B( u+ `! k! d
  98.   96,     16800,         2,        -1,        -14 U. V6 M2 _- O, z" M7 ]1 P! z3 `
  99.   97,     16975,         4,        -2,         0- h" p! x3 q# w6 E  g/ H
  100.   98,     17150,         2,        -1,         0
    * S+ T% q+ y3 I" V4 _+ V% o% s
  101.   99,     17325,         4,        -2,         08 v$ F9 X- y* W$ ~' f- b
  102. 100,     17500,         4,        -2,         1
    ' S9 \; a+ o# T; i; l' b
  103. 101,     17675,         4,        -2,         0; U6 A$ t3 @8 @3 f7 e7 H+ e
  104. 102,     17850,         4,        -2,         1- q* J& ?9 Q. L; ]8 p7 ~
  105. 103,     18025,         4,        -2,        -1; |6 M5 j1 ~' ~$ C" }' ?
  106. 104,     18200,         2,        -1,         10 |% W# G3 U) `8 u
  107. 105,     18375,         4,        -2,         0, J$ M. D4 E2 ?3 O6 {( b9 i
  108. 106,     18550,         2,        -1,         12 _0 z( a3 Q; W: f3 P6 \
  109. 107,     18725,      3996,      1998,         1# ^& ]% p8 q7 h- {( W" l
  110. 108,     18900,         2,        -1,         0  F" R/ s3 p8 {4 N( L4 a* }, O
  111. 109,     19075,         2,        -1,         1$ C# d7 V' f) @( h* K# I+ M
  112. 110,     19250,         4,        -2,         1
    / l3 j# t/ O" C2 @+ `& B" g( P. z* I/ C: h
  113. 111,     19425,         4,        -2,         1
    / Y* q) J. w$ o. g6 [& T: H. W
  114. 112,     19600,         2,         0,         15 o( s2 _0 o( s
  115. 113,     19775,         2,        -1,         0
    9 D5 y" o( G+ s! t; d2 `
  116. 114,     19950,         0,         0,         0
    % K: g/ g3 h; R5 V% n) i" H! W" q
  117. 115,     20125,         4,        -2,         1
    " c& e$ Z. C  |4 F5 w
  118. 116,     20300,         2,         0,         1' w) {+ W% a- J' |/ p- W
  119. 117,     20475,         2,         0,         1
    . v8 `9 o4 U7 ~6 g/ `
  120. 118,     20650,         2,        -1,         1
    ; I6 B. L2 ]- W
  121. 119,     20825,         2,        -1,         1
    6 l- x3 C. D, a0 z- F( Y, A2 R
  122. 120,     21000,         2,        -1,         1
    9 C$ }6 I+ h. t3 v- X, W/ S) K
  123. 121,     21175,         2,        -1,         0
    6 q# p& k9 G% b4 k4 [* i+ @
  124. 122,     21350,         2,         0,         1" A# G: d% m; F+ w% p
  125. 123,     21525,         2,        -1,         0
    & M/ i. b& D, {  {
  126. 124,     21700,         0,         0,         0
    ; o  ?( E- \5 O* W* [
  127. 125,     21875,         2,        -1,         1
    $ l: E' P* f& W( Y
  128. 126,     22050,         2,        -1,         1  S! \& y8 h$ x# M6 ^8 m9 ]
  129. 127,     22225,         2,         0,         1
复制代码

& _7 Y1 T1 j: W' G. Z7 ?! \) S
  在以上的实验数据中,我们分别打印出来了点数、频率、幅值、实部、虚部信息。
  由以上的实验数据,我们可以看出,在频率为350Hz,8400Hz和18725Hz时,幅值出现峰值,分别为1492、2696和3996,这与我们所预期的结果正好相符,从而验证了实验结果的正确性。
; _3 O% v* ^/ t: k% C5 y8 K! r1 ^+ [
赞 收藏 评论0 发布时间:2022-1-15 23:08

举报

0个回答

所属标签

相似技术帖

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版