打印

求助C5000中DSPLIB的FFT的用法中的问题

[复制链接]
3261|15
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
magodo|  楼主 | 2013-9-29 21:58 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
先接收512个点在buffer_left中,
然后对其进行,


然后将得到的FFT后的值赋给buffer left out数组(long),以便进行求模的运算,

然后通过观察buffer_left_out来看结果

得到是这样的结果,请问是为什么?
我用8000HZ的FS采样1000HZ的正弦波。
在刚接收buffer left时,用ccs的graph中的fft图看是这样的
问题出哪儿了啊


相关帖子

沙发
zhangmangui| | 2013-9-29 22:11 | 只看该作者
计算的问题吧   你先把你的代码对应的公式到matlab里跑跑
看看效果怎么样   还请有经验的人出来帮忙解答

使用特权

评论回复
板凳
zhangmangui| | 2013-9-29 22:13 | 只看该作者
@ifft 帮忙解答一下   谢谢

使用特权

评论回复
地板
magodo|  楼主 | 2013-9-30 00:39 | 只看该作者
zhangmangui 发表于 2013-9-29 22:11
计算的问题吧   你先把你的代码对应的公式到matlab里跑跑
看看效果怎么样   还请有经验的人出来帮忙解答 ...

matlab里试了下,当然OK的。。。

使用特权

评论回复
5
magodo|  楼主 | 2013-9-30 01:49 | 只看该作者
zhangmangui 发表于 2013-9-29 22:13
@ifft 帮忙解答一下   谢谢

我后来用cfft进行变换并且输入为2000HZ的信号,可是出来的图和之前的几乎一样,64,128,192这三个点都有峰值。。

使用特权

评论回复
6
ifft| | 2013-9-30 09:12 | 只看该作者
一步一步调试呗。先看buffer_left经过rfft的结果,接着再看buffer_left_out的结果。数组的定义是按照rfft和cbrev规定的格式吗?这个好像fft输出的实数和虚数都有规定的格式耶

使用特权

评论回复
评分
参与人数 1威望 +4 收起 理由
zhangmangui + 4 赞一个!
7
ifft| | 2013-9-30 09:21 | 只看该作者
还有你确定最后求模运算是正确的吗?应该是for(i=0;i<512;i+=2) {sqrt(buffer(i)*buffer(i)+buffer(i+1)*buffer(i+1))}把?

使用特权

评论回复
8
aresc| | 2013-9-30 10:20 | 只看该作者
本帖最后由 aresc 于 2013-9-30 10:25 编辑

把代码贴全吧,求模那是不是错的? 应该类似下面这样:
如果是实部、虚部交织模式:sqrt(buffer[2*i+0]*buffer[2*i+0]+buffer[2*i+1]*buffer[2*i+1]);
如果前面一半是实部,后一半是虚部:sqrt[buffer[ i ]*buffer[ i ]+buffer[256+i]*buffer[256]+i]);

使用特权

评论回复
9
magodo|  楼主 | 2013-9-30 16:53 | 只看该作者
ifft 发表于 2013-9-30 09:21
还有你确定最后求模运算是正确的吗?应该是for(i=0;i

格式没错,我代码没贴全,是这样的:
  cbrev(buffer_left,buffer_left,256);
  rfft(buffer_left,512,1);
for(i=0;i<512;i++)
{
  buffer_left_out=buffer_left;
}
  for(i=0;i<256;i++)
{
    buffer_left_out=10*sqrt(buffer_left_out[i<<1]*buffer_left_out[i<<1]+buffer_left_out[(i<<1)+1]*buffer_left_out[(i<<1)+1]);
}  

使用特权

评论回复
10
magodo|  楼主 | 2013-9-30 16:56 | 只看该作者
aresc 发表于 2013-9-30 10:20
把代码贴全吧,求模那是不是错的? 应该类似下面这样:
如果是实部、虚部交织模式:sqrt(buffer[2*i+0]*buff ...

文档里这么说的:
On output x will contain the FFT(x) = y in the following format:
y(0)Re y(nx/2)im → DC and Nyquist
y(1)Re y(1)Im
y(2)Re y(2)Im
….
y(nx/2)Re y(nx/2)Im
Complex numbers are stored in Re-Im format
那应该是交织的吧,一个实部一个虚部……

使用特权

评论回复
11
aresc| | 2013-10-9 21:32 | 只看该作者
y(0)Re y(nx/2)im → DC and Nyquist
y(1)Re y(1)Im
y(2)Re y(2)Im
….
y(nx/2)Re y(nx/2)Im
Complex numbers are stored in Re-Im format

这个格式实际上是只存了256/2+1个复数,不是简单的交织,你需要按照实数序列FFT的共轭对称性来扩展成256个复数之后再按你那个sqrt来求模。

你如果有matlab工具,试试下面的例子:

>> a = [1,2,3,4,5,6,7,8];
>> b=fft(a)

b =

  Columns 1 through 5

  36.0000 + 0.0000i  -4.0000 + 9.6569i  -4.0000 + 4.0000i  -4.0000 + 1.6569i  -4.0000 + 0.0000i

  Columns 6 through 8

  -4.0000 - 1.6569i  -4.0000 - 4.0000i  -4.0000 - 9.6569i

按那个文档的描述,实际FFT的输出只有下面这些复数,也就是开始的8/2+1个复数:

36.0000 + 0.0000i  -4.0000 + 9.6569i  -4.0000 + 4.0000i  -4.0000 + 1.6569i  -4.0000 + 0.0000i

但不是很理解文档描述:
y(0)Re y(nx/2)im → DC and Nyquist

实际上对长度为nx的实数序列,其FFT的结果y(0)的虚部, y(nx/2)的虚部总是0,可以参考上面的例子!

使用特权

评论回复
评分
参与人数 1威望 +4 收起 理由
zhangmangui + 4 赞一个!
12
zhangmangui| | 2013-10-10 09:04 | 只看该作者
aresc 发表于 2013-10-9 21:32
y(0)Re y(nx/2)im → DC and Nyquist
y(1)Re y(1)Im
y(2)Re y(2)Im

谢谢分享

使用特权

评论回复
13
annwa| | 2013-10-10 09:37 | 只看该作者
学习了!!1

使用特权

评论回复
14
magodo|  楼主 | 2013-10-12 12:06 | 只看该作者
aresc 发表于 2013-9-30 10:20
把代码贴全吧,求模那是不是错的? 应该类似下面这样:
如果是实部、虚部交织模式:sqrt(buffer[2*i+0]*buff ...

谢谢你的回复,那个问题已经解决了,在CMD文件中的段没有对齐。后来对齐之后就可以成功调用这个函数了。正是由于共轭对称性,所以只需要一半的复数即可,即0~pi的数字频率段的幅值。

使用特权

评论回复
15
zhangmangui| | 2013-10-12 13:10 | 只看该作者
magodo 发表于 2013-10-12 12:06
谢谢你的回复,那个问题已经解决了,在CMD文件中的段没有对齐。后来对齐之后就可以成功调用这个函数了。 ...

这个原因啊   谢谢你的分享

使用特权

评论回复
16
cer1991| | 2014-5-25 10:39 | 只看该作者
magodo 发表于 2013-10-12 12:06
谢谢你的回复,那个问题已经解决了,在CMD文件中的段没有对齐。后来对齐之后就可以成功调用这个函数了。 ...

请问,CMD段没对齐什么意思,我也遇到这个问题想请教下。谢谢

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

8

主题

16

帖子

0

粉丝