python fft函数_python scipy fft.fft用法及代码示例

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

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

参数:

x:array_like输入数组,可能很复杂。

n:int, 可选参数输出的转换轴的长度。如果n小于输入的长度,则裁剪输入。如果较大,则输入将填充零。如果未指定n,则使用输入沿由axis指定的轴的长度。

axis:int, 可选参数计算FFT的轴。如果未给出,则使用最后一个轴。

norm:{None, “ortho”}, 可选参数归一化模式。默认值为无,表示对正向变换和按比例缩放不进行标准化1/n在ifft。对于norm="ortho",两个方向均按1/sqrt(n)。

overwrite_x:bool, 可选参数如果为True,则x的内容可以被销毁;默认值为False。有关更多详细信息,请参见下面的注释。

workers:int, 可选参数用于并行计算的最大工人数。如果为负,则值从os.cpu_count()。请参阅下面的更多细节。

返回值:

out:复数ndarray截断的或zero-padded输入,沿axis指示的轴转换,如果未指定axis,则最后一个输入。

异常:

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

注意:

FFT(快速傅立叶变换)是指通过在计算项中使用对称性可以有效地计算离散傅立叶变换(DFT)的方法。当n为2的幂时,对称性最高,因此,对于这些大小,变换效率最高。对于可分解的尺寸,scipy.fft使用Bluestein的算法[2]因此永远不会比O(n日志n)。 zero-padding使用以下输入可以看到进一步的性能改进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]我们达到Nyquist频率并回绕到negative-frequency个项。因此,对于8点变换,结果的频率为[0、1、2、3,-4,-3,-2,-1]。要重新排列fft输出以使zero-frequency组件居中,例如[-4,-3,-2,-1、0、1、2、3],请使用fftshift。

可以单精度,双精度或扩展精度(长双精度)浮点数进行转换。半精度输入将转换为单精度,非浮点输入将转换为双精度。

如果数据类型为x实际上,会自动使用“real FFT”算法,从而将计算时间大致减少了一半。为了进一步提高效率,请使用rfft,它执行相同的计算,但仅输出对称频谱的一半。如果数据既真实又对称,则dct通过从一半信号产生一半频谱,可以再次使效率提高一倍。

当overwrite_x=True被指定时,所引用的内存x该实现可以以任何方式使用。这可能包括为结果重新使用内存,但这绝不能保证。您不应依赖于x转换之后,因为将来可能会更改而不会发出警告。

的workers参数指定将FFT计算拆分为的最大并行作业数。这将在内部执行独立的一维FFTx。所以,x必须至少为二维,并且未变换的轴必须足够大以分裂成块。如果x太小,可能会使用少于要求的作业。

参考文献:

Cooley,James W.和John W. Tukey,1965年,“一种用于复杂傅里叶级数的机器计算的算法”,数学。计算19:297-301。

Bluestein,L.,1970年,“一种用于离散傅里叶变换的线性滤波方法”。 IEEE音频和电声学报。 18(4):451-455。

例子:

>>> import scipy.fft

>>> 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,该FFT是Hermitian的,即在实数部分是对称的,而在虚数部分是anti-symmetric:

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

[, ]

>>> plt.show()

你可能感兴趣的:(python,fft函数)