Skip to content

Latest commit

 

History

History
197 lines (117 loc) · 13.3 KB

np126_0494.md

File metadata and controls

197 lines (117 loc) · 13.3 KB

离散傅里叶变换(numpy.fft

原文:numpy.org/doc/1.26/reference/routines.fft.html

SciPy 模块scipy.fftnumpy.fft的更全面的超集,包括了一个基本的例程。

标准 FFT

fft(a[, n, axis, norm]) 计算一维离散傅里叶变换。
ifft(a[, n, axis, norm]) 计算一维逆离散傅里叶变换。
fft2(a[, s, axes, norm]) 计算二维离散傅里叶变换。
ifft2(a[, s, axes, norm]) 计算二维逆离散傅里叶变换。
fftn(a[, s, axes, norm]) 计算 N 维离散傅里叶变换。
ifftn(a[, s, axes, norm]) 计算 N 维逆离散傅里叶变换。

实 FFT

rfft(a[, n, axis, norm]) 为实输入计算一维离散傅里叶变换。
irfft(a[, n, axis, norm]) 计算rfft的逆。
rfft2(a[, s, axes, norm]) 计算实数组的二维 FFT。
irfft2(a[, s, axes, norm]) 计算rfft2的逆。
rfftn(a[, s, axes, norm]) 为实输入计算 N 维离散傅里叶变换。
irfftn(a[, s, axes, norm]) 计算rfftn的逆。

厄米 FFT

hfft(a[, n, axis, norm]) 计算具有厄米对称性的信号的 FFT,即实谱。
ihfft(a[, n, axis, norm]) 计算具有厄米对称性的信号的逆 FFT。

辅助例程

fftfreq(n[, d]) 返回离散傅里叶变换的采样频率。
rfftfreq(n[, d]) 返回离散傅里叶变换的采样频率(在与 rfft、irfft 一起使用时)。
fftshift(x[, axes]) 将零频率分量移至频谱的中心。
ifftshift(x[, axes]) fftshift的反函数。

背景信息

傅里叶分析基本上是一种将函数表示为周期性分量之和,并从这些分量中恢复函数的方法。当函数及其傅里叶变换都被替换为离散化的对应物时,就称为离散傅里叶变换(DFT)。DFT 在数值计算中已经成为一种主要方法,部分原因是计算 DFT 的一个非常快速的算法,称为快速傅里叶变换(FFT),这个算法早在高斯(1805 年)之前就被知晓,并由库利和图基以其当前形式公之于众[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.]

它与正向变换的指数参数的符号不同,以及默认标准化为 (\frac{1}{n})。

类型提升

numpy.fftfloat32complex64 数组分别提升为 float64complex128 数组。对于不提升输入数组的 FFT 实现,请参见scipy.fftpack

标准化

参数norm表示直接/反向变换对的方向和标准化因子。默认的标准化("backward")使得直接(正向)变换不经缩放,而反向(逆向)变换经缩放 (\frac{1}{n})。可以通过将关键字参数norm设置为"ortho"获得单位变换,从而使得直接和逆向变换都经缩放 (\frac{1}{\sqrt{n}})。最后,通过将关键字参数norm设置为"forward",使得直接变换经缩放 (\frac{1}{n}),而逆向变换不经缩放(即与默认的"backward"完全相反)。对于向后兼容性,*None*是默认选项"backward"的别名。

实部和厄米变换

当输入是纯实数时,其变换是埃尔米特的,即频率(f_k)处的分量是频率(-f_k)处分量的复共轭,这意味着对于实数输入,负频率分量中没有任何来自正频率分量中不可从中获取的信息。rfft 函数族旨在对实数输入进行操作,并且通过仅计算正频率分量(包括奈奎斯特频率)利用了此对称性。因此,n输入点会产生n/2+1个复数输出点。这个函数族的逆假设了其输入的对称性,并且对于n个点的输出使用n/2+1个输入点。

相应地,当频谱是纯实时,信号是埃尔米特的。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., and John W. Tukey, 1965, “The Fast Fourier Transform,” Math. Comput. 19: 297-301.

[NR]

Press, W., Teukolsky, S., Vetterline, W.T., and Flannery, B.P., 2007, Numerical Recipes: The Art of Scientific Computing, 第 12-13 章。剑桥大学出版社,剑桥,英国。

例子

例如, 请参见各种函数。

标准 FFTs

fft(a[, n, axis, norm]) 计算一维离散傅立叶变换。
ifft(a[, n, axis, norm]) 计算一维离散傅立叶逆变换。
fft2(a[, s, axes, norm]) 计算二维离散傅立叶变换。
ifft2(a[, s, axes, norm]) 计算二维离散傅立叶逆变换。
fftn(a[, s, axes, norm]) 计算 N 维离散傅立叶变换。
ifftn(a[, s, axes, norm]) 计算 N 维离散傅立叶逆变换。

实数 FFT

rfft(a[, n, axis, norm]) 为实输入计算一维离散傅立叶变换。
irfft(a[, n, axis, norm]) 计算rfft的逆。
rfft2(a[, s, axes, norm]) 计算实数组的二维 FFT。
irfft2(a[, s, axes, norm]) 计算rfft2的逆。
rfftn(a[, s, axes, norm]) 为实输入计算 N 维离散傅立叶变换。
irfftn(a[, s, axes, norm]) 计算rfftn的逆。

共轭对称 FFT

hfft(a[, n, axis, norm]) 计算具有共轭对称性的信号的 FFT,即实谱。
ihfft(a[, n, axis, norm]) 计算具有共轭对称性的信号的逆 FFT。

辅助程序

fftfreq(n[, d]) 返回离散傅立叶变换的采样频率。
rfftfreq(n[, d]) 返回离散傅立叶变换的采样频率(用于 rfft、irfft)。
fftshift(x[, axes]) 将零频率分量移至频谱的中心。
ifftshift(x[, axes]) fftshift的逆。

背景信息

傅里叶分析基本上是一种将函数表示为周期分量之和的方法,并从这些分量中恢复函数。当函数和它的傅里叶变换都用离散化的对应物代替时,它被称为离散傅里叶变换 (DFT)。DFT 已成为数值计算的主要工具之一,部分原因是有一个非常快的计算算法,叫做快速傅里叶变换 (FFT),它在高斯时期 (1805 年) 就被知晓,并在目前的形式中由库利和图基 [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, Numerical Recipes: The Art of Scientific Computing, ch. 12-13. 剑桥大学出版社, 剑桥, 英国.

例子

有关例子,请参见各种函数。