EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
在官方的DSP库进行FFT运算,然后求每一个频率点的幅值,并把幅值用printf在串口打印出来,问题是把计算幅值的函数放到main.c文件中,结果是正确的,但把它放到其他文件中,在main函数中调用,结果就不正确了,哪位大神知道问什么? 这是main函数,作用就是计算FFT后每一点的幅值,其中GetPowerMag(FFT_Out_Array, FFT_Mag_Array);函数是在fft.c中定义的,但结果不对,如果拿到main.c中就正确了
$ s9 N: n* k4 N$ M ~( M0 Q% J; u
#include "config.h". c2 j$ a4 k, I5 N
#include "led.h"
8 p" b: Q. E: K4 B: W7 ?( r#include
, D3 v# [% y" }$ |# {9 [% C- v) \, a#include "fft.h" #define Fs 6400 //采样率 H: s. C9 E7 W. {
#define PI2 6.28318530717959 long FFT_In_Array[NPT];* x, j. q. X J0 k
long FFT_Out_Array[NPT];% a& b0 H) ]" B, S+ q0 n" V3 ^
unsigned long FFT_Mag_Array[NPT/2]; void fft_Init(void); int main(void)1 _. G1 S$ c4 z5 q
{
7 U- l5 o1 h( m ou8 i; RCC_Configuration();GPIO_Configuration();NVIC_Configuration();USART1_Configuration();//ADC_Configuration();//DMA_Configuration();// initLED(); fft_Init();//FFT运算cr4_fft_256_stm32(FFT_Out_Array, FFT_In_Array, NPT);//计算幅值GetPowerMag(FFT_Out_Array, FFT_Mag_Array);//打印每一点的幅值for(i=0;i<NPT/2;i++){ printf("%d=%ld\n", i, FFT_Mag_Array);}while (1){ } return 0;} //用指定频率的波形,初始化FFT数组
* [/ c" O; f3 }, D J* Nvoid fft_Init()- b+ h: n7 S& I
{
/ N% R$ I% u T! p/ p" sunsigned short i;
9 w* l" r2 D- h5 I+ j; vfloat fx;
$ q% J3 p+ V& l& Kfor(i=0; i<NPT; i++)! ~' ^% u" R5 h6 z' h% h
{. J2 S6 d9 ?; i ]) U C& m
fx = 1500 * sin(PI2 * i * 350.0 / Fs) +
D2 I+ D" o: c2700 * sin(PI2 * i * 8400.0 / Fs) +
4 C% G+ t B/ h) D4000 * sin(PI2 * i * 18725.0 / Fs);) N4 ^$ z. l( d* k/ z" f+ \
FFT_In_Array = ((signed short)fx) << 16;
- b. S9 F$ m0 [9 h+ q- M! G( ^( c}
! F; y; q" ?0 h0 F' ^% x" `! d} 以下是fft.c--------------------------------------- #include "fft.h" void GetPowerMag(long *pIn, unsigned long *pMag)
! P- y7 g$ J8 ~ I0 U, ?6 v/ `+ I) C9 w{
$ v S8 W$ O: l9 c ?3 {3 x; Ssigned short lX,lY; O1 a7 V6 s! P+ g
float X,Y,Mag;
# m6 Z) w" f, R6 [4 funsigned short i;
+ K! W8 n! q7 ~) efor(i=0; i {. O& W% I: Q/ ^. i6 x6 o. d2 K# g
lX = (pIn > 16;9 @9 i! N7 u& V+ e2 e, n# p
lY = (pIn >> 16);
/ h+ l$ `5 @4 p& B K* m! o5 ?X = NPT * ((float)lX) / 32768;
' ]: K x9 E- Z$ R' bY = NPT * ((float)lY) / 32768;
- g" J/ E% M" OMag = sqrt(X * X + Y * Y) / NPT;
0 y6 @' E6 J3 d& ]! `' ~if(i == 0)5 K* X; g8 B; N2 {! W
pMag = (unsigned long)(Mag * 32768);
) ~* K$ j" F5 Y; Q' _9 uelse
6 A& {4 _, {" p+ t/ PpMag = (unsigned long)(Mag * 65536); }}
6 i% x8 C# `/ e7 h# l0 d) c
1 G1 w2 A i" s: L: c5 g $ k& ~6 S) M w" R* s. [4 K7 C
|