使用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);
}
}