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

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

[复制链接]

该用户从未签到

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

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
}

该用户从未签到

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

本版积分规则

关闭

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

EDA365公众号

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

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

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

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

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