|
|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
使用STM32官方的DSP库进行FFT运算,然后求每一个频率点的幅值,并把幅值用printf在串口打印出来,问题是我把计算幅值的函数放到main.c文件中,结果是正确的,但把它放到其他文件中,在main函数中调用,结果就不正确了,哪位大神知道问什么?
5 f) @) ?: Z! {1 o5 T这是main函数,作用就是计算FFT后每一点的幅值,其中GetPowerMag(FFT_Out_Array, FFT_Mag_Array);函数是在fft.c中定义的,但结果不对,如果拿到main.c中就正确了' z7 o; L N" y& I* A" W
#include "config.h"
' e& G3 R( z' o' s; B* Z; }#include "led.h"
& |2 C1 L% `5 G1 F9 p#include
! [8 ]1 ?8 i4 @9 f/ G. O#include "fft.h"
2 ]) E) C/ o/ ^#define Fs 6400 //采样率
1 G6 z4 [7 r' I2 O! M3 m6 `) j9 b3 {#define PI2 6.28318530717959
: i3 r( S" J/ b; s! O y* ?' W$ Flong FFT_In_Array[NPT];3 d" f" H# m) `% Z
long FFT_Out_Array[NPT];
- Q7 c( }4 O! j8 H1 @' U) dunsigned long FFT_Mag_Array[NPT/2];
! ^1 ?, n$ l0 _+ Y( z2 vvoid fft_Init(void);- H! `- o$ _) I L
int main(void)
2 h; I2 f& C2 }: m' x+ j{
6 p, j R( R- u& m* M/ Y Z8 o1 d( yu8 i;( w8 i) c; V5 m1 `5 V! K
RCC_Configuration();) `0 x0 t1 J( L7 Z( d
GPIO_Configuration();
3 a5 P6 j9 U+ L: VNVIC_Configuration();
* N$ e: |+ F8 z3 f$ n) p8 g9 |$ ]USART1_Configuration();
! t$ ~; m8 h% h) z; d0 }+ i' G# T; I! M* t7 R. o( b
//ADC_Configuration();
4 q$ Y" [7 ~7 b0 ~- u# s2 G; \, W) R) W7 g& v6 I3 b6 w2 X" `
) H5 d3 z- y( D! K//DMA_Configuration();
& Z$ G' T$ {6 z8 P5 K// initLED();
" X6 |6 ] k! D" wfft_Init();. a& k/ [1 }* M" R) H
( h, X9 c+ C4 g: C5 _1 s- M
//FFT运算
" `% v5 X- T, ?) R' V/ ?5 ^# jcr4_fft_256_stm32(FFT_Out_Array, FFT_In_Array, NPT);
4 { F U F) @/ k4 Y( v3 ~4 S
//计算幅值
' V" n( f( ]* t5 N% A! \- ~- tGetPowerMag(FFT_Out_Array, FFT_Mag_Array);: h j& Z+ y" P
8 }! [( g% T5 O. `8 A//打印每一点的幅值6 l% C8 n" x t; f: z' ?
for(i=0;i<NPT/2;i++), y3 C# z3 | I3 @- o. O
{
" F3 p8 [$ \. `! m printf("%d=%ld\n", i, FFT_Mag_Array);
. r7 Q, p+ t6 F}5 @, e( x- s" l9 A6 e- q9 D8 v4 O; B
+ X' e: K. i0 B% i8 Swhile (1): r+ {8 g' F5 ~3 ]7 ]* L6 F
{ " O7 Y: ^, [. I+ ~
( _" D/ ?0 {& Y
# d. |" a! v$ i/ d% `
}
0 L6 B* q1 x/ c+ W8 M* X J
8 s4 h, Q& }/ ereturn 0;- O4 Q+ t W* f" B
}
2 W8 ~! |+ }* L H7 e//用指定频率的波形,初始化FFT数组! k7 N/ ]: f3 [0 K3 c i; `
void fft_Init()- l5 A# N- \2 ]! q2 L j* X
{
# e8 Q; e1 n; C5 y1 W+ C: iunsigned short i;0 j& A+ Q/ p! l* ?" C3 v
float fx;1 B# m; G- l- y. i
for(i=0; i<NPT; i++)# ?, i8 v8 L7 Q* X- y. c
{
8 i g" M8 F) Q. rfx = 1500 * sin(PI2 * i * 350.0 / Fs) +
% Y# A1 B& u) _2700 * sin(PI2 * i * 8400.0 / Fs) +
) B7 R. I$ I; r5 n5 z; d5 \- Z4000 * sin(PI2 * i * 18725.0 / Fs);
: s- ?- [2 X& z9 j+ IFFT_In_Array = ((signed short)fx) << 16;1 G9 ^8 s! ~8 L4 E4 B5 p+ ]
}. T" ~' i. z8 o5 r# b
}# q, t f4 w' {" D1 Z
以下是fft.c---------------------------------------
2 l" f/ Q# [& O" M$ s. T% s#include "fft.h"
; C9 e( X! w% x) W# b& K( i3 Xvoid GetPowerMag(long *pIn, unsigned long *pMag) & | ]# l i2 i) w
{
4 V' k! v- ~3 W6 M' I. r( Csigned short lX,lY;( V9 X/ c& V: ?+ a8 H+ K( c2 `) ~
float X,Y,Mag;
% L/ t) d7 [' ]" l" p8 N: O5 M2 vunsigned short i;8 q, w0 P! d) ~/ F3 e, z% B# O
for(i=0; i {
! w# a( y9 L+ d! M# X* ^lX = (pIn > 16;% x5 u" w5 g s" N" s: y; X
lY = (pIn >> 16);- ?3 @. P& k; D
X = NPT * ((float)lX) / 32768;
+ P. @! m/ P8 q$ \8 {/ LY = NPT * ((float)lY) / 32768;, T1 @( b: ^) ~6 u1 [
Mag = sqrt(X * X + Y * Y) / NPT;( e' {, d# n5 ~; c
if(i == 0)
% b& x% L7 k7 p. \! U# y9 W. opMag = (unsigned long)(Mag * 32768);
% ?; S& H8 d4 \$ `* _else
9 C$ @, V( s4 q) \& A3 v( D) vpMag = (unsigned long)(Mag * 65536);
6 I. v! |6 e+ g3 R$ D}8 g4 ^! |' h J' Q9 G9 k! r
} |
|