IFFT在Python中返回什么?

时间:2019-05-23 09:28:53

标签: 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

输出:

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

4 个答案:

答案 0 :(得分:6)

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

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

>>> np.real_if_close(np.fft.ifft(np.fft.fft(a)))
array([0., 1., 2., 3., 4., 5.])

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

答案 1 :(得分:3)

如果虚部接近零,则可以将其丢弃:

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.]

(这就是real_if_closeR2RT's answer一样在一行中所做的事情)。

答案 2 :(得分:2)

您在“ Ifft应该返回实数数组”中弄错了。如果您要获得实值输出(即,您拥有大量的实际数据,现在想执行ifft),则应使用irfft

请参见the docs中的示例:

>>> np.fft.ifft([1, -1j, -1, 1j])
array([ 0.+0.j,  1.+0.j,  0.+0.j,  0.+0.j])   #Output is complex which is correct
>>> np.fft.irfft([1, -1j, -1])
array([ 0.,  1.,  0.,  0.])   #Output is real valued

答案 3 :(得分:1)

您可以这样测试:

import numpy as np
from numpy import fft
a = np.arange(6)
print(a)
f = np.fft.fft(a)
print(f)
m = np.fft.ifft(f)
print(m)

[0 1 2 3 4 5]
[15.+0.j         -3.+5.19615242j -3.+1.73205081j -3.+0.j
 -3.-1.73205081j -3.-5.19615242j]
[0.+0.j 1.+0.j 2.+0.j 3.+0.j 4.+0.j 5.+0.j]

要获得真正的零件,您可以使用:

print(m.real) # [0. 1. 2. 3. 4. 5.]