scipy.fft.

fft#

scipy.fft.fft(x, n=None, axis=-1, norm=None, overwrite_x=False, workers=None, *, plan=None)[source]#

計算 1-D 離散傅立葉轉換。

此函數使用有效率的快速傅立葉轉換 (FFT) 演算法 [1],計算 1-D n 點離散傅立葉轉換 (DFT)。

參數:
xarray_like

輸入陣列,可以是複數。

nint,選用

輸出轉換軸的長度。如果 n 小於輸入的長度,則輸入會被裁剪。如果它更大,則輸入會以零填充。如果未給定 n,則使用輸入沿著由 axis 指定的軸的長度。

axisint,選用

計算 FFT 的軸。如果未給定,則使用最後一個軸。

norm{“backward”, “ortho”, “forward”},選用

正規化模式。預設值為 “backward”,表示正向轉換沒有正規化,反向轉換 (ifft) 縮放 1/n 倍。“forward” 則是在正向轉換上應用 1/n 因子。對於 norm="ortho",兩個方向都縮放 1/sqrt(n) 倍。

Added in version 1.6.0: 新增了 norm={"forward", "backward"} 選項

overwrite_xbool,選用

如果為 True,則可以破壞 x 的內容;預設值為 False。請參閱下面的註解以了解更多詳細資訊。

workersint,選用

用於平行計算的最大工作worker數量。如果為負數,則該值從 os.cpu_count() 環繞。請參閱下文以了解更多詳細資訊。

planobject,選用

此引數保留用於傳入下游 FFT 供應商提供的預先計算的 plan。目前 SciPy 中未使用它。

Added in version 1.5.0.

返回:
out複數 ndarray

沿著由 axis 指示的軸轉換的截斷或零填充輸入,如果未指定 axis,則為最後一個軸。

引發:
IndexError

如果 axes 大於 x 的最後一個軸。

另請參閱

ifft

fft 的反向。

fft2

2-D FFT。

fftn

N-D FFT。

rfftn

實數輸入的 N-D FFT。

fftfreq

給定 FFT 參數的頻率區間。

next_fast_len

為了最有效率的轉換而填充輸入的大小

註解

FFT(快速傅立葉轉換)指的是一種有效計算離散傅立葉轉換 (DFT) 的方法,透過使用計算項中的對稱性。當 n 是 2 的冪時,對稱性最高,因此對於這些大小,轉換最有效率。對於難以分解的大小,scipy.fft 使用 Bluestein 演算法 [2],因此永遠不會比 O(n log n) 差。透過使用 next_fast_len 對輸入進行零填充,可以觀察到進一步的效能提升。

如果 x 是一維陣列,則 fft 等效於

y[k] = np.sum(x * np.exp(-2j * np.pi * k * np.arange(n)/n))

頻率項 f=k/ny[k] 處找到。在 y[n/2] 處,我們到達奈奎斯特頻率並環繞到負頻率項。因此,對於 8 點轉換,結果的頻率為 [0, 1, 2, 3, -4, -3, -2, -1]。若要重新排列 fft 輸出,使零頻率分量居中,例如 [-4, -3, -2, -1, 0, 1, 2, 3],請使用 fftshift

轉換可以使用單精度、雙精度或擴展精度(長雙精度)浮點數完成。半精度輸入將轉換為單精度,非浮點輸入將轉換為雙精度。

如果 x 的資料類型為實數,則會自動使用「實數 FFT」演算法,這大約可將計算時間減半。為了進一步提高效率,請使用 rfft,它執行相同的計算,但僅輸出對稱頻譜的一半。如果資料既是實數又是對稱的,則 dct 可以再次將效率提高一倍,方法是從訊號的一半產生頻譜的一半。

當指定 overwrite_x=True 時,實作可以以任何方式使用 x 引用的記憶體。這可能包括將記憶體重複用於結果,但這絕不能保證。轉換後,您不應依賴 x 的內容,因為這可能會在未來更改,恕不另行通知。

workers 引數指定將 FFT 計算分割成的最大平行工作worker數量。這將在 x 內執行獨立的 1-D FFT。因此,x 必須至少是 2-D,且未轉換的軸必須夠大才能分割成區塊。如果 x 太小,則使用的工作worker數量可能少於請求的數量。

參考文獻

[1]

Cooley, James W., and John W. Tukey, 1965, “An algorithm for the machine calculation of complex Fourier series,” Math. Comput. 19: 297-301.

[2]

Bluestein, L., 1970, “A linear filtering approach to the computation of discrete Fourier transform”. IEEE Transactions on Audio and Electroacoustics. 18 (4): 451-455.

範例

>>> import scipy.fft
>>> import numpy as np
>>> scipy.fft.fft(np.exp(2j * np.pi * np.arange(8) / 8))
array([-2.33486982e-16+1.14423775e-17j,  8.00000000e+00-1.25557246e-15j,
        2.33486982e-16+2.33486982e-16j,  0.00000000e+00+1.22464680e-16j,
       -1.14423775e-17+2.33486982e-16j,  0.00000000e+00+5.20784380e-16j,
        1.14423775e-17+1.14423775e-17j,  0.00000000e+00+1.22464680e-16j])

在此範例中,實數輸入的 FFT 是 Hermitian 的,即實部對稱,虛部反對稱

>>> from scipy.fft import fft, fftfreq, fftshift
>>> import matplotlib.pyplot as plt
>>> t = np.arange(256)
>>> sp = fftshift(fft(np.sin(t)))
>>> freq = fftshift(fftfreq(t.shape[-1]))
>>> plt.plot(freq, sp.real, freq, sp.imag)
[<matplotlib.lines.Line2D object at 0x...>,
 <matplotlib.lines.Line2D object at 0x...>]
>>> plt.show()
../../_images/scipy-fft-fft-1.png