fftshift函數詳解


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;

 

  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM