ST DSP FFT 库函数使用遇到问题求助

[复制链接]
4383|2
 楼主| TuBie 发表于 2011-10-3 16:43 | 显示全部楼层 |阅读模式
本帖最后由 TuBie 于 2011-10-3 16:47 编辑

使用1024点的FFT运算,使用ST提供的DSP库(版本2.0.0),代码如下:

u32 FFT_InputArray[1024],FFT_OutputArray[1024]; //用于存放输入和输出的数组
u32 ResultValue; //中间变量
u32 RealPart,ImagPart; //结果的实部和虚部
for(Index=0;Index<1024;Index++)
{
  ResultValue = (u32)(100.0*(cos(20*2*3.1415926*Index*0.001)));//生成20Hz的模拟数据,采样率1kHz
  FFT_InputArray[Index] = ResultValue&0xFFFF; //赋值到数组,低16位。
}
cr4_fft_1024_stm32(FFT_OutputArray, FFT_InputArray, 1024); //进行FFT运算
//以下代码用于计算模值
for(Index=0;Index<512;Index++)
{
  RealPart = FFT_OutputArray[Index]>>16;
  ImagPart = FFT_OutputArray[Index]&0xFFFF;
  ChannelDataP[Index] = (u16)sqrt(RealPart*RealPart+ImagPart*ImagPart);
}

结果显示计算出来的模值要么是65535,要么是0.
哪位帮我看看怎么回事吧,多谢了!
heroxx 发表于 2011-10-3 22:13 | 显示全部楼层
1. ResultValue = (u32)(100.0*(cos(20*2*3.1415926*Index*0.001)));
ResultValue强制转换成u32h后,将不会有负值,源数据就是无效的了。改成这样:
ResultValue =2048+(2048*(cos(20*2*3.1415926*Index*0.001)));
因为AD的采样值范围0~4095,这样比较符合实际应用。

2.FFT_InputArray[Index] = ResultValue&0xFFFF;
FFT_InputArray[Index] = ResultValue<<16;(输入数据中实部在高字)

3.ChannelDataP[Index] = (u16)sqrt(RealPart*RealPart+ImagPart*ImagPart);
Mag[Index]=ChannelDataP[Index]*2/N;


Mag[0]
 楼主| TuBie 发表于 2011-10-4 22:19 | 显示全部楼层
感谢楼上!

按照楼上的方法进行了修改,但还是一样的现象,同样的输入序列,我用自己写的FFT函数运算的结果是正确的,但是运算速度比ST的慢许多。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

135

主题

428

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部