2016-05-12 85 views
5

在Python和MATLAB中,我有一个具有复数的向量(可以找到here)。我计算ifft -transformation与numpy中的FFT与MATLAB中的FFT没有相同的结果

ifft(<vector>) 
在MATLAB

np.fft.ifft(<vector>) 
在Python

。我的问题是,我得到了两个完全不同的结果,即Python中的矢量很复杂,但它不在MATLAB中。虽然MATLAB中的某些组件是零,但是Python中没有一个组件。这是为什么? fft -version按预期工作。最小值约为1e-10,即不是太低。

回答

7

实际上,它们是一样的,但是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 

对于numpy,注意,复数与j信,不i读入。因此,当您在文本中加载时,您必须必须将所有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和我们一样与MATLAB版本看到显示反演结果的前10个元素,我们得到:

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选择不显示虚部,因为它们的大小非常小。实际上,在MATLAB中调用ifft返回的数据类型是真实的,因此在调用ifft以放弃这些虚构组件后可能会进行一些后处理。 numpy不会做同样的事情,但你也可以考虑这些组件是非常小的和微不足道的。


总而言之,Python和MATLAB两个ifft电话基本上是相同的,但虚构的成分,在这个意义不同了Python/numpy回报那些虚的组件,即使他们是微不足道的,其中作为ifft通话MATLAB没有。另外请注意,您需要确保假想变量被替换为j,并且不能像您在原始文本文件中那样使用i。如果你知道某些,输出类型应该是真实的,你也可以通过给掉话虚组件numpy.realifft的结果,如果你愿意的话。

+1

aaahhh ray正在射线。做得好! –

+0

嗯,现在很奇怪,因为当我在代码执行的IFFT-功能的数据看起来完全不同。我必须深入... –

+0

@arc_lupus您究竟如何加载Python中的数据?你要做的工作少量得到它,这样给你的数据读入一个复杂的'numpy'阵列中的数据是成功的......基本上是我上面那样通过将所有'i'到'j'。 – rayryeng