fft#
- scipy.fftpack.fft(x, n=None, axis=-1, overwrite_x=False)[源]#
返回实数或复数序列的离散傅里叶变换。
返回的复数数组包含
y(0), y(1),..., y(n-1)
,其中y(j) = (x * exp(-2*pi*sqrt(-1)*j*np.arange(n)/n)).sum()
.- 参数:
- x类数组
要进行傅里叶变换的数组。
- nint, 可选
傅里叶变换的长度。如果
n < x.shape[axis]
,则 x 会被截断。如果n > x.shape[axis]
,则 x 会被零填充。默认情况下,结果是n = x.shape[axis]
。- axisint, 可选
计算 FFT 的轴;默认是在最后一个轴上(即
axis=-1
)。- overwrite_xbool, 可选
如果为 True,x 的内容可能会被破坏;默认值为 False。
- 返回:
- z复数 ndarray
包含元素
[y(0),y(1),..,y(n/2),y(1-n/2),...,y(-1)] if n is even [y(0),y(1),..,y((n-1)/2),y(-(n-1)/2),...,y(-1)] if n is odd
其中
y(j) = sum[k=0..n-1] x[k] * exp(-sqrt(-1)*j*k* 2*pi/n), j = 0..n-1
注释
结果的打包方式是“标准”的:如果
A = fft(a, n)
,那么A[0]
包含零频率项,A[1:n/2]
包含正频率项,A[n/2:]
包含负频率项,按负频率递减的顺序排列。因此,对于 8 点变换,结果的频率是 [0, 1, 2, 3, -4, -3, -2, -1]。要重新排列 FFT 输出,使零频率分量居中,如 [-4, -3, -2, -1, 0, 1, 2, 3],请使用fftshift
。单精度和双精度例程均已实现。半精度输入将被转换为单精度。非浮点输入将被转换为双精度。不支持长双精度输入。
当 n 是 2 的幂时,此函数效率最高;当 n 是素数时,效率最低。
请注意,如果
x
是实数值,则A[j] == A[n-j].conjugate()
。如果x
是实数值且n
是偶数,则A[n/2]
是实数。如果 x 的数据类型是实数,将自动使用“实数 FFT”算法,这大约可将计算时间减半。为了进一步提高效率,请使用
rfft
,它执行相同的计算,但只输出对称频谱的一半。如果数据既是实数又是对称的,则dct
可以通过从信号的一半生成一半频谱来再次将效率提高一倍。示例
>>> import numpy as np >>> from scipy.fftpack import fft, ifft >>> x = np.arange(5) >>> np.allclose(fft(ifft(x)), x, atol=1e-15) # within numerical accuracy. True