fft - FFT - 在python中,IFFT返回什么?

我需要一个复合数组的逆傅里叶变换,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])



时间:

虚数部分的结果是浮点精度数的计算误差。如果它非常小,它就可以被丢弃。

Numpy hasfunction 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

如果虚数部分接近零,你可以放弃它:


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



你可以这样测试:


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



...