scipy.fft.

fft#

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

计算一维离散傅里叶变换。

此函数使用高效的快速傅里叶变换 (FFT) 算法 [1] 计算一维 *n* 点离散傅里叶变换 (DFT)。

参数:
xarray_like

输入数组,可以是复数。

nint, optional

输出变换轴的长度。如果 `n` 小于输入长度,则输入将被截断。如果 `n` 更大,则输入将被零填充。如果未给出 `n`,则使用由 `axis` 指定的轴上的输入长度。

axisint, 可选

计算 FFT 的轴。如果未给出,则使用最后一个轴。

norm{"backward", "ortho", "forward"}, 可选

归一化模式。默认为“backward”,表示正向变换时不进行归一化,在 ifft 上进行 `1/n` 缩放。“forward”则在正向变换上应用 `1/n` 因子。对于 `norm="ortho"`,两个方向都按 `1/sqrt(n)` 缩放。

版本 1.6.0 中添加: 添加了 `norm={"forward", "backward"}` 选项

overwrite_xbool, 可选

如果为 True,则 `x` 的内容可能会被销毁;默认值为 False。有关更多详细信息,请参阅下面的注释。

workersint, 可选

用于并行计算的最大工作线程数。如果为负,则从 `os.cpu_count()` 环绕取值。有关更多详细信息,请参阅下文。

plan对象,可选

此参数保留用于传递下游 FFT 供应商提供的预计算计划。目前在 SciPy 中未使用。

版本 1.5.0 中添加。

返回:
out复数 ndarray

截断或零填充的输入,沿由 `axis` 指定的轴(如果未指定 `axis`,则为最后一个轴)进行变换。

引发:
IndexError

如果 `axes` 大于 `x` 的最后一个轴。

另请参阅

ifft

fft 的逆变换。

fft2

二维 FFT。

fftn

N 维 FFT。

rfftn

实数输入的 N 维 FFT。

fftfreq

给定 FFT 参数的频率 bin。

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/n` 位于 `y[k]`。在 `y[n/2]` 处,我们到达奈奎斯特频率并回绕到负频率项。因此,对于 8 点变换,结果的频率为 [0, 1, 2, 3, -4, -3, -2, -1]。要将 fft 输出重新排列,使其零频率分量居中,如 [-4, -3, -2, -1, 0, 1, 2, 3],请使用 fftshift

变换可以用单精度、双精度或扩展精度 (long double) 浮点数进行。半精度输入将被转换为单精度,非浮点数输入将被转换为双精度。

如果 `x` 的数据类型为实数,则会自动使用“实数 FFT”算法,该算法将计算时间大约减半。为了进一步提高效率,可以使用 rfft,它执行相同的计算,但只输出对称频谱的一半。如果数据既是实数又是对称的,那么 dct 可以通过从一半信号生成一半频谱来再次将效率提高一倍。

当指定 `overwrite_x=True` 时,实现可以以任何方式使用 `x` 引用的内存。这可能包括重用内存作为结果,但这绝不保证。变换后,您不应依赖 `x` 的内容,因为它们可能会在未来发生更改而恕不另行通知。

`workers` 参数指定将 FFT 计算分割成的最大并行作业数。这将执行 `x` 中的独立一维 FFT。因此,`x` 必须至少为二维,并且非变换轴必须足够大才能分割成块。如果 `x` 太小,使用的作业数可能少于请求的数量。

数组 API 标准支持

fft 除了 NumPy 之外,还对符合 Python Array API 标准的后端提供了实验性支持。请考虑通过设置环境变量 `SCIPY_ARRAY_API=1` 并提供 CuPy、PyTorch、JAX 或 Dask 数组作为数组参数来测试这些功能。支持以下后端和设备(或其他功能)的组合。

CPU

GPU

NumPy

不适用

CuPy

不适用

PyTorch

JAX

Dask

⚠️ 计算图

不适用

有关更多信息,请参阅 对数组 API 标准的支持

参考文献

[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 是厄米对称的,即实部对称,虚部反对称。

>>> 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