求助C5000中DSPLIB的FFT的用法中的问题
先接收512个点在buffer_left中,。然后对其进行,
然后将得到的FFT后的值赋给buffer left out数组(long),以便进行求模的运算,
然后通过观察buffer_left_out来看结果
得到是这样的结果,请问是为什么?
我用8000HZ的FS采样1000HZ的正弦波。
在刚接收buffer left时,用ccs的graph中的fft图看是这样的
问题出哪儿了啊
计算的问题吧 你先把你的代码对应的公式到matlab里跑跑
看看效果怎么样 还请有经验的人出来帮忙解答 @ifft 帮忙解答一下 谢谢 zhangmangui 发表于 2013-9-29 22:11 static/image/common/back.gif
计算的问题吧 你先把你的代码对应的公式到matlab里跑跑
看看效果怎么样 还请有经验的人出来帮忙解答 ...
matlab里试了下,当然OK的。。。 zhangmangui 发表于 2013-9-29 22:13 static/image/common/back.gif
@ifft 帮忙解答一下 谢谢
我后来用cfft进行变换并且输入为2000HZ的信号,可是出来的图和之前的几乎一样,64,128,192这三个点都有峰值。。 一步一步调试呗。先看buffer_left经过rfft的结果,接着再看buffer_left_out的结果。数组的定义是按照rfft和cbrev规定的格式吗?这个好像fft输出的实数和虚数都有规定的格式耶 还有你确定最后求模运算是正确的吗?应该是for(i=0;i<512;i+=2) {sqrt(buffer(i)*buffer(i)+buffer(i+1)*buffer(i+1))}把? 本帖最后由 aresc 于 2013-9-30 10:25 编辑
把代码贴全吧,求模那是不是错的? 应该类似下面这样:
如果是实部、虚部交织模式:sqrt(buffer*buffer+buffer*buffer);
如果前面一半是实部,后一半是虚部:sqrt*buffer[ i ]+buffer*buffer+i]);
ifft 发表于 2013-9-30 09:21 static/image/common/back.gif
还有你确定最后求模运算是正确的吗?应该是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*buffer_left_out+buffer_left_out[(i<<1)+1]*buffer_left_out[(i<<1)+1]);
}
aresc 发表于 2013-9-30 10:20 static/image/common/back.gif
把代码贴全吧,求模那是不是错的? 应该类似下面这样:
如果是实部、虚部交织模式:sqrt(buffer*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
那应该是交织的吧,一个实部一个虚部…… 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 = ;
>> 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,可以参考上面的例子! aresc 发表于 2013-10-9 21:32 static/image/common/back.gif
y(0)Re y(nx/2)im → DC and Nyquist
y(1)Re y(1)Im
y(2)Re y(2)Im
谢谢分享 学习了!!1 aresc 发表于 2013-9-30 10:20 static/image/common/back.gif
把代码贴全吧,求模那是不是错的? 应该类似下面这样:
如果是实部、虚部交织模式:sqrt(buffer*buff ...
谢谢你的回复,那个问题已经解决了,在CMD文件中的段没有对齐。后来对齐之后就可以成功调用这个函数了。正是由于共轭对称性,所以只需要一半的复数即可,即0~pi的数字频率段的幅值。 magodo 发表于 2013-10-12 12:06 static/image/common/back.gif
谢谢你的回复,那个问题已经解决了,在CMD文件中的段没有对齐。后来对齐之后就可以成功调用这个函数了。 ...
这个原因啊 谢谢你的分享 magodo 发表于 2013-10-12 12:06 static/image/common/back.gif
谢谢你的回复,那个问题已经解决了,在CMD文件中的段没有对齐。后来对齐之后就可以成功调用这个函数了。 ...
请问,CMD段没对齐什么意思,我也遇到这个问题想请教下。谢谢
页:
[1]