原文地址:MATLAB中的fft後爲什麼要用fftshifthtml
fft是一維傅里葉變換,即將時域信號轉換爲頻域。spa
fftshift是針對頻域的,將FFT的DC份量移到頻譜中心,從新排列fft,fft1和……ftn的輸出結果。htm
fftshift就是對換數據的左右兩邊好比
x=[1 2 3 4]
fftshift(x) ->[3 4 1 2]
IFFTSHIFT Inverse FFT shift.(就是fftshift的逆)blog
x=[1 2 3 4 5];get
y=fftshift(x)it
y =class
4 5 1 2 3grid
ifftshift(y)im
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。