在MATLAB中的numpy与FFT中的FFT不具有相同的结果

arc*_*pus 6 python matlab numpy fft

我有一个复数的向量(可以在这里找到),包括Python和MATLAB.我计算ifft与-transformation

ifft(<vector>) 
Run Code Online (Sandbox Code Playgroud)

在MATLAB和

np.fft.ifft(<vector>)
Run Code Online (Sandbox Code Playgroud)

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

ray*_*ica 7

实际上,它们是相同的,但Python正在以极高的精度显示虚构部分.假想的组件显示的数值大约为10^{-12}.

以下是我在MATLAB中重建问题所写的内容:

format long g;
data = importdata('data.txt');
out = ifft(data);
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

因为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)
Run Code Online (Sandbox Code Playgroud)

当您打开文件时,调用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])
Run Code Online (Sandbox Code Playgroud)

正如你所看到的那样,真实部分是相同的,但虚部仍然存在.但是,请注意虚部的幅度有多小.在这种情况下,MATLAB选择不显示虚部,因为它们的幅度非常小.实际上,从ifftMATLAB中的调用返回的数据类型是真实的,所以在ifft被调用以丢弃这些虚构的组件之后可能会有一些后处理. numpy顺便说一下,你不会做同样的事情,但你可能会认为这些组件非常小而且微不足道.


总而言之,ifftPython和MATLAB中的两个调用基本上是相同的,但是虚构的组件在Python/numpy返回那些虚构组件的意义上是不同的,即使它们是无关紧要的,而ifftMATLAB中的调用则不然.另请注意,您需要确保替换了虚构变量,j并且不能i像在您提供的原始文本文件中那样使用.如果你知道了一定的输出类型应该是真实的,你也可以通过给调用降虚部numpy.realifft结果,如果你愿意的话.