如何理解FFT

時域信號分爲週期/非週期,連續和離散,這樣有四中樣式的傅里葉變換。

變換類型 時域信號特性 頻譜特性
連續時域FT 連續,非週期 非週期,連續
離散時域傅里葉變換DTFT 離散非週期 週期,連續
傅里葉級數FS 連續,週期 非週期,離散
離散傅里葉變換DFT 離散,週期 週期,離散

如上可以看到,在一個域的離散信號,在另一個域將變成周期的,類似的,在一個域連續的信號,在另外一個域必然是非週期的。

DFT

分爲實數和複數版本的DFT,實數版本輸入是實數,得到的頻域點將有兩個集合,分別是cos” role=”presentation” style=”position: relative;”>coscos函數的係數。複數輸入表示的是正負頻率。
這裏寫圖片描述

實 DFT

對於輸入是x(n)” role=”presentation” style=”position: relative;”>x(n)x(n)係數

Xre[k]=2N∑n=0N−1x[n]cos⁡(2πknN),K=0,1,..,N/2” role=”presentation” style=”text-align: center; position: relative;”>Xre[k]=2Nn=0N1x[n]cos(2πknN),K=0,1,..,N/2Xre[k]=2N∑n=0N−1x[n]cos⁡(2πknN),K=0,1,..,N/2

Xim[k]=2N∑n=0N−1x[n]sin⁡(2πknN),K=0,1,..,N/2” role=”presentation” style=”text-align: center; position: relative;”>Xim[k]=2Nn=0N1x[n]sin(2πknN),K=0,1,..,N/2Xim[k]=2N∑n=0N−1x[n]sin⁡(2πknN),K=0,1,..,N/2

根據係數獲取原始輸入時,需要對Xre[0]” role=”presentation” style=”position: relative;”>Xre[0]Xre[0]除以2。

復DFT

對於N點複數DFT變換後得到的是N點X[k]” role=”presentation” style=”position: relative;”>X[k]X[k]

X[k]=1N∑n=0N−1x[n]e−j2πkn/N” role=”presentation” style=”text-align: center; position: relative;”>X[k]=1Nn=0N1x[n]ej2πkn/NX[k]=1N∑n=0N−1x[n]e−j2πkn/N

變換後的X[0]” role=”presentation” style=”position: relative;”>X[0]X[0]是負頻分量。
從頻譜獲得原始輸入信號的公式是:
x[n]=∑k=0N−1X[k]ej2πkn/N” role=”presentation” style=”text-align: center; position: relative;”>x[n]=k=0N1X[k]ej2πkn/Nx[n]=∑k=0N−1X[k]ej2πkn/N

當時域信號是實數時,計算復DFT時,將虛部填零,下圖是matlab fft函數計算的DFT結果。
這裏寫圖片描述

FFT

FFT是DFT計算的快速方法。

X[k]=∑n=0N−1x[n]e−j2πkn/N” role=”presentation” style=”text-align: center; position: relative;”>X[k]=n=0N1x[n]ej2πkn/NX[k]=∑n=0N−1x[n]e−j2πkn/N

x[n]=1N∑k=0N−1X[k]ej2πkn/N” role=”presentation” style=”text-align: center; position: relative;”>x[n]=1Nk=0N1X[k]ej2πkn/Nx[n]=1N∑k=0N−1X[k]ej2πkn/N

matlab
x=fft(x,N),%計算X[k]
x=ifft(x,N)
  • 1
  • 2
  • 3

FFT結果舉例

假設x[n]” role=”presentation” style=”position: relative;”>x[n]x[n]

fc=10;
fs=32*fc;%sampling frequency with oversampling factor=32
t=0:1/fs:2-1/fs;%2 seconds duration
x=cos(2*pi*fc*t);%time domain signal (real number)
subplot(3,1,1); plot(t,x);hold on; %plot the signal
title('x[n]=cos(2 \pi 10 t)'); xlabel('n'); ylabel('x[n]');
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

這裏寫圖片描述
N=256” role=”presentation” style=”position: relative;”>N=256N=256點FFT

X = fft(x,N);%N-point complex DFT
%output contains DC at index 1, Nyquist frequency at N/2+1 th index
%positive frequencies from index 2 to N/2
%negative frequencies from index N/2+1 to N
  • 1
  • 2
  • 3
  • 4

matlab數組從1開始,輸出1-N,頻點間隔是Δf=fsN” role=”presentation” style=”position: relative;”>Δf=fsNΔf=fsN,先輸出直流分量,然後是正頻分量,再然後是負頻分量,在MATLAB中使用fftshift後將頻率按,負頻分量,直流以及正頻分量排列。
這裏寫圖片描述

實信號

這裏寫圖片描述

這裏寫圖片描述

1)實數信號以fs” role=”presentation” style=”position: relative;”>fsfs,則
2)實數信號的fft結果中前半部分是[0,fs/2]” role=”presentation” style=”position: relative;”>[0,fs/2][0,fs/2],這就是直流分量,
3)另外還應該注意到第i個數,實際上等於第N−i” role=”presentation” style=”position: relative;”>NiN−i個數的共軛,
4)所以實際上實數的快速傅里葉算法會利用這個性質減小運算量和存儲空間,這是在代碼級別的優化
5)在實際頻率顯示時,某些場合期望得到[−fs/2,fs/2]” role=”presentation” style=”position: relative;”>[fs/2,fs/2][−fs/2,fs/2]顯示頻譜,通常會使用matlab 的fftshift來實現這個功能。

覆信號

1)對於覆信號沒有負頻率,以fs” role=”presentation” style=”position: relative;”>fsfs
2)在f>fs/2” role=”presentation” style=”position: relative;”>f>fs/2f>fs/2時,對覆信號的fft結果進行fftshift會產生頻譜混跌。

                                            <link rel="stylesheet" href="https://csdnimg.cn/release/phoenix/production/markdown_views-68a8aad09e.css">
                                </div>

看完前輩的解讀,似乎更懂傅立葉這傢伙了。
轉自:https://blog.csdn.net/shichaog/article/details/75692855#reply

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章