找回密码
 注册
关于网站域名变更的通知
查看: 324|回复: 1
打印 上一主题 下一主题

STM32官方DSP库进行FFT运算的问题

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2019-8-20 16:54 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

EDA365欢迎您登录!

您需要 登录 才可以下载或查看,没有帐号?注册

x
使用STM32官方的DSP库进行FFT运算,然后求每一个频率点的幅值,并把幅值用printf在串口打印出来,问题是我把计算幅值的函数放到main.c文件中,结果是正确的,但把它放到其他文件中,在main函数中调用,结果就不正确了,哪位大神知道问什么?, S8 b6 Q1 \  A9 |' l9 N
这是main函数,作用就是计算FFT后每一点的幅值,其中GetPowerMag(FFT_Out_Array, FFT_Mag_Array);函数是在fft.c中定义的,但结果不对,如果拿到main.c中就正确了
9 {7 ^' G0 J. q" X$ y& y# F#include "config.h"! }0 S/ g; A  M3 V2 e( K, y
#include "led.h"# Q% p* g0 m* I; y
#include
, x* G7 y( v( x6 v' y5 C#include "fft.h"
& p& I+ V5 _, n1 |#define Fs 6400 //采样率) h8 `: {- z) \' o
#define PI2 6.28318530717959
( r' o# W, s4 w1 ?long FFT_In_Array[NPT];4 y, w" E6 P* ?( ]7 T) |3 e
long FFT_Out_Array[NPT];  U- j# ~# H4 u! [: D
unsigned long FFT_Mag_Array[NPT/2];0 K+ j5 W, |. S! X) M1 Q
void fft_Init(void);
+ L9 H8 I6 G2 k# Zint main(void)! L6 s3 o7 `+ q, h
{
, L, t( D5 B7 |. O) [3 {" C( `u8 i;
$ K" K4 T0 Q4 V# N5 k: {+ Q: HRCC_Configuration();) e# t; p; }! a. w8 D' u$ b
GPIO_Configuration();
8 L9 V; d; ~6 W1 D$ `NVIC_Configuration();0 C$ J) M$ p( ^7 L: o5 M" h
USART1_Configuration();6 Z8 M* Z# f+ S) B0 R! S  ]
* a9 ^3 Z- m* M) m
//ADC_Configuration();
! _5 U. |7 K0 z1 w6 |1 y9 H
0 D! T8 R, h2 x; T8 ^& }& H4 ~7 w9 m' `! j
//DMA_Configuration();
" K) `5 D! R; \5 [! W; \: z7 `+ X// initLED();
9 Q" j5 q+ N# J( D2 [1 {fft_Init();
1 `6 e" P9 z& J* {/ o0 N
" p# X# X! @' Y8 q, W* Z; e' f* v//FFT运算
+ {, |# r. M) Ucr4_fft_256_stm32(FFT_Out_Array, FFT_In_Array, NPT);
; s0 B8 t2 i  V/ H$ s& ?1 _
. @2 u& s, {& `  J) G//计算幅值
$ w+ Z) ^$ d; B+ |0 n0 v$ l& G+ ZGetPowerMag(FFT_Out_Array, FFT_Mag_Array);. R' f' m$ o; X; |
5 [, k  D3 i- c! B6 L; v
//打印每一点的幅值1 v3 g! _, E0 U, ~( W
for(i=0;i<NPT/2;i++)$ ^- ?# N7 ?$ Z8 |6 c8 ?; l% x
{      
& V# P5 x* Y' m1 W    printf("%d=%ld\n", i, FFT_Mag_Array);
. `$ I3 {, l- f4 o8 k}8 W2 G/ D. s) u- G! e. Q
( n  s) k9 l6 Y& }( z! ?. w" ~
while (1)
1 A' t1 y+ l; q% t7 a% d: J{                           
% l3 {8 Z# ?4 |- s5 r- {
& o0 Z6 \6 y4 \+ l) @0 R  T: c# B# m5 |4 E3 T1 X  J& a( b% [7 X
} * H: y$ y$ W9 ^6 `3 S
; C/ _" K* v9 H+ G- N
return 0;9 D4 D, c" D- j2 P0 Y# }* ]  o' N
}: u1 H$ J. A" ?
//用指定频率的波形,初始化FFT数组, a, d1 l2 I( d% I% T0 _5 E1 T
void fft_Init()
4 `, \+ z6 e1 K7 X{
: g% n' N, ^6 m3 }unsigned short i;
3 b' w9 \: r& jfloat fx;7 M8 J0 L8 X0 J5 p3 w
for(i=0; i<NPT; i++)
3 e- X1 h" W8 j- I{# o: F+ q. G; `* a0 G5 Z) j
fx = 1500 * sin(PI2 * i * 350.0 / Fs) +! A9 Z9 `- {( Z/ j: p6 k
2700 * sin(PI2 * i * 8400.0 / Fs) +
  s- c, {6 L$ |7 P* A; w4000 * sin(PI2 * i * 18725.0 / Fs);
2 r# v9 @/ P$ B; V- j/ _: wFFT_In_Array = ((signed short)fx) << 16;! w+ g; J2 q, n* s7 A
}
* D$ I# C$ y' M: u. k( \2 \}1 e1 @+ i. O3 {; N7 p/ F- h
以下是fft.c---------------------------------------. {" i# a) N3 L3 J$ m! G- {7 I9 R
#include "fft.h"
; z/ {# x& x' i. m1 l) ivoid GetPowerMag(long *pIn, unsigned long *pMag)
8 e- n  [: o4 j/ V/ ?3 I! s  \{
! B9 T; o! Z9 b- }8 u  b  Ksigned short lX,lY;
) I) Y0 a1 K: ~+ b7 O2 efloat X,Y,Mag;
& O% X$ `+ T+ qunsigned short i;
) r7 k& c3 |( o6 {& ffor(i=0; i {8 l" a" P6 H- J0 t, M
lX = (pIn > 16;
" j. L9 r# C3 {, a# JlY = (pIn >> 16);5 w; h% v. v. x
X = NPT * ((float)lX) / 32768;
  l0 p# B: \9 ^1 |Y = NPT * ((float)lY) / 32768;
# t( s# K" c" B" kMag = sqrt(X * X + Y * Y) / NPT;: D+ G6 K% p7 g. N; {
if(i == 0)
# x6 H7 A& |. C/ V5 wpMag = (unsigned long)(Mag * 32768);
& ]  Y2 h2 V9 i) ]2 K! Helse
: D' ^0 r9 M' n5 B' @pMag = (unsigned long)(Mag * 65536);9 I: v4 w2 E1 @( q, x1 F
}
# Z. j3 b; E  ~2 Y( z# g" O) N9 q, ^}

该用户从未签到

2#
发表于 2019-8-20 17:21 | 只看该作者
从源代码的管理上来说,应该不存在你所描述的问题。9 i" [4 x/ M- k, O' |! w: X0 Q6 O
像你这样出现的问题,可能是变量或其它未同步引起的。确认一下两种传入参数与各全局变量是否相同吧!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

推荐内容上一条 /1 下一条

EDA365公众号

关于我们|手机版|EDA365电子论坛网 ( 粤ICP备18020198号-1 )

GMT+8, 2025-11-24 22:16 , Processed in 0.156250 second(s), 23 queries , Gzip On.

深圳市墨知创新科技有限公司

地址:深圳市南山区科技生态园2栋A座805 电话:19926409050

快速回复 返回顶部 返回列表