reference: https://ww2.mathworks.cn/help/matlab/ref/fftshift.html
一.實信號情況
因為實信號以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: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變換,正頻率對應在[0, fs/2],大於fs/2的頻譜的頻率值為對應[-fs/2 , 0 ]負頻率f + fs,注意f是負頻率,是個負數。如圖1。
2)如果期望繪制的幅頻圖的頻率范圍為-fs/2~fs/2,則需要運行fftshift變換,如圖3;如果不變換,圖示的響應頻點會發生變換,如圖2,分析見頂端。
示例2 -復信號的情況:
close all; 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: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;