fftshift
作用:將零頻點移到頻譜的中間
用法:
Y=fftshift(X)
Y=fftshift(X,dim)
描述:fftshift移動零頻點到頻譜中間,重新排列fft,fft2和fftn的輸出結果。將零頻點放到頻譜的中間對於觀察傅立葉變換是有用的。
fftshift就是對換數據的左右兩邊比如 x=[1 2 3 4] fftshift(x) ->[3 4 1 2] IFFTSHIFT Inverse FFT shift.(就是fftshift的逆)(IFFTSHIFT undoes the effects of FFTSHIFT.
x=[1 2 3 4 5];
y=fftshift(x)
y =
4 5 1 2 3
ifftshift(y)
ans =
1 2 3 4 5
需要fftshift的原因:
1、在matlab中,經過fft變換后,數據的頻率范圍是從[0,fs]排列的。
2、而一般,我們在畫圖或者討論的時候,是從[-fs/2,fs/2]的范圍進行分析。
3、因此,需要將經過fft變換后的圖像的[fs/2,fs]部分移動到[-fs/2,0]這個范圍內。而fftshift就是完成這個功能。通常,如果想得到所見的中間是0頻的圖像,經過fft變換后,都要再經過fftshift。
=================================================================================================================================
一.對於實信號:
因為實信號以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.如果希望繪制的頻譜圖的頻率范圍為:0-fs,則無需進行fftshift,正頻率對應0-fs/2;大於fs/2的頻譜的頻率值為對應[-fs/2 , 0 ]負頻率f + fs,注意f是負頻率,是個負數。
2.如果期望繪制的幅頻圖的頻率范圍為-fs/2~fs/2,則需要運行fftshift變換,如果不變換,圖示的響應頻點會發生變換。
二.復信號情況
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的程序理解
clc;close all;clear all;
fs=100;N=256; %采樣頻率和數據點數
n=0:N-1;t=n/fs; %時間序列,從0到2.55s
x=0.5*sin(2*pi*15*t)+2*sin(2*pi*40*t); %信號
y1=fft(x,N); %對信號進行快速Fourier變換,256點DFT
y2=fftshift(y1); %fftshift的操作是將fft結果以fs/2為中心左右互換
mag1=abs(y1); %求得Fourier變換后的振幅
mag2=abs(y2);
f1=n*fs/N; %頻率序列
f2=n*fs/N-fs/2; %頻率序列向左移fs/2
figure;
subplot(3,1,1),plot(f1,mag1,'r'); %繪出隨頻率變化的振幅
xlabel('頻率/Hz');ylabel('振幅');title('圖1:usual FFT','color','r');grid on;
subplot(3,1,2),plot(f2,mag1,'b'); %繪出隨頻率變化的振幅
xlabel('頻率/Hz');ylabel('振幅');title('圖2:FFT without fftshift','color','b');grid on;
subplot(3,1,3),plot(f2, mag2,'c'); %繪出隨頻率變化的振幅
xlabel('頻率/Hz');ylabel('振幅');title('圖3:FFT after fftshift','color','c');grid on;

%===============================================================================================================================
%復信號的情況:
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;
figure;
subplot(3,1,1),plot(f1,mag1,'r'); %繪出隨頻率變化的振幅
xlabel('頻率/Hz');ylabel('振幅');title('圖1:usual FFT','color','r');grid on;
subplot(3,1,2),plot(f2,mag1,'b'); %繪出隨頻率變化的振幅
xlabel('頻率/Hz');ylabel('振幅');title('圖2:FFT without fftshift','color','b');grid on;
subplot(3,1,3),plot(f2,mag2,'c'); %繪出隨頻率變化的振幅
xlabel('頻率/Hz');ylabel('振幅');title('圖3:FFT after fftshift','color','c');grid on;

%=============================================================================================
更直觀的程序:
t=0:0.001:2;
n=2001;
Fs=1000;
Fc=200;
x=cos(2*pi*Fc*t);
y1=fft(x);
y2=fftshift(y1);
f=(0:2000)*Fs/n-Fs/2;
figure;
hold on;
plot(f,abs(y1),'r')
plot(f,abs(y2),'b')

總之用fftshift后頻率序列要減去fs/2
參考:
http://www.cnblogs.com/limanjihe/p/10014142.html
fft后為什么要fftshift: https://blog.csdn.net/ssdxiao01/article/details/6687721
https://blog.csdn.net/zhyoulun/article/details/12859339
https://wenku.baidu.com/view/c6a7964476c66137ee06199a.html
