離散傅立葉變換 (numpy.fft
)#
SciPy 模組 scipy.fft
是 numpy.fft
更全面的超集,僅包含一組基本常式。
標準 FFT#
實數 FFT#
Hermitian FFT#
輔助常式#
背景資訊#
傅立葉分析從根本上來說是一種將函數表示為週期性分量之和,並從這些分量中恢復函數的方法。當函數及其傅立葉變換都替換為離散化對應項時,它被稱為離散傅立葉變換 (DFT)。DFT 已成為數值計算的主要方法,部分原因是存在一種非常快速的演算法來計算它,稱為快速傅立葉變換 (FFT),高斯 (1805) 就已知道,並且由 Cooley 和 Tukey [CT] 以目前的形式公開。Press 等人 [NR] 提供了傅立葉分析及其應用程式的易懂介紹。
由於離散傅立葉變換將其輸入分離為在離散頻率下起作用的分量,因此它在數位訊號處理中具有大量應用,例如,用於濾波,在這種情況下,變換的離散化輸入通常稱為訊號,它存在於時域中。輸出稱為頻譜或變換,存在於頻域中。
實作細節#
定義 DFT 的方法有很多種,指數的符號、正規化等各不相同。在此實作中,DFT 定義為
DFT 通常針對複數輸入和輸出定義,線性頻率 \(f\) 的單頻分量由複數指數 \(a_m = \exp\{2\pi i\,f m\Delta t\}\) 表示,其中 \(\Delta t\) 是取樣間隔。
結果中的值遵循所謂的「標準」順序:如果 A = fft(a, n)
,則 A[0]
包含零頻率項(訊號的總和),對於實數輸入,它始終是純實數。然後 A[1:n/2]
包含正頻率項,而 A[n/2+1:]
包含負頻率項,順序為遞減負頻率。對於偶數個輸入點,A[n/2]
表示正負奈奎斯特頻率,對於實數輸入,它也是純實數。對於奇數個輸入點,A[(n-1)/2]
包含最大正頻率,而 A[(n+1)/2]
包含最大負頻率。常式 np.fft.fftfreq(n)
傳回一個陣列,其中提供輸出中對應元素的頻率。常式 np.fft.fftshift(A)
移動變換及其頻率,以將零頻率分量放在中間,而 np.fft.ifftshift(A)
則取消該移動。
當輸入 a 是時域訊號且 A = fft(a)
時,np.abs(A)
是其振幅頻譜,而 np.abs(A)**2
是其功率頻譜。相位頻譜可由 np.angle(A)
獲得。
反 DFT 定義為
它與正向變換的不同之處在於指數引數的符號和預設正規化 \(1/n\)。
型別提升#
numpy.fft
將 float32
和 complex64
陣列分別提升為 float64
和 complex128
陣列。對於不提升輸入陣列的 FFT 實作,請參閱 scipy.fftpack
。
正規化#
引數 norm
指示直接/反變換對中的哪個方向被縮放以及使用什麼正規化因子。預設正規化 ("backward"
) 使直接(正向)變換不縮放,反向(反向)變換縮放 \(1/n\)。可以透過將關鍵字引數 norm
設定為 "ortho"
來獲得單位變換,以便直接變換和反變換都縮放 \(1/\sqrt{n}\)。最後,將關鍵字引數 norm
設定為 "forward"
會使直接變換縮放 \(1/n\),而反變換不縮放(即與預設 "backward"
完全相反)。None 是預設選項 "backward"
的別名,以實現向後相容性。
實數和 Hermitian 變換#
當輸入為純實數時,其變換為 Hermitian,即頻率 \(f_k\) 的分量是頻率 \(-f_k\) 的分量的複共軛,這表示對於實數輸入,負頻率分量中沒有任何資訊是正頻率分量中已有的資訊。rfft
函數系列旨在對實數輸入進行運算,並透過僅計算正頻率分量(直到並包括奈奎斯特頻率)來利用此對稱性。因此,n
個輸入點產生 n/2+1
個複數輸出點。此系列的反變換假定其輸入具有相同的對稱性,並且對於 n
個點的輸出,使用 n/2+1
個輸入點。
相應地,當頻譜為純實數時,訊號為 Hermitian。hfft
函數系列透過在輸入(時域)中使用 n/2+1
個複數點來獲得頻域中的 n
個實數點,從而利用此對稱性。
在更高維度中,FFT 用於影像分析和濾波等。FFT 的計算效率意味著它也可以成為計算大型卷積的更快方法,方法是使用時域中的卷積等效於頻域中的逐點乘法的屬性。
更高維度#
在二維中,DFT 定義為
它以顯而易見的方式擴展到更高維度,更高維度的反變換也以相同的方式擴展。
參考文獻#
範例#
如需範例,請參閱各種函數。