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` 的最后一个轴。
另请参阅
附注
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()