2 itccccc itccccc 于 2015.07.07 14:00 提问

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

使用STM32官方的DSP库进行FFT运算,然后求每一个频率点的幅值,并把幅值用printf在串口打印出来,问题是我把计算幅值的函数放到main.c文件中,结果是正确的,但把它放到其他文件中,在main函数中调用,结果就不正确了,哪位大神知道问什么?

这是main函数,作用就是计算FFT后每一点的幅值,其中GetPowerMag(FFT_Out_Array, FFT_Mag_Array);函数是在fft.c中定义的,但结果不对,如果拿到main.c中就正确了

#include "config.h"
#include "led.h"
#include
#include "fft.h"

#define Fs 6400 //采样率
#define PI2 6.28318530717959

long FFT_In_Array[NPT];
long FFT_Out_Array[NPT];
unsigned long FFT_Mag_Array[NPT/2];

void fft_Init(void);

int main(void)
{
u8 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[i]);
}

while (1)
{                           


} 

return 0;

}

//用指定频率的波形,初始化FFT数组
void fft_Init()
{
unsigned short i;
float fx;
for(i=0; i<NPT; i++)
{
fx = 1500 * sin(PI2 * i * 350.0 / Fs) +
2700 * sin(PI2 * i * 8400.0 / Fs) +
4000 * sin(PI2 * i * 18725.0 / Fs);
FFT_In_Array[i] = ((signed short)fx) << 16;
}
}

以下是fft.c---------------------------------------

#include "fft.h"

void GetPowerMag(long *pIn, unsigned long *pMag)
{
signed short lX,lY;
float X,Y,Mag;
unsigned short i;
for(i=0; i {
lX = (pIn[i] > 16;
lY = (pIn[i] >> 16);
X = NPT * ((float)lX) / 32768;
Y = NPT * ((float)lY) / 32768;
Mag = sqrt(X * X + Y * Y) / NPT;
if(i == 0)
pMag[i] = (unsigned long)(Mag * 32768);
else
pMag[i] = (unsigned long)(Mag * 65536);

}

}

1个回答

91program
91program   Ds   Rxr 2015.07.07 14:17

从源代码的管理上来说,应该不存在你所描述的问题。
像你这样出现的问题,可能是变量或其它未同步引起的。确认一下两种传入参数与各全局变量是否相同吧!

Csdn user default icon
上传中...
上传图片
插入图片