我需要复杂数组的傅立叶逆变换。 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])
答案 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_close
与R2RT'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.]