IFFT在Python中返回什么?

Sat*_*yan 4 python fft

我需要复杂数组的傅立叶逆变换。ifft应该返回一个实数组,但它返回另一个复杂数组。

在MATLAB中 a=ifft(fft(a)),但是在Python中,它不能那样工作。

a = np.arange(6)
m = ifft(fft(a))
m # Google says m should = a, but m is complex
Run Code Online (Sandbox Code Playgroud)

输出:

array([0.+0.00000000e+00j, 1.+3.70074342e-16j, 2.+0.00000000e+00j,
       3.-5.68396583e-17j, 4.+0.00000000e+00j, 5.-3.13234683e-16j])
Run Code Online (Sandbox Code Playgroud)

R2R*_*ica 8

虚部是结果浮动精度数计算误差。如果很小,则可以将其丢弃。

Numpy具有内置功能real_if_close,可以这样做:

>>> np.real_if_close(np.fft.ifft(np.fft.fft(a)))
array([0., 1., 2., 3., 4., 5.])
Run Code Online (Sandbox Code Playgroud)

您可以在此处阅读有关浮动系统限制的信息:https : //docs.python.org/3.8/tutorial/floatingpoint.html

  • 我刚刚了解了这个答案的“real_if_close”,因为我假设“numpy”必须支持它:) (3认同)
  • 哦,这比我的回答更好! (2认同)

hir*_*ist 5

如果虚部接近于零,你可以丢弃它:

import numpy as np

arr = np.array(
    [
        0.0 + 0.00000000e00j,
        1.0 + 3.70074342e-16j,
        2.0 + 0.00000000e00j,
        3.0 - 5.68396583e-17j,
        4.0 + 0.00000000e00j,
        5.0 - 3.13234683e-16j,
    ]
)

if all(np.isclose(arr.imag, 0)):
    arr = arr.real
# [ 0.  1.  2.  3.  4.  5.]
Run Code Online (Sandbox Code Playgroud)

(这就是R2RT 的答案real_if_close中一行的作用)。