fft是一維傅里葉變換,即將時域信號轉換為頻域。
fftshift是針對頻域的,將FFT的DC分量移到頻譜中心,重新排列fft,fft1和……ftn的輸出結果。
fftshift就是對換數據的左右兩邊比如
x=[1 2 3 4]
fftshift(x) ->[3 4 1 2]
IFFTSHIFT Inverse FFT shift.(就是fftshift的逆)
x=[1 2 3 4 5];
y=fftshift(x)
y =
4 5 1 2 3
ifftshift(y)
ans =
1 2 3 4 5
在OFDM系統中,將DC分量0移到頻譜中心
x = [0 0 1 1 1 1 1 1 0 0];
fftshift(x)
ans =
1 1 1 0 0 0 0 1 1 1
直接用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: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;

結論:
1)如果期望繪制的幅頻圖的頻率范圍為0~fs,則無需運行fftshift變換,如圖1。
2)如果期望繪制的幅頻圖的頻率范圍為-fs/2~fs/2,則需要運行fftshift變換,如圖3;如果不變換,圖示的響應頻點會發生變換,如圖2。
