本篇内容将简要分析STM32自带的DSP库文件,其用汇编语言编写,代码执行效率明显优于C语言,ST公司封装好了了库文件,我们不必看懂其汇编代码,只要会调用接口函数即可。 1,代码分析 首先我们需要在一个已经建立好的工程文件里添加如下编译路径: 工程需要添加的文件如下图: 
+ a) N$ [, w4 l- [( K 为了产生fft变换信号,我们可以自己产生个采样信号:使用三角函数生成采样点,供FFT计算,fx = 4000 * sin(PI2*i*50.0/Fs) + 4000 * sin(PI2*i*2500.0/Fs) + 4000*sin(PI2*i*2550.0/Fs)。
/ h) y( { `3 g 模拟采样数据,采样数据中包含3种频率正弦波:50Hz,2500Hz,2550Hz, lBUFIN数组中,每个单元数据高字(高16位)中存储采样数据的实部,低字(低16位)存储采样数据的虚部(总是为0)。
- i0 X1 O: ]7 y8 t* L+ P& R- H 其中dsp_asm_init()函数的作用是产生采样信号,实际工程应用中我们使用的是ADC采样的处理值。dsp_asm_test()函数的作用是进行FFT变换,并计算各次谐波幅值。具体代码参见下面:
) }1 W. K2 N- C" b- 1 /*
$ E6 S( K# d j* H0 _: { - 2 *********************************************************************************************************
F7 J% ^) a' U9 A2 U$ B8 K- ?5 E - 3 * MICIRUM BOARD SUPPORT PACKAGE
, ?* \: F0 O+ Z8 ^, p6 E - 4 *& Z. k! @' [: }; n( F
- 5 * (c) Copyright 2007; Micrium, Inc.; Weston, FL7 u1 i2 O% n2 T! n$ Q4 ]: U
- 6 ** y- U6 Y0 w" ?$ T& f0 o, B3 _
- 7 * All rights reserved. Protected by international copyright laws.
1 H. [8 v2 {7 d9 f" W+ d - 8 * Knowledge of the source code may NOT be used to develop a similar product.6 M; A6 I7 k# L! T
- 9 * Please help us continue to provide the Embedded community with the finest
: _5 n7 ?& I6 O# e - 10 * software available. Your honesty is greatly appreciated., a% e! l% ~. s# U7 }5 F8 Z/ ]
- 11 *********************************************************************************************************- P: G" G3 P7 `
- 12 */
- `' E: z# m! c) L - 13 : U# o+ y. g. y. n& C
- 14 /*
+ p: }' y w, U& ` - 15 *********************************************************************************************************
6 H) U8 v. B% G1 E - 16 *8 ^ O; M+ Y8 F; R% D$ c3 g% y
- 17 * BOARD SUPPORT PACKAGE
4 |9 q/ }! P0 {% b& U/ q1 W - 18 *
( d% q: ^- ? {4 G+ j9 }; M$ v - 19 * ST Microelectronics STM32) s! a2 ]7 A. V
- 20 * with the
. K6 U! ^0 [' L5 N d. s" P - 21 * STM3210B-EVAL Evaluation Board
7 l9 I+ P) z2 w) o) X# p* O! u - 22 *5 J' q; }) g9 Q/ D8 m$ v' P3 B
- 23 * Filename : bsp.c
+ X: Q; T4 w3 U4 O; ?" k - 24 * Version : V1.00
2 S+ ]+ s: _& _1 x/ f1 `5 R% Q- g( @ - 25 * Programmer(s) : Brian Nagel
6 M$ q0 a9 ]( V; J0 G - 26 *********************************************************************************************************. [" `# A, v2 b e5 [* C8 X$ s
- 27 */
7 l8 S% f, L+ ~3 t6 Q! c8 p - 28 ; C$ g ^3 c8 ~1 w0 E }
- 29 /*. O% P3 B F/ v ?
- 30 *********************************************************************************************************
& e; C# u+ _# c/ e- e - 31 * INCLUDE FILES: t2 [8 L3 G# b5 y
- 32 *********************************************************************************************************7 v0 j+ j# R8 `$ ?0 B
- 33 */' b5 V1 p, R. S$ _( \
- 34
9 m. K# f2 U4 @5 ] - 35 #define DSP_ASM# ^3 _& W2 D0 l- S5 u+ y& [ b! L
- 36 #include "stm32f10x.h": o9 l8 p' x5 g3 q: y5 A2 g' W9 B3 d
- 37 #include "dsp_asm.h"( Q$ q% o6 e: B2 y; ?' ]0 D
- 38 #include "stm32_dsp.h"
9 w0 } \2 b/ R9 _' Q0 Z/ @ - 39 #include "table_fft.h"
. t; j% S0 B" D* d1 l - 40 #include <stdio.h>
" P: A% u; P: u$ B: F4 v3 ` - 41 #include <math.h>
& b, L. I/ l9 u - 42
/ Z' ^5 j* |0 G6 o6 t* \ - 43 N1 v" r9 e) ?/ P h2 M
- 44 /*! D6 J- ~1 O( @+ q9 a" J
- 45 *********************************************************************************************************- Q& Q3 i m& l; ?1 L; U* R8 q
- 46 * LOCAL CONSTANTS5 ]6 L# w4 K/ C' H# w' ?
- 47 *********************************************************************************************************
* \6 Z5 U) F! v& I6 A - 48 */
- C; L6 t$ g& Z! ^8 X2 ~ - 49 #define PI2 6.283185307179595 n: W" x- T A ~5 _. m2 ^: E3 ]% p6 a$ S
- 50 #define NPT_1024 10246 J8 b; B" {: r- \- j
- 51 //#define NPT_256 256' V. B, l3 g+ [! ]. {8 d y
- 52 //#define NPT_1024 1024! Z1 o; K# b/ H/ j( g8 `3 H
- 53
1 [ ? D3 A# _2 B5 d - 54 // N=64,Fs/N=50Hz,Max(Valid)=1600Hz
( V& l- }7 q, `/ p% ]2 N: p - 55 #ifdef NPT_64
* i8 M. |# b7 M* K; @ - 56 #define NPT 641 l3 B' t) q; z$ x* b
- 57 #define Fs 3200
- t+ t) T% U1 n2 m - 58 #endif
+ L3 `2 R' q6 }1 e: w - 59 0 x# U% ?2 l3 |* B) \# q
- 60 // N=256,Fs/N=25Hz,Max(Valid)=3200Hz
) Y) a* n# g! R/ _* }( A/ B - 61 #ifdef NPT_256$ a: ~. B, }+ Y. d) }1 s. ^) k1 n
- 62 #define NPT 256
/ g1 L2 n; C2 M g. n3 M# R - 63 #define Fs 6400
/ C) ?9 P1 S( Q7 | - 64 #endif$ f( g$ I0 I, I$ `
- 65
+ Z4 F8 T5 @' P" M$ r8 K2 d - 66 // N=1024,Fs/N=5Hz,Max(Valid)=2560Hz
' d. S* R3 w: i6 F5 K - 67 #ifdef NPT_1024
. Z) N1 J( M, m# p - 68 #define NPT 1024; j. |+ m+ |- ~8 t
- 69 #define Fs 5120
2 c5 T8 ?# z2 C& k+ `% a# r- ?) B" W - 70 #endif5 e% r' Z1 |) a6 ?" @, \
- 71
; P+ I B4 `% {4 V" U7 R - 72 ! g) X; K& b: {3 G
- 73 /*0 W3 K, X: T* L4 m4 p' M4 N
- 74 *********************************************************************************************************; i9 [7 l5 C4 p
- 75 * LOCAL DATA TYPES% @9 Y! H0 u) x- i% k6 {
- 76 *********************************************************************************************************0 c; {9 }: Q4 R, g
- 77 */3 I6 Z% n5 u" w
- 78
$ o) ?, p" |3 K9 i2 K) g, k - 79 " {; _+ i. q# o$ f
- 80 /*
1 |1 e* ~- W: ? - 81 *********************************************************************************************************
" t6 }6 K, T* L0 }% S - 82 * LOCAL TABLES$ _/ k) @( _+ w
- 83 *********************************************************************************************************% E& a" ^# @7 j: _0 g* E
- 84 */. ^& d, C3 T& H+ h* T
- 85 6 p* g @5 z i0 {
- 86 ; T s6 `' g/ K* r; Z2 U, M0 y2 T
- 87 /*) `. J& l' {. g% s. a1 G
- 88 *********************************************************************************************************7 `+ A6 h0 {& `* T) ^
- 89 * LOCAL GLOBAL VARIABLES
# ?% o7 Z% t4 F! ] W; [- x) H - 90 *********************************************************************************************************
' g0 L2 A% V8 X' E& Y' S: L& k! N" } - 91 */7 e7 s" f) t y3 Q1 K
- 92 long lBUFIN[NPT]; /* Complex input vector */
1 j6 [! b) C4 k' `8 e - 93 long lBUFOUT[NPT]; /* Complex output vector */0 H1 Z# u3 `9 D5 n1 {9 v
- 94 long lBUFMAG[NPT];/* Magnitude vector */. F! T4 V; w/ {0 M3 y% I6 Y
- 95 /*
+ D l& z+ h4 a5 T& F+ W - 96 ********************************************************************************************************* j7 A) D7 J" t& Z4 r+ `/ z$ v
- 97 * LOCAL FUNCTION PROTOTYPES/ e+ |5 T+ M2 ?
- 98 *********************************************************************************************************
# o' s% T5 g, Y8 t: ^2 j& a: P - 99 */
* u0 E4 ~: j* s7 M. Q5 S, ~( m: d - 100 void dsp_asm_powerMag(void);
7 ?# }. l4 ?, G5 I+ w - 101
0 h& u2 U2 @; N2 j) k+ C/ B - 102 /*. d5 d+ a1 L6 x9 U
- 103 *********************************************************************************************************9 ]6 `, ?% H4 r* \% t- B
- 104 * LOCAL CONFIGURATION ERRORS+ L( d+ j5 g3 P) n/ v
- 105 *********************************************************************************************************1 C" ?5 q9 \/ k; o& y3 n3 H2 H- I K' t
- 106 */9 X- e# u; U% z" M
- 107
. i/ S$ x& ^4 z% U: Q - 108
* |, f: `4 h* K1 ?8 ? - 109 /*
+ p* d& _" r1 V - 110 ******************************************************************************************************************************
9 }2 h1 G4 ]" j3 I9 x9 B( }6 Y - 111 ******************************************************************************************************************************
% d3 T& s9 t$ T1 J1 m6 ^& h - 112 ** Global Functions* }( p: u/ b) Z Z0 c
- 113 ******************************************************************************************************************************
% v6 s+ q* Y3 y1 o - 114 ******************************************************************************************************************************1 s( A; A+ u' R$ o4 S6 v
- 115 */6 S, a$ N: R2 P; D9 T
- 116
: i A+ D; t7 {9 T+ A( v% E - 117 void dsp_asm_init()
( W5 Q1 b+ i/ H0 ] - 118 {
( R& i* { Q; {0 r9 j6 D - 119 u16 i=0;) D9 A# X' Y t5 \
- 120 float fx;
: Q, Y6 U6 d( }9 d4 _& x* y6 A - 121 for(i=0;i<NPT;i++)
8 F: w1 ~, ?1 {% C$ i! f q - 122 {
6 s3 e; l, m3 A - 123 fx = 4000 * sin(PI2*i*50.0/Fs) + 4000 * sin(PI2*i*2500.0/Fs) + 4000*sin(PI2*i*2550.0/Fs);% r( @% ^) z* c7 I* V
- 124 lBUFIN[i] = ((long)fx)<<16;. n! O i `2 g' Y; J- ~4 C
- 125 }
( }7 w; h* j( u! P _ - 126 }! `. [9 H/ e% ^# r8 G
- 127 ( a5 K8 g; A6 c/ s
- 128 void dsp_asm_test() ; y8 l% K0 y3 ^
- 129 {3 H+ ~4 D" P) ~
- 130 # j+ [0 r1 t- z; ]% h# x
- 131 #ifdef NPT_64; R( M. q* q2 P9 r% P' S
- 132 cr4_fft_64_stm32(lBUFOUT, lBUFIN, NPT);6 ?* {) b+ n& G5 b! Z, n
- 133 #endif, W( C5 \* e1 a
- 134 9 h) W6 j8 `! i( w3 R8 a6 `
- 135 #ifdef NPT_2562 b1 z9 k& b" K0 d% o6 j, ?3 y
- 136 cr4_fft_256_stm32(lBUFOUT, lBUFIN, NPT); G" [$ M) D0 [7 i" v
- 137 #endif
8 k) y9 L5 H- `% i - 138 , [6 q1 }7 S, e! x1 ?5 {5 I
- 139 #ifdef NPT_1024
& r: A2 H) ]$ _( C3 g6 B - 140 cr4_fft_1024_stm32(lBUFOUT, lBUFIN, NPT);
- r! @7 `+ [3 e! f; b - 141 #endif
$ F% F" i1 w. g/ f, K, }: s5 j1 l0 Z - 142
" z3 P/ D) Q" _# k - 143 // 计算幅值/ Y! l) U& a- T" n) M
- 144 dsp_asm_powerMag();- y3 d* n; _* Y3 U
- 145
: Z5 P% O( p( I$ q - 146 }4 {" j. D0 P, m6 h6 e
- 147 4 R6 J1 a6 s( M ]' S. l- d; j" ?# e
- 148 void dsp_asm_powerMag(void)
3 {3 ]& g. ?; |- ?) J- r5 | - 149 {- q3 f' V1 Q+ b
- 150 s16 lX,lY;" t, r4 E: }" L. K( p$ X ?
- 151 u32 i;8 x( D7 w A( t4 I, L |
- 152 for(i=0;i<NPT/2;i++): l% F' N& z+ X' }
- 153 {9 Y% d" N) ~2 j0 e! d( A/ C
- 154 lX = (lBUFOUT[i] << 16) >> 16;" } K) n9 Q$ d
- 155 lY = (lBUFOUT[i] >> 16);4 S% p4 i, Z, y: d
- 156 {: h) I- X5 V* A2 G; w
- 157 float X = NPT * ((float)lX) /32768;
' e; o4 o: z9 E/ q) _ - 158 float Y = NPT * ((float)lY) /32768;+ i/ k( R" V9 u8 j# d) n8 e
- 159 float Mag = sqrt(X*X + Y*Y)/NPT;
0 f9 A) D% Z0 ]; A* e/ A - 160 lBUFMAG[i] = (u32)(Mag * 65536);4 E6 z$ ?- m* P6 F5 R4 }
- 161 }
$ v U+ ~0 e) F) i- M4 x! O - 162 }8 I9 e" }* v7 b+ f
- 163 }
复制代码- 1 /** Y' Q' _3 `2 _( F2 C g% w
- 2 *********************************************************************************************************
5 V1 E( d7 {! T5 u' \4 I - 3 * MICIRUM BOARD SUPPORT PACKAGE7 ?' M' @' O7 f- Q% T1 \1 ?, x
- 4 *
- P7 k2 R1 W. H+ j- O" i - 5 * (c) Copyright 2007; Micrium, Inc.; Weston, FL K7 k* M8 u7 q8 u' F! V A1 h! G
- 6 *) O4 s1 }5 Q0 h; Z" a- E
- 7 * All rights reserved. Protected by international copyright laws.
3 c* s& Y$ M% t8 x+ Z - 8 * Knowledge of the source code may NOT be used to develop a similar product.) u2 n* I& n \4 q; P
- 9 * Please help us continue to provide the Embedded community with the finest
/ I$ O) {, e# H9 n3 n# L5 X - 10 * software available. Your honesty is greatly appreciated.! u& m0 ], Q& M9 v! L" ^
- 11 *********************************************************************************************************
& T' @9 m' h% W% t$ S6 f y% W1 P- a - 12 */4 P! t6 o1 Z, c
- 13
. T& n5 r _* s6 d4 ?5 e$ X - 14 /*) J( q! n8 `% F
- 15 *********************************************************************************************************
$ Q; [6 `& }# _ - 16 *! @9 W0 t2 N8 k. ?
- 17 * BOARD SUPPORT PACKAGE( {# Z- I* f3 ~+ l, I( k% z
- 18 *
g1 p9 ?. S+ O- E. h; @( o0 z - 19 * ST Microelectronics STM320 |! {- H, E( m8 K, [4 p
- 20 * with the
( k/ C( F# v$ E* C- g) }9 ^ - 21 * STM3210B-EVAL Evaluation Board
% H3 Y9 h% o8 ?. e - 22 *8 P8 e6 h5 `6 X, v
- 23 * Filename : bsp.h0 X' F4 s" y7 q9 w
- 24 * Version : V1.00
0 v9 M) w7 e- Z2 O2 r! M - 25 * Programmer(s) : Brian Nagel9 k4 z3 D7 ]; Z" t) D+ ?6 s
- 26 *********************************************************************************************************
& k B* K# Y. y# ^# `, H# g9 |. |& Q( ^ - 27 */
& \7 g }9 ~/ I# U, t, G6 z# I - 28 * H' d" ]3 U4 U' F& N
- 29 #ifndef __DSP_ASM_H__
. c r% k6 u* Z+ ~ - 30 #define __DSP_ASM_H__, C& Z5 K9 d; |9 L; q# \! D9 k) {
- 31
8 ` [8 \# M D( s1 E; Q1 G - 32 /*" k, V9 ~: ?6 X8 a* g) J# K
- 33 *********************************************************************************************************
6 S% h+ q& ^4 N2 ]$ N# I u - 34 * EXTERNS7 n i( h4 P* C5 F1 i& }, r$ r
- 35 *********************************************************************************************************
. l4 J2 K7 m& o0 T# d2 y4 n - 36 */ e6 a$ |( t4 J: d
- 37 * w+ w$ Y# |# O" G- z3 G
- 38 #ifdef DSP_ASM
6 B) B R/ O& A. h6 a - 39 #define DSP_EXT0 R6 [. \1 `9 {* `4 q2 X" Z$ e
- 40 #else
% q% H8 ]+ y0 i* I) D0 e - 41 #define DSP_EXT extern4 d$ i, I; q: P2 [& |) S
- 42 #endif+ E5 {6 a$ H/ l
- 43
6 b0 d% U. [& }, A* q- C! w0 T; W9 T - 44 /*( W8 y, l- U5 f2 Q; _0 u5 T% i
- 45 *********************************************************************************************************
! p7 h" b' N6 o - 46 * INCLUDE FILES2 E' h' g) W6 j& ^1 n
- 47 ********************************************************************************************************** d! C5 C3 V5 s- a
- 48 */
! o. l* L( v2 p) p# C - 49
& Y N2 Z0 E: Q* O8 Z5 G - 50
. d6 a: r# o3 O5 v" F& z - 51 ) o, U6 n o: x, W
- 52 6 R, x. k6 L' `/ F3 _. a
- 53 /*3 Z6 U: u: T4 C0 C. f3 e. w
- 54 *********************************************************************************************************
3 }& [ T: f0 ?$ u9 f9 H* C - 55 * GLOBAL VARIABLES+ r& g/ s' Z+ F& {1 r. B# z
- 56 *********************************************************************************************************0 {8 @' d4 Y8 b6 `3 z) D% J
- 57 */7 T) K, ?/ S. L8 h
- 58 9 _" r7 q: J, j
- 59
; d. V: D* M- D3 Z- Y+ `1 `4 B - 60 /*
' g/ ]: e! r. K o7 T( v% N2 n; g. W - 61 *********************************************************************************************************6 O2 b- O# [+ R
- 62 * MACRO'S
z+ y9 V" p; m% ^ - 63 *********************************************************************************************************0 U% i( M& f! m* P! v
- 64 */
* q3 h: P* p$ I9 } - 65 8 q; S+ B/ i. J: t% p
- 66 1 a7 W) o5 l7 ]
- 67 /*8 |/ l" w% \! D
- 68 *********************************************************************************************************2 E+ O' b0 D4 H6 d
- 69 * FUNCTION PROTOTYPES, k6 g' t( k8 O4 P
- 70 *********************************************************************************************************
$ g3 ^! e4 `, |6 x1 j - 71 */
# J! H1 O* ?+ }4 b - 72 ; j9 h+ b- L! U9 @7 g
- 73 void dsp_asm_test(void);. P/ l! o. p- l3 |# A7 }. g; D
- 74 void dsp_asm_init(void);
5 q2 u4 f; K/ }1 B6 \1 q - 75
( g3 s. b% V) D - 76 #endif /* End of module include. */
复制代码
9 b, @8 h- b" v5 W3 ?: ]& ] 着重分析下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位数据。下面的两句' e% s8 ?% F1 R
float X = NPT * ((float)lX) /32768; # a5 ]3 _' T% f8 h7 \* Z
float Y = NPT * ((float)lY) /32768
* l# C9 ~" W2 k3 C5 w 目的就是把数据浮点化,至于为什么是除以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次方。然后才能进行其他的运算。4 w4 c5 ~: V5 O0 a4 h* j
这里是ST公司采用了DSP专用芯片(主要是指TI)的写法,也就是说尽管DSP的芯片类型很多,数据变量的定义也各有差异,但原理是一样的,最终还是要采用DSP习惯的运算方式。至于为什么一定要采用浮点运算,因为机器是傻子,然而TI公司的工程师是天才。 main函数中我们只需在while(1)前加上dsp_asm_init(); dsp_asm_test();即可。
. h- t+ K5 T/ s- }: I# n; B/ @/ U& R2,实验现象 注意FFT运算结果的对称性,也即256点的运算结果,只有前面128点的数据是有效可用的。 ① N=64,Fs/N=50Hz,Max(Valid)=1600Hz,64点FFt,采样率3200Hz,频率分辨率50Hz,测量最大有效频率1600Hz 64点FFT运算结果图(局部): 上图中,数组下标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& Y2 z4 v# J' _/ Z1 @
256点FFT运算结果图(局部): 上图中,数组下标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运算结果图(局部): 上图中,数组下标X对应的谐波频率为:N×Fs/1024=N×5120/1024=N*5Hz. lBUFMAG[10] 对应 10×5 =50Hz谐波幅值 lBUFMAG[500] 对应 500×5=2500Hz谐波幅值 lBUFMAG[510] 对应 510×5=2550Hz谐波幅值 $ Q/ b" p0 A8 C
总结:该工程中模拟信号源为: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。 1 e; K, b, H8 i9 z% ]
|