MATLAB中的fft后为何要用fftshift.docx
- 文档编号:29537179
- 上传时间:2023-07-24
- 格式:DOCX
- 页数:10
- 大小:37.78KB
MATLAB中的fft后为何要用fftshift.docx
《MATLAB中的fft后为何要用fftshift.docx》由会员分享,可在线阅读,更多相关《MATLAB中的fft后为何要用fftshift.docx(10页珍藏版)》请在冰豆网上搜索。
MATLAB中的fft后为何要用fftshift
MATLAB中的fft后为何要用fftshift?
分类:
Matlab2011-08-1510:
52581人阅读评论(0)收藏举报
fft是一维傅里叶变换,即将时域信号转换为频域信号
fftshift
是针对频域的,将FFT的DC分量移到频谱中心
即对频域的图像,(假设用一条水平线和一条垂直线将频谱图分成四块)对这四块进行对角线的交换与反对角线的交换
FFTSHIFT Shiftzero-frequencycomponenttocenterofspectrum.
Forvectors,FFTSHIFT(X)swaps(交换)theleftandrighthalvesof
X.Formatrices,FFTSHIFT(X)swapsthefirstandthird
quadrantsandthesecondandfourthquadrants.ForN-D
arrays,FFTSHIFT(X)swaps"half-spaces"ofXalongeach
dimension.
FFTSHIFT(X,DIM)appliestheFFTSHIFToperationalongthe
dimensionDIM.
FFTSHIFTisusefulforvisualizingtheFouriertransformwith
thezero-frequencycomponentinthemiddleofthespectrum.
fftshift就是对换数据的左右两边比如
x=[1234]
fftshift(x)->[3412]
IFFTSHIFTInverseFFTshift.(就是fftshift的逆)
x=[1 2 3 4 5];
y=fftshift(x)
y=
4 5 1 2 3
ifftshift(y)
ans=
1 2 3 4 5
IFFTSHIFTundoestheeffectsofFFTSHIFT.
注意:
在使用matlab的fft及fftshift时,应注意。
假定采样频率fs,采样间隔dt,采样点数N。
fft后,频率为(0:
N-1)/N/dt
进行fftshift后,频率为
ifmod(N,2)==0
n1=(0:
N-1)-N/2;
else
n1=(0:
N-1)-(N-1)/2;
end
实际上,频率为N点为周期的,所以
(0:
N-1)
所以,对于频率0,1,2,3,4,实际上为0,1,2,-2(3-5),-1(4-5)。
fftshift后的频率为
-2,-1,0,1,2
对于二维fftshift,其与直接用下面的结果一样
ifmod(tempN,2)==0
kx=(0:
tempM-1)/tempM/dx-tempM/2/tempM/dx;%kx=kx*2*pi
else
kx=(0:
tempM-1)/tempM/dx-(tempM-1)/2/tempM/dx;%kx=kx*2*pi
end
kx=kx*2*pi;
ifmod(tempM,2)==0
ky=(0:
tempN-1)/tempN/dy-tempN/2/tempN/dy;%kx=kx*2*pi
else
ky=(0:
tempN-1)/tempN/dy-(tempN-1)/2/tempN/dy;%kx=kx*2*pi
end
ky=ky*2*pi;
temp1=sqrt(kx.^2+ky.^2);
k1=temp1;
[kx,ky]=meshgrid(kx,ky);
如下面程序表明上面两个相同:
dx=50e3;
dy=50e3;
%%%%%%%%%%%
tempN=41;
tempM=41;
%%%%%%%%%%%%
%%%%determiningthewavenumberkxandky
ifmod(tempM,2)==0
kx=(0:
tempM-1)-tempM/2;%kx=kx*2*pi
else
kx=(0:
tempM-1)-(tempM-1)/2;%kx=kx*2*pi
end
kx=kx*2*pi/tempM/dx;
ifmod(tempN,2)==0
ky=(0:
tempN-1)-tempN/2;%kx=kx*2*pi
else
ky=(0:
tempN-1)-(tempN-1)/2;%kx=kx*2*pi
end
ky=ky*2*pi/tempN/dy;
[kxx,kyy]=meshgrid(kx,ky);
k00=sqrt(kx.^2+ky.^2);
%%%%%%%%%%%%%%%%
ifmod(tempM,2)==0
temp1=tempM/2-1;
temp2=(temp1+1):
(tempM-1);
temp2=temp2-tempM;
temp3=[0:
temp1,temp2];
kx=temp3/tempM/dx;%kx=kx*2*pi
else
temp1=(tempM-1)/2;
temp2=(temp1+1):
(tempM-1);
temp2=temp2-tempM;
temp3=[0:
temp1,temp2];
kx=temp3/tempM/dx;%kx=kx*2*pi
end
kx=kx*2*pi;
ifmod(tempN,2)==0
temp1=tempN/2-1;
temp2=(temp1+1):
(tempN-1);
temp2=temp2-tempN;
temp3=[0:
temp1,temp2];
ky=temp3/tempN/dy;%kx=kx*2*pi
else
temp1=(tempN-1)/2;
temp2=(temp1+1):
(tempN-1);
temp2=temp2-tempN;
temp3=[0:
temp1,temp2];
ky=temp3/tempN/dy;%kx=kx*2*pi
end
ky=ky*2*pi;
[kx,ky]=meshgrid(kx,ky);
kx=fftshift(kx);
ky=fftshift(ky);
k=sqrt(kx.^2+ky.^2);
figure
subplot(3,1,1),contourf(kxx-kx)
subplot(3,1,2),contourf(kyy-ky)
subplot(3,1,3),contourf(k00-k)
%%%%%%%%%%%
fft及fftshift示例:
clf;
fs=100;N=256; %采样频率和数据点数
n=0:
N-1;t=n/fs; %时间序列
x=0.5*sin(2*pi*15*t)+2*sin(2*pi*40*t);%信号
y1=fft(x,N); %对信号进行快速Fourier变换
y2=fftshift(y1);
mag1=abs(y1); %求得Fourier变换后的振幅
mag2=abs(y2);
f1=n*fs/N; %频率序列
f2=n*fs/N-fs/2;%这个未必正确
subplot(3,1,1),plot(f1,mag1,'r'); %绘出随频率变化的振幅
xlabel('频率/Hz');
ylabel('振幅');title('图1:
usualFFT','color','r');gridon;
subplot(3,1,2),plot(f2,mag1,'b'); %绘出随频率变化的振幅
xlabel('频率/Hz');
ylabel('振幅');title('图2:
FFTwithoutfftshift','color','b');gridon;
subplot(3,1,3),plot(f2,mag2,'c'); %绘出随频率变化的振幅
xlabel('频率/Hz');
ylabel('振幅');title('图3:
FFTafterfftshift','color','c');gridon;
Matlabfftshift详解-信号处理基本功
2010-04-1321:
51:
10| 分类:
默认分类| 标签:
matlab radar |字号大中小 订阅
愿消三障诸烦恼,愿得智慧真明了,普愿罪障悉消除,世世常行菩萨道。
愿以此功德。
庄严佛净土。
上报四重恩。
下济三途苦。
若有见闻者。
悉发菩提心。
尽此一报身。
同生极乐国。
一.实信号情况
因为实信号以fs为采样速率的信号在fs/2处混叠,所以实信号fft的结果中前半部分对应[0,fs/2],后半部分对应[-fs/2,0]
1)实信号fft的结果前半部分对应[0,fs/2]是正频率的结果,后半部分对应[-fs/2,0]是负频率的结果。
大于fs/2的部分的频谱实际上是实信号的负频率加fs的结果。
故要得到正确的结果,只需将视在频率减去fs即可得到频谱对应的真实负频率
2)如果要让实信号fft的结果与[-fs/2,fs/2]对应,则要fft后fftshift一下即可,fftshift的操作是将fft结果以fs/2为中心左右互换
3)如果实信号fft的绘图频率f从[-fs/2,fs/2],并且没有fftshift,则fft正频谱对应f在[0,fs/2]的结果将混叠到(f-fs/2)的位置;
fft负频谱对应f在[-fs/2,0]的结果混叠到f+fs-fs/2的位置,注意这里f为负值,也就是说此种情况下fft负频谱对应的视在频率减去fs/2即可得到频谱对应的真实负频率
二.复信号情况
1)复信号没有负频率,以fs为采样速率的信号,fft的频谱结果是从[0,fs]的。
2)在f>fs/2时,对复信号的fft结果进行fftshift会产生频率混叠(将下面的示例2中的频率从f=15改为f=85可以验证f=85的谱线在fftshift后跑到f=-15=85-fs=85-100的位置了),所以复信号也一般要求f<=fs/2
3)在对雷达的慢时间维(复信号)进行fft后,由于要用doppler=((0:
LFFT-1)/LFFT -0.5)*PRF;计算多普勒频率,所以对该慢时间信号fft后要fftshift下,以便和正确的频率单元相对应。
注意多普勒频率fd<=PRF/2时才测的准!
fftshift
作用:
将零频点移到频谱的中间
用法:
Y=fftshift(X)
Y=fftshift(X,dim)
描述:
fftshift移动零频点到频谱中间,重新排列fft,fft2和fftn的输出结果。
将零频点放到频谱的中间对于观察傅立叶变换是有用的。
示例1-实信号的情况:
clf;
fs=100;N=256; %采样频率和数据点数
n=0:
N-1;t=n/fs; %时间序列
x=0.5*sin(2*pi*15*t)+2*sin(2*pi*40*t);%信号
y1=fft(x,N); %对信号进行快速Fourier变换
y2=fftshift(y1);
mag1=abs(y1); %求得Fourier变换后的振幅
mag2=abs(y2);
f1=n*fs/N; %频率序列
f2=n*fs/N-fs/2;
subplot(3,1,1),plot(f1,mag1,'r'); %绘出随频率变化的振幅
xlabel('频率/Hz');
ylabel('振幅');title('图1:
usualFFT','color','r');gridon;
subplot(3,1,2),plot(f2,mag1,'b'); %绘出随频率变化的振幅
xlabel('频率/Hz');
ylabel('振幅');title('图2:
FFTwithoutfftshift','color','b');gridon;
subplot(3,1,3),plot(f2,mag2,'c'); %绘出随频率变化的振幅
xlabel('频率/Hz');
ylabel('振幅');title('图3:
FFTafterfftshift','color','c');gridon;
结论:
1)如果期望绘制的幅频图的频率范围为0~fs,则无需运行fftshift变换,正频率对应在[0,fs/2],
大于fs/2的频谱的频率值为对应[-fs/2 ,0 ]负频率f+fs,注意f是负频率,是个负数。
如图1。
2)如果期望绘制的幅频图的频率范围为-fs/2~fs/2,则需要运行fftshift变换,如图3;
如果不变换,图示的响应频点会发生变换,如图2,分析见顶端。
示例2-复信号的情况:
closeall;clear;clf;
fs=100;N=256; %采样频率和数据点数
n=0:
N-1;t=n/fs; %时间序列
x=0.5*exp(j*2*pi*15*t)+2*exp(j*2*pi*40*t);%信号
y1=fft(x,N); %对信号进行快速Fourier变换
y2=fftshift(y1);
mag1=abs(y1); %求得Fourier变换后的振幅
mag2=abs(y2);
f1=n*fs/N; %频率序列
f2=n*fs/N-fs/2;
subplot(3,1,1),plot(f1,mag1,'r'); %绘出随频率变化的振幅
xlabel('频率/Hz');
ylabel('振幅');title('图1:
usualFFT','color','r');gridon;
subplot(3,1,2),plot(f2,mag1,'b'); %绘出随频率变化的振幅
xlabel('频率/Hz');
ylabel('振幅');title('图2:
FFTwithoutfftshift','color','b');gridon;
subplot(3,1,3),plot(f2,mag2,'c'); %绘出随频率变化的振幅
xlabel('频率/Hz');
ylabel('振幅');title('图3:
FFTafterfftshift','color','c');gridon
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- MATLAB 中的 fft 为何 fftshift