打印

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

[复制链接]
3811|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

粉丝