|
本篇内容将简要分析STM32自带的DSP库文件,其用汇编语言编写,代码执行效率明显优于C语言,ST公司封装好了了库文件,我们不必看懂其汇编代码,只要会调用接口函数即可。 1,代码分析 首先我们需要在一个已经建立好的工程文件里添加如下编译路径: 工程需要添加的文件如下图: 
3 O/ s0 C" k6 [8 b' O' h 为了产生fft变换信号,我们可以自己产生个采样信号:使用三角函数生成采样点,供FFT计算,fx = 4000 * sin(PI2*i*50.0/Fs) + 4000 * sin(PI2*i*2500.0/Fs) + 4000*sin(PI2*i*2550.0/Fs)。! F3 ~7 U2 r& ]# w
模拟采样数据,采样数据中包含3种频率正弦波:50Hz,2500Hz,2550Hz, lBUFIN数组中,每个单元数据高字(高16位)中存储采样数据的实部,低字(低16位)存储采样数据的虚部(总是为0)。
! q N3 k. c' c* J4 S- a! O 其中dsp_asm_init()函数的作用是产生采样信号,实际工程应用中我们使用的是ADC采样的处理值。dsp_asm_test()函数的作用是进行FFT变换,并计算各次谐波幅值。具体代码参见下面:
, b: \% G( H/ w) p; V* C% e- 1 /*1 p! s0 x5 H( P7 q' i& M4 F
- 2 *********************************************************************************************************. c0 [& q2 p' |' t( n _
- 3 * MICIRUM BOARD SUPPORT PACKAGE6 ]' j8 ]3 L$ o! V3 X5 ?5 h
- 4 *
, K4 i. Y" f! O, j8 j* B - 5 * (c) Copyright 2007; Micrium, Inc.; Weston, FL5 A+ h8 |- f2 P* m
- 6 *
4 \! F' N) q: l4 V8 E - 7 * All rights reserved. Protected by international copyright laws.1 A% Y( u) m0 p
- 8 * Knowledge of the source code may NOT be used to develop a similar product.
) x% ^) D$ Z4 n# o2 _: G! C - 9 * Please help us continue to provide the Embedded community with the finest' s6 c- R! Q- o7 R
- 10 * software available. Your honesty is greatly appreciated./ G% n9 Q7 g" _
- 11 *********************************************************************************************************5 {4 n2 ^6 b$ b+ O1 y
- 12 */
( ~* z1 p' Q% T0 i- Q) j - 13
) ^ O/ \- \* k- w8 b - 14 /*
5 x# Q- w) B% A" A7 Y. u4 n - 15 *********************************************************************************************************
3 _ }6 Y/ |( X% E: ]3 v - 16 *
; Z4 l5 ]8 w3 s+ U; W" s) l1 ~6 f - 17 * BOARD SUPPORT PACKAGE0 M! K* }2 w( C6 N
- 18 *
- d/ |0 Z/ U9 @2 \/ ~5 p) H" X - 19 * ST Microelectronics STM327 I3 ?+ f8 h* D8 [0 p+ U9 A
- 20 * with the
6 v8 b/ }8 e- K5 N* d3 y, h+ @) l - 21 * STM3210B-EVAL Evaluation Board
* K( A ~3 ~3 Z0 B, G$ _ - 22 *3 {7 M7 C7 z% E+ m- x- N% w
- 23 * Filename : bsp.c
l# v: b! `( C - 24 * Version : V1.00
( e+ A8 A% \& C, ]" W - 25 * Programmer(s) : Brian Nagel. ?6 D" L, T! {6 b& o$ p- C
- 26 *********************************************************************************************************; V$ G8 o3 r$ i& N' Y
- 27 *// m" ~2 v8 z& N! t9 F* F
- 28 ; V, ?9 s6 ^+ N- L- l+ ^
- 29 /*
3 Q9 |: j$ Z0 m1 }- b/ B/ B - 30 *********************************************************************************************************3 J9 C( e$ H5 Q6 ?5 z1 |0 U4 i
- 31 * INCLUDE FILES
' u8 s R9 L2 j) k+ `; W! c9 o' G - 32 *********************************************************************************************************
0 o2 j8 g/ ?: G5 @- | - 33 */
! C6 X, l* t$ b - 34
5 |. w2 w/ V& x5 s6 A+ f - 35 #define DSP_ASM. q1 }, U/ v/ z% @) p
- 36 #include "stm32f10x.h"9 K! l1 e) o# R' [, K
- 37 #include "dsp_asm.h"
" Y9 {0 p3 [& f1 V6 i5 x( i - 38 #include "stm32_dsp.h" T6 U& e% Z& [) Z; C
- 39 #include "table_fft.h"! m# ~/ G8 g: o% j/ R) X
- 40 #include <stdio.h>( ?- ~6 l; P: g
- 41 #include <math.h>
$ S6 r8 P8 X M. T. F+ ? - 42
# h( {# j) F- K/ y2 S# K6 J. t - 43
, b1 a/ M* c) l$ h! ` - 44 /*
* G: _6 s% i, I/ a6 m4 B - 45 *********************************************************************************************************; A6 ]. _6 \" S& p
- 46 * LOCAL CONSTANTS
/ l6 A4 |0 N0 U- G - 47 *********************************************************************************************************
( B" a/ B- e! y* u( b+ ~ - 48 */8 O e6 [. u6 b' w2 N; z1 x1 K
- 49 #define PI2 6.28318530717959, j- E, [6 V: V6 k/ J8 U
- 50 #define NPT_1024 10246 x a2 G: H+ N% z6 b6 @
- 51 //#define NPT_256 256
# a+ c" O) `5 ` - 52 //#define NPT_1024 10246 P- U$ S/ B- y4 _9 v% U( t
- 53
7 A, Z; F/ `% ^$ @ - 54 // N=64,Fs/N=50Hz,Max(Valid)=1600Hz
- K' J- V7 i6 g* T! e% X. @" e - 55 #ifdef NPT_64
; \& p+ I/ _5 Y' z6 c - 56 #define NPT 64
8 w. _7 `( p* ]5 k - 57 #define Fs 32000 b0 b* U6 ~6 b4 P# c1 e
- 58 #endif" y& k6 R. X: e+ A( b) {
- 59
L5 R. ]- g2 P. l - 60 // N=256,Fs/N=25Hz,Max(Valid)=3200Hz& t3 \% ~) w3 z2 Q6 n, D4 E' S8 I
- 61 #ifdef NPT_2568 j q; `5 a; i& v" N2 _" G
- 62 #define NPT 2563 |" ?! [* L: d0 y* d* Y
- 63 #define Fs 6400 @; b8 R. }* o/ }& K4 U' d
- 64 #endif
! x; ^5 H# {% r9 ^ - 65 ) S2 [4 p+ [% a% ?2 j1 c
- 66 // N=1024,Fs/N=5Hz,Max(Valid)=2560Hz
8 h. x* i, F# k/ @2 f8 ?3 Z - 67 #ifdef NPT_1024
$ ?1 L! X1 Q2 z5 C: l - 68 #define NPT 1024, ?9 K. d- w# F- j' T
- 69 #define Fs 5120# x! y6 ~$ _: B0 u+ s7 V, q0 ~
- 70 #endif& ^8 L+ F S& [& N5 c9 Q2 c$ H
- 71 # j/ \( }. Z7 r" O2 o0 R, X; c
- 72
0 U5 {+ I9 z/ @. _: M# A9 A - 73 /*5 `# U4 ]- U# e4 n
- 74 ********************************************************************************************************* I: n& _" o+ E$ H+ ~
- 75 * LOCAL DATA TYPES4 J) l7 J. t. h. D, e
- 76 *********************************************************************************************************# B% N; G; {( @5 G. Z% `
- 77 */, `! U! z- J0 P
- 78
( k& a% @9 {6 @" P. t! | - 79
# q- ?, G7 W( D - 80 /*
2 ?6 d* C+ l6 c- D+ E5 B - 81 *********************************************************************************************************8 ]9 Q9 g" Q( _! {8 p; g; Z
- 82 * LOCAL TABLES
) Q( w. V0 D, |2 f' T* z! ] - 83 *********************************************************************************************************+ G% Z3 ~! ]7 I4 }( F
- 84 */
9 l- `2 E+ q# a - 85 8 }; j& _3 a. j/ ~0 ?
- 86 6 G- I9 ~9 I) z/ o p6 k
- 87 /*
2 H0 X1 M7 y/ v& Y) p - 88 *********************************************************************************************************
- s& _' X* f0 w, ^- e, y6 B0 A - 89 * LOCAL GLOBAL VARIABLES( ^- x, g% e( T" P$ o; }8 N
- 90 *********************************************************************************************************& M: l6 u* I' K2 {
- 91 */
2 I, t2 n/ m0 ~( f - 92 long lBUFIN[NPT]; /* Complex input vector */; }* e, _: |% T0 t4 ]2 X
- 93 long lBUFOUT[NPT]; /* Complex output vector */
( V, S# V( j' h. w$ C l - 94 long lBUFMAG[NPT];/* Magnitude vector */* }% E; u4 o. _/ g$ Y4 n4 W2 y
- 95 /*8 a) X' T! D, F9 I+ L
- 96 *********************************************************************************************************
2 p0 j/ ?5 c Q# c1 b - 97 * LOCAL FUNCTION PROTOTYPES
" d. Y: ?0 A, N8 W! | - 98 *********************************************************************************************************
4 T# n$ k& Z; o9 H- m, n: @; v - 99 */
4 S2 I( h; a5 @" y+ g# u - 100 void dsp_asm_powerMag(void);4 ^+ U$ ]( n, Y( ~8 n
- 101 3 L( o1 Y/ {6 ~
- 102 /*: T7 l: I% j7 }3 s# B
- 103 *********************************************************************************************************
- ^: d$ e E+ d - 104 * LOCAL CONFIGURATION ERRORS
) Q4 u: F' L( }* ~7 j7 p: | - 105 *********************************************************************************************************
8 n+ N9 U! E0 [0 m2 V! m' q - 106 */
# c# a7 d' Z2 }; N - 107 7 o9 I: I# V& s8 c7 A* c
- 108 : b* I& U* b5 r% H/ P
- 109 /*
}/ V4 E) M- K6 U( |6 \, U3 y - 110 ******************************************************************************************************************************& u! o/ q+ @) t4 U, v
- 111 ******************************************************************************************************************************
+ o! M# Z2 ?( h - 112 ** Global Functions/ \6 X' m1 s; Z0 g! i# i) m0 i- p
- 113 ******************************************************************************************************************************! {3 l' i# T; X; A% p( {8 E+ r( ~
- 114 ******************************************************************************************************************************/ q: {2 w( k4 O. p' Z/ V. ?# ~
- 115 */
* U0 z) F; K; j' F - 116 9 O5 X) m/ ?" S+ [$ c
- 117 void dsp_asm_init(), H- a9 \5 [" T5 }
- 118 {
9 v1 u6 J9 [) z* H! s E/ Z - 119 u16 i=0;
i; }. h1 A+ M2 R - 120 float fx;
3 y% B5 X% ]( T w - 121 for(i=0;i<NPT;i++)
% y" O2 }* s8 E, Y1 l% R2 W - 122 {) C( _8 c+ q: m5 j, T' E2 o- p
- 123 fx = 4000 * sin(PI2*i*50.0/Fs) + 4000 * sin(PI2*i*2500.0/Fs) + 4000*sin(PI2*i*2550.0/Fs);. u- Q: L4 w. x: \
- 124 lBUFIN[i] = ((long)fx)<<16;
J5 ~; x* U: t5 ]& u* C6 p8 k - 125 }0 s) B. g8 \" m) a. q$ q/ r) i' x' f
- 126 }
; ^$ |9 M2 e- x4 ~$ C - 127
, s, A9 s* X v. `( ^( ?! B- n - 128 void dsp_asm_test() 9 q, E% l |7 U# ^0 S
- 129 {
4 a8 |8 F2 n! u5 k/ H8 g0 d4 U& d - 130
8 }- ^5 |- X! ~" ]3 h) I - 131 #ifdef NPT_647 K+ L- B# @4 x0 w
- 132 cr4_fft_64_stm32(lBUFOUT, lBUFIN, NPT);4 U) A5 y8 j3 r) Y4 l L( d# B9 L. u
- 133 #endif% a9 H! `# v4 m! d s
- 134 2 ~9 t6 p( w6 R# y; d- B( P
- 135 #ifdef NPT_256
/ }4 {! s4 f: ]+ Y - 136 cr4_fft_256_stm32(lBUFOUT, lBUFIN, NPT);6 Y( L: [2 a: m( ]1 |- `- I
- 137 #endif
" l: W _; Y' [4 h9 B - 138 # i9 T c3 b$ E' Q. K( L0 D3 \
- 139 #ifdef NPT_1024
: k' |$ ]* X! u6 R- G$ I8 Y$ O# {( [! ] - 140 cr4_fft_1024_stm32(lBUFOUT, lBUFIN, NPT);
$ z. a0 p4 a* y! Y2 w7 q( {5 j - 141 #endif# v) Y) z: v* @0 L8 D8 g
- 142 ( t& n: I+ y ^+ p0 f
- 143 // 计算幅值$ I# W/ Z, H0 j" ]; v/ @
- 144 dsp_asm_powerMag();! o8 @# G7 P: D2 V% I1 b; W: B4 T
- 145 . R' X- z( u- J0 U
- 146 }" f$ w) Y4 F' i3 H
- 147 2 p' F9 K" U0 ?* @
- 148 void dsp_asm_powerMag(void)- a8 C% S6 Y% {* S0 J6 u' K2 ~6 i9 L
- 149 {/ i, v- J* m5 \* F0 U
- 150 s16 lX,lY;
! ^9 V7 J$ W' O3 J# _. D" i/ X - 151 u32 i;* Q, ^6 j3 a) r" j) {$ w
- 152 for(i=0;i<NPT/2;i++)
7 K; q- O; l" A - 153 {
0 b9 z4 r$ E/ ~% I1 N9 k; b( l* ~ - 154 lX = (lBUFOUT[i] << 16) >> 16;
# l. |& K# E, U - 155 lY = (lBUFOUT[i] >> 16);
0 b+ c# }3 p! m5 N( g3 B - 156 { X- t4 O) l v
- 157 float X = NPT * ((float)lX) /32768;
5 U+ `9 K" X5 ^; B, ~ - 158 float Y = NPT * ((float)lY) /32768;' m) o1 D) d6 o$ H9 Q
- 159 float Mag = sqrt(X*X + Y*Y)/NPT;
* m# O6 f' k0 S! V) s& j. G" h - 160 lBUFMAG[i] = (u32)(Mag * 65536);
. z* z+ {' R& k2 z - 161 }
# T7 i1 ~% ?7 P5 Y5 g' X( |1 ? - 162 }* Q0 K% h9 a' ?8 L" P
- 163 }
复制代码- 1 /*6 q. g7 a9 b. Y# N# D
- 2 *********************************************************************************************************
* n. X C3 s0 j) _ ~/ F - 3 * MICIRUM BOARD SUPPORT PACKAGE8 |3 E, p) I# i/ }7 X
- 4 *
5 v1 F" s- g7 ` - 5 * (c) Copyright 2007; Micrium, Inc.; Weston, FL _; f7 ]1 s( r3 Z) x5 O' o1 w+ k
- 6 *
; l- [% Q8 |- P+ t - 7 * All rights reserved. Protected by international copyright laws.
8 g( m1 y( P2 C4 T - 8 * Knowledge of the source code may NOT be used to develop a similar product.& F' @4 e. N1 c& u
- 9 * Please help us continue to provide the Embedded community with the finest4 V7 @, m) R+ S1 s
- 10 * software available. Your honesty is greatly appreciated.
. w1 e- o! _# {* W7 s* L' O - 11 *********************************************************************************************************7 ^$ r+ x8 O( b; S4 D7 |
- 12 */
6 I1 s* P1 [- D8 N - 13
2 G! N! ~3 h& \$ A& {3 q: A - 14 /*
) g; X1 n, I2 B6 L2 o - 15 *********************************************************************************************************$ a' w+ v7 K" e6 ^$ `, H7 G) y
- 16 *
" F' H8 @0 t8 s. c( q* G - 17 * BOARD SUPPORT PACKAGE9 H% ?# ~# v/ J9 F$ R" R0 C
- 18 *3 g' p+ x1 {# r/ X8 d
- 19 * ST Microelectronics STM32
6 J: ?$ L: {) {& L - 20 * with the; R; u4 d5 H0 ~+ ^- S u m
- 21 * STM3210B-EVAL Evaluation Board
! m0 H8 m# L( n - 22 *
0 Q5 s" S/ |0 V' U( X1 o+ W - 23 * Filename : bsp.h
" @, K1 M& H% M - 24 * Version : V1.00
3 A6 X1 h1 B8 l Z& D; ?, i0 g v - 25 * Programmer(s) : Brian Nagel. M8 _( z0 Q% ~" L& o) x1 {
- 26 *********************************************************************************************************" ]/ ^4 s: @" K6 |6 K2 u; `
- 27 */
5 @: t8 N. _$ n5 ^ - 28 2 A* x4 b% @3 r# T) M M& n
- 29 #ifndef __DSP_ASM_H__
$ C' v' j# ~* {- X1 F - 30 #define __DSP_ASM_H__) g% Y8 K' Z7 w/ e$ R2 K
- 31
) l# B6 X' C$ _4 { - 32 /*
+ C& W1 X5 ]1 w: M8 ]' D+ u3 J' X - 33 *********************************************************************************************************
7 f. M( k) P0 @. ] - 34 * EXTERNS" f% V, R; ]+ ~ |5 m
- 35 *********************************************************************************************************. s/ x" f; S+ j d0 r
- 36 */9 H6 R: h$ P$ `8 s) \
- 37
" x8 C- d0 N: y* U* ~ - 38 #ifdef DSP_ASM
! v# e* [( y$ u" _; \+ W) q - 39 #define DSP_EXT* |9 ~# i; F; k
- 40 #else
4 j1 W9 z6 U3 v9 d% b, a - 41 #define DSP_EXT extern l/ \! R6 \& |$ s2 ~
- 42 #endif
- W y/ n7 a v! V/ V - 43
" H/ S# S( ]3 v" H, O5 K% H - 44 /*& m3 R+ ?. [: g7 l1 E) b* y4 W
- 45 *********************************************************************************************************
8 i( x" S1 S! X3 v9 J - 46 * INCLUDE FILES, ~' s0 H: M& B, a0 M% v0 h& }
- 47 *********************************************************************************************************
2 M: u. @ D* B( S& G - 48 */
* z, J2 Q7 b0 M - 49 5 v& i" e: ~! a3 I9 B! Q) U
- 50 * P& k# i2 I9 X% m" q
- 51 5 ^) E& o2 T6 j4 X
- 52 3 \% m/ X' v) j; `, z* g
- 53 /*
: F+ v w$ _- K - 54 *********************************************************************************************************: b0 c( ^1 p2 l# [& c
- 55 * GLOBAL VARIABLES9 F2 K) v+ j0 K7 |7 ?6 F% J
- 56 *********************************************************************************************************- g+ M0 S: p/ G
- 57 */
9 w& G0 S1 L( s9 M% E3 |9 [7 u - 58 4 C' a1 _$ g6 A- A" r$ A" n
- 59 / M- y" _8 H8 k4 @% I3 }1 w
- 60 /*
* J( \; ^5 n( C) {& L& n6 s) O - 61 ********************************************************************************************************* L1 |; E% e9 m
- 62 * MACRO'S
# H+ h: H- J) c# J* I9 [5 q - 63 *********************************************************************************************************
( x+ t6 p7 M, q! O8 _7 O7 R& D1 y7 \ - 64 */
! M3 y6 U5 U) v; K - 65 * A# _" F, w! U. l) O0 K: q0 ~
- 66 $ G$ @. M+ l$ F# k Z
- 67 /*
* [2 K _1 `4 S& O. [ - 68 *********************************************************************************************************: U! G. y- i5 I: p1 E% ^
- 69 * FUNCTION PROTOTYPES8 P' l+ y. {+ [! b
- 70 *********************************************************************************************************# B8 F0 w5 S2 T. X T& K
- 71 */' v; l4 P+ d$ t6 a/ r. n0 M
- 72
, x0 s* T/ s' G9 x - 73 void dsp_asm_test(void);
9 H/ N8 l- R. _. \4 w - 74 void dsp_asm_init(void);$ f3 l5 L% O4 ^! f
- 75 % k( T7 F) ~! |2 \$ t
- 76 #endif /* End of module include. */
复制代码
! V1 B7 O- r5 `( y! ` 着重分析下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位数据。下面的两句
7 O" N, y; ?5 i4 i6 {" o& a float X = NPT * ((float)lX) /32768;
: e* u7 h& |/ U, O9 _% |/ l# n float Y = NPT * ((float)lY) /32768
# E. {+ E3 i7 `0 S" y( J4 s 目的就是把数据浮点化,至于为什么是除以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次方。然后才能进行其他的运算。
9 c9 S! R4 K2 q& i3 C& h 这里是ST公司采用了DSP专用芯片(主要是指TI)的写法,也就是说尽管DSP的芯片类型很多,数据变量的定义也各有差异,但原理是一样的,最终还是要采用DSP习惯的运算方式。至于为什么一定要采用浮点运算,因为机器是傻子,然而TI公司的工程师是天才。 main函数中我们只需在while(1)前加上dsp_asm_init(); dsp_asm_test();即可。
; R. }( M/ c7 t9 h: X0 X @2,实验现象 注意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$ l" L7 E5 `; V8 v
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谐波幅值 3 B! d/ y- i7 t+ s7 r1 Z
总结:该工程中模拟信号源为: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。 7 }2 E: E" S5 w2 e1 _: {
|