離散傅立葉變換 (numpy.fft)#

SciPy 模組 scipy.fftnumpy.fft 更全面的超集,僅包含一組基本常式。

標準 FFT#

fft(a[, n, axis, norm, out])

計算一維離散傅立葉變換。

ifft(a[, n, axis, norm, out])

計算一維反離散傅立葉變換。

fft2(a[, s, axes, norm, out])

計算二維離散傅立葉變換。

ifft2(a[, s, axes, norm, out])

計算二維反離散傅立葉變換。

fftn(a[, s, axes, norm, out])

計算 N 維離散傅立葉變換。

ifftn(a[, s, axes, norm, out])

計算 N 維反離散傅立葉變換。

實數 FFT#

rfft(a[, n, axis, norm, out])

計算實數輸入的一維離散傅立葉變換。

irfft(a[, n, axis, norm, out])

計算 rfft 的反變換。

rfft2(a[, s, axes, norm, out])

計算實數陣列的二維 FFT。

irfft2(a[, s, axes, norm, out])

計算 rfft2 的反變換。

rfftn(a[, s, axes, norm, out])

計算實數輸入的 N 維離散傅立葉變換。

irfftn(a[, s, axes, norm, out])

計算 rfftn 的反變換。

Hermitian FFT#

hfft(a[, n, axis, norm, out])

計算具有 Hermitian 對稱性(即實數頻譜)訊號的 FFT。

ihfft(a[, n, axis, norm, out])

計算具有 Hermitian 對稱性訊號的反 FFT。

輔助常式#

fftfreq(n[, d, device])

傳回離散傅立葉變換的取樣頻率。

rfftfreq(n[, d, device])

傳回離散傅立葉變換的取樣頻率(用於 rfft、irfft)。

fftshift(x[, axes])

將零頻率分量移至頻譜中心。

ifftshift(x[, axes])

fftshift 的反變換。

背景資訊#

傅立葉分析從根本上來說是一種將函數表示為週期性分量之和,並從這些分量中恢復函數的方法。當函數及其傅立葉變換都替換為離散化對應項時,它被稱為離散傅立葉變換 (DFT)。DFT 已成為數值計算的主要方法,部分原因是存在一種非常快速的演算法來計算它,稱為快速傅立葉變換 (FFT),高斯 (1805) 就已知道,並且由 Cooley 和 Tukey [CT] 以目前的形式公開。Press 等人 [NR] 提供了傅立葉分析及其應用程式的易懂介紹。

由於離散傅立葉變換將其輸入分離為在離散頻率下起作用的分量,因此它在數位訊號處理中具有大量應用,例如,用於濾波,在這種情況下,變換的離散化輸入通常稱為訊號,它存在於時域中。輸出稱為頻譜變換,存在於頻域中。

實作細節#

定義 DFT 的方法有很多種,指數的符號、正規化等各不相同。在此實作中,DFT 定義為

\[A_k = \sum_{m=0}^{n-1} a_m \exp\left\{-2\pi i{mk \over n}\right\} \qquad k = 0,\ldots,n-1.\]

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 定義為

\[a_m = \frac{1}{n}\sum_{k=0}^{n-1}A_k\exp\left\{2\pi i{mk\over n}\right\} \qquad m = 0,\ldots,n-1.\]

它與正向變換的不同之處在於指數引數的符號和預設正規化 \(1/n\)

型別提升#

numpy.fftfloat32complex64 陣列分別提升為 float64complex128 陣列。對於不提升輸入陣列的 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 定義為

\[A_{kl} = \sum_{m=0}^{M-1} \sum_{n=0}^{N-1} a_{mn}\exp\left\{-2\pi i \left({mk\over M}+{nl\over N}\right)\right\} \qquad k = 0, \ldots, M-1;\quad l = 0, \ldots, N-1,\]

它以顯而易見的方式擴展到更高維度,更高維度的反變換也以相同的方式擴展。

參考文獻#

[CT]

Cooley, James W. 和 John W. Tukey,1965 年,「用於機器計算複數傅立葉級數的演算法」,Math. Comput. 19: 297-301。

[NR]

Press, W.、Teukolsky, S.、Vetterline, W.T. 和 Flannery, B.P.,2007 年,《數值食譜:科學計算的藝術》,第 12-13 章。劍橋大學出版社,英國劍橋。

範例#

如需範例,請參閱各種函數。