當前位置: 首頁>>代碼示例 >>用法及示例精選 >>正文


Python SciPy fft.fft用法及代碼示例


本文簡要介紹 python 語言中 scipy.fft.fft 的用法。

用法:

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

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

該函數計算一維n具有高效快速傅裏葉變換 (FFT) 算法的點離散傅裏葉變換 (DFT)[1].

參數

x array_like

輸入數組,可以很複雜。

n 整數,可選

輸出的變換軸的長度。如果 n 小於輸入的長度,則裁剪輸入。如果它更大,則用零填充輸入。如果未給出 n,則使用沿軸指定的軸的輸入長度。

axis 整數,可選

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

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

標準化模式。默認值為“backward”,這意味著在 ifft 上的正向變換和縮放1/n 沒有標準化。 “forward” 改為在正向變換上應用1/n 因子。對於 norm="ortho" ,兩個方向都按 1/sqrt(n) 縮放。

overwrite_x 布爾型,可選

如果為 True,則 x 的內容可以被銷毀;默認為假。有關詳細信息,請參閱下麵的注釋。

workers 整數,可選

用於並行計算的最大工作線程數。如果為負,則該值從 os.cpu_count() 環繞。請參閱下麵的更多細節。

plan 對象,可選

此參數保留用於傳遞下遊 FFT 供應商提供的預先計算的計劃。它目前未在 SciPy 中使用。

返回

out 複雜的ndarray

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

拋出

IndexError

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

注意

FFT(快速傅裏葉變換)是指通過在計算項中使用對稱性,可以有效計算離散傅裏葉變換 (DFT) 的一種方式。對稱性最高的時候n是 2 的冪,因此對於這些大小,變換是最有效的。對於難以分解的大小,scipy.fft使用 Bluestein 算法[2]所以永遠不會比 O(n日誌n)。通過使用零填充輸入可以看到進一步的性能改進scipy.fft.next_fast_len.

如果 x 是一維數組,則 fft 相當於

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

頻率項 f=k/n 位於 y[k] 。在y[n/2],我們達到了奈奎斯特頻率並環繞到負頻率項。因此,對於 8 點變換,結果的頻率為 [0, 1, 2, 3, -4, -3, -2, -1]。要重新排列 fft 輸出以使 zero-frequency 組件居中,例如 [-4, -3, -2, -1, 0, 1, 2, 3],請使用 fftshift

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

如果x的數據類型為實數,則自動使用“real FFT”算法,計算時間大致減半。為了進一步提高效率,請使用 rfft ,它執行相同的計算,但隻輸出對稱頻譜的一半。如果數據既真實又對稱, dct 可以通過從一半信號生成一半頻譜,再次使效率翻倍。

當指定overwrite_x=True 時,x 引用的內存可以由實現以任何方式使用。這可能包括為結果重用內存,但這絕不是保證。您不應該在轉換後依賴 x 的內容,因為這可能會在未來發生變化而不會發出警告。

workers 參數指定將 FFT 計算拆分成的最大並行作業數。這將在 x 內執行獨立的一維 FFT。因此,x 必須至少是二維的,並且未轉換的軸必須足夠大以拆分成塊。如果x 太小,使用的作業可能比請求的少。

參考

[1]

Cooley、James W. 和 John W. Tukey,1965 年,“複雜傅裏葉級數的機器計算算法”,數學。計算。 19:297-301。

[2]

Bluestein, L.,1970,“計算離散傅裏葉變換的線性濾波方法”。 IEEE 音頻和電聲學匯刊。 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])

在此示例中,實數輸入具有 Hermitian 的 FFT,即實部對稱而虛部反對稱:

>>> 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()
scipy-fft-fft-1.png

相關用法


注:本文由純淨天空篩選整理自scipy.org大神的英文原創作品 scipy.fft.fft。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。