声振论坛

 找回密码
 我要加入

QQ登录

只需一步,快速开始

查看: 2942|回复: 8

[FFT] fftshift 函数

[复制链接]
发表于 2009-5-9 21:28 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?我要加入

x
一直有个问题不太明白,直接调用fft画出来的频谱图是左右对称的,因此还要调用fftshift函数,移动零頻的位置。
但是我也看到有人使用这种方法,不调用fftshift,直接plot(f(1:N/2),mag(1:N/2));(这里我不知道为什么不能是0:N/2-1)
使用这种方法也可以实现fftshift的效果。

另外使用fftshift我的为什么不能去掉负半轴呢?
大家看看我的代码:
y=fftshift(fft(x,N));%进行fft变换
mag=abs(y);%求幅值
n=-(N-1)/2:(N-1)/2     
f=n*fs/length(y);%进行对应的频率转换
plot(f,mag);%做频谱图

如果我换成n=0:N/2-1,就不行,因为mag的长度是两倍的n,如果把输出改成plot(f,mag(1:N/2)),则画出的跟上面的那种方法是相反的。
如果要获取正半轴的,该怎么修改呢?


所以,我觉得使用fftshift函数还不如直接使用plot(f(1:N/2),mag(1:N/2));方便又快捷,不知道我的看法是否正确,欢迎大家指正
回复
分享到:

使用道具 举报

 楼主| 发表于 2009-5-10 09:26 | 显示全部楼层
估计一下子发的太长了。。。把人都吓跑了
发表于 2009-5-10 14:16 | 显示全部楼层
用xlim限制x轴的显示范围
 楼主| 发表于 2009-5-10 14:31 | 显示全部楼层
怎么又冒出来一个方法,我现在就想问问怎样使用fftshift函数后,获取它的正半轴
发表于 2009-5-10 16:43 | 显示全部楼层
本帖最后由 wdhd 于 2016-9-18 14:04 编辑
原帖由 lzh19840809 于 2009-5-9 21:28 发表
一直有个问题不太明白,直接调用fft画出来的频谱图是左右对称的,因此还要调用fftshift函数,移动零頻的位置。
但是我也看到有人使用这种方法,不调用fftshift,直接plot(f(1:N/2),mag(1:N/2));(这里我不知道为什么不能是0:N/2-1)
使用这种方法也可以实现fftshift的效果。

在MATLAB中下标不能为0,所以plot(f(0:N/2-1),mag(0:N/2-1));肯定会给出错误信息。

另外使用fftshift我的为什么不能去掉负半轴呢?
大家看看我的代码:
y=fftshift(fft(x,N));%进行fft变换
mag=abs(y);%求幅值
n=-(N-1)/2:(N-1)/2     
f=n*fs/length(y);%进行对应的频率转换
plot(f,mag);%做频谱图

如果我换成n=0:N/2-1,就不行,因为mag的长度是两倍的n,如果把输出改成plot(f,mag(1:N/2)),则画出的跟上面的那种方法是相反的。如果要获取正半轴的,该怎么修改呢?
所以,我觉得使用fftshift函数还不如直接使用plot(f(1:N/2),mag(1:N/2));方便又快捷,不知道我的看法是否正确,欢迎大家指正

把程序改为:
mag=abs(y);%求幅值
n=1:N/2 ;   
f=(n-1)*fs/length(y);%进行对应的频率转换
plot(f,mag(n));%做频谱图
这样就得正半轴的频谱图。

评分

1

查看全部评分

 楼主| 发表于 2009-5-10 19:24 | 显示全部楼层
不用fftshift吗?
发表于 2009-5-10 20:03 | 显示全部楼层
本帖最后由 wdhd 于 2016-9-18 14:04 编辑
原帖由 lzh19840809 于 2009-5-10 19:24 发表
不用fftshift吗?

如果原始数据是实数序列,FFT后正负频率轴上的幅值是对称的,只要看正频率部分就可以了。
发表于 2009-5-18 10:48 | 显示全部楼层
不用fftshift完全也可以,只是后期要进行滤波,那比较复杂,而用fftshift以后直接可以用扇形滤波程序好编
fftshift实际上是一三象限互换,二四象限互换很容易的
发表于 2009-6-4 16:38 | 显示全部楼层

回复 楼主 lzh19840809 的帖子

matlab的下标是从1开始,不像c语言从0开始
举个例子,x=[1 2 3 4 5 6 7 8],
y=fftshift(x)=[5 6 7 8 1 2 3 4],
就是将后半部分平移到前面,也就是负频率部分,
你要的正半轴就应该是[5 6 7 8],也就是说要取y(5:8),
一个例子:你会看到正好在345和350赫兹处出现峰值
clear;figure;
a=sin((1:1000)*0.0005*345*2*pi);
NFFT=1000;sf=2000;
c=fftshift(fft(a));
b=abs(c);
f= 0:sf/NFFT:sf/2-sf/NFFT;
plot(f,b(501:1000))
figure;
a=sin((1:1000)*0.0005*350*2*pi);
NFFT=1000;
c=fftshift(fft(a));
b=abs(c);
f= 0:sf/NFFT:sf/2-sf/NFFT;
plot(f,b(501:1000))

要是不用fftshift,用fft的话,就像下面
clear;figure;
a=sin((1:1000)*0.0005*345*2*pi);
NFFT=1000;sf=1000;
c=fft(a);
b=abs(c);
f=0:sf/NFFT:sf/2-sf/NFFT;
plot(f,b(1:500))
我觉得fftshift最好的作用是显示负频率吧
clear;figure;
a=sin((1:1000)*0.0005*345*2*pi);
NFFT=1000;sf=2000;
c=fftshift(fft(a));
b=abs(c);
f=(1:1000)*sf/NFFT-sf/2;
plot(f,b)
您需要登录后才可以回帖 登录 | 我要加入

本版积分规则

QQ|小黑屋|Archiver|手机版|联系我们|声振论坛

GMT+8, 2024-11-11 17:18 , Processed in 0.077654 second(s), 23 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表