实际上,它们是相同的,但 Python 以极高的精度显示虚部。虚部显示的值大小约为10^{-12}
.
以下是我在 MATLAB 中重构您的问题所写的内容:
format long g;
data = importdata('data.txt');
out = ifft(data);
format long g;
是一个格式选项,可显示更多有效数字,其中我们显示 15 位有效数字(包括小数位)。
当我显示逆 FFT 输出的前 10 个元素时,我得到的是:
>> out(1:10)
ans =
-6.08077329443768
-5.90538963023573
-5.72145198564976
-5.53037208039314
-5.33360059559345
-5.13261402212083
-4.92890104744583
-4.72394865937531
-4.51922820694745
-4.31618153490126
For numpy
,请注意,复数是用j
信,不是i
。因此,当您加载文本时,您must转变所有i
字符到j
。完成此操作后,您可以正常加载数据:
In [15]: import numpy as np
In [16]: with open('data.txt', 'r') as f:
....: lines = map(lambda x: x.replace('i', 'j'), f)
....: data = np.loadtxt(lines, dtype=np.complex)
当您打开文件时,会调用map
因此将获取文件的内容并转换每个i
字符进入j
并返回一个字符串列表,其中该列表中的每个元素都是文本文件中的复数,其中i
替换为j
。然后我们会打电话numpy.loadtxt
函数将这些字符串转换为复数数组。
现在,当我进行 IFFT 并显示反转结果的前 10 个元素时,正如我们在 MATLAB 版本中看到的那样,我们得到:
In [20]: out = np.fft.ifft(data)
In [21]: out[:10]
Out[21]:
array([-6.08077329 +0.00000000e+00j, -5.90538963 +8.25472974e-12j,
-5.72145199 +3.56159535e-12j, -5.53037208 -1.21875843e-11j,
-5.33360060 +1.77529105e-11j, -5.13261402 -1.58326676e-11j,
-4.92890105 -6.13731196e-12j, -4.72394866 +5.46673985e-12j,
-4.51922821 -2.59774424e-11j, -4.31618154 -1.77484689e-11j])
正如您所看到的,实部是相同的,但虚部仍然存在。但是,请注意虚部的大小有多小。在这种情况下,MATLAB 选择不显示虚部,因为它们的幅值非常小。实际上,从返回的数据类型ifft
MATLAB 中的调用是真实的,因此之后可能有一些后处理ifft
被要求丢弃这些虚构的成分。numpy
顺便说一句,它并没有做同样的事情,但您不妨认为这些组件非常小且微不足道。
总而言之,两者ifft
Python 和 MATLAB 中的调用本质上是相同的,但虚部在 Python/numpy
返回那些虚部,即使它们微不足道,因为ifft
在 MATLAB 中调用则不然。另请注意,您需要确保将虚数变量替换为j
你不能使用i
如您提供的原始文本文件中所示。如果你知道的话对于某些输出类型应该是真实的,您还可以通过调用来删除虚部numpy.real
on the ifft
如果你愿意的话。