SciPy 模块scipy.fft
是numpy.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 维逆离散傅里叶变换。 |
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 的逆。 |
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.fft
将 float32
和 complex64
数组分别提升为 float64
和 complex128
数组。对于不提升输入数组的 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 章。剑桥大学出版社,剑桥,英国。
例如, 请参见各种函数。
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 维离散傅立叶逆变换。 |
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 的逆。 |
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.fft
将 float32
和 complex64
数组提升为分别的 float64
和 complex128
数组。对于不提升输入数组的 FFT 实现,请参阅 scipy.fftpack
.
参数norm
指示了一对直接/逆变换的哪个方向被缩放以及使用什么归一化因子。默认的归一化("backward"
)使得直接(正向)变换未缩放,而逆(反向)变换则按 (1/n) 缩放。通过将关键字参数norm
设置为"ortho"
,可以获得幺正变换,这样直接和逆变换都按 (1/\sqrt{n}) 缩放。最后,将关键字参数norm
设置为"forward"
将使直接变换按 (1/n) 缩放,而逆变换不进行缩放(即与默认的"backward"
完全相反)。None 是默认选项"backward"
的一个别名,用于向后兼容性。
当输入纯粹为实数时,其变换是 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. 剑桥大学出版社, 剑桥, 英国.
有关例子,请参见各种函数。