在numpy中的FFT和MATLAB中的FFT结果不同

8

我有一个包含复数的向量 (可以在 这里 找到),分别在 Python 和 MATLAB 中使用。我正在使用以下代码来计算 ifft 变换:

ifft(<vector>) 

使用MATLAB进行技术开发

np.fft.ifft(<vector>)

在 Python 中进行向量处理,我遇到的问题是得出两个完全不同的结果,即在 Python 中向量是复数,而在 MATLAB 中不是。虽然 MATLAB 中的一些组件为零,但在 Python 中却没有。为什么会这样呢?使用 fft 版本可以达到预期效果。最小值约为 1e-10,即不太低。

1个回答

9

实际上,它们是相同的,但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并显示反转结果的前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选择不显示虚部,因为它们的幅度非常小。 实际上,在 MATLAB 中从 ifft 调用返回的数据类型是实数,因此在调用 ifft 后可能进行了某些后处理以丢弃这些虚部。 顺便说一句,numpy 不会做同样的事情,但您可以将这些组件视为非常小和无关紧要。
总之,Python 和 MATLAB 中的 ifft 调用本质上是相同的,但虚部是不同的,因为 Python/numpy 返回那些虚部,即使它们是微不足道的,而 MATLAB 中的 ifft 调用则不会返回虚部。 还请注意,您需要确保用 j 替换虚变量,并且不能像原始文本文件中提供的那样使用 i。 如果您确定输出类型应为实数,则如果愿意,也可以通过对 ifft 结果调用 numpy.real 来删除虚部。

1
啊啊啊,雷太有雷了。干得好! - Ander Biguri
嗯,这很奇怪,因为在我的代码中执行ifft函数的数据看起来完全不同。我需要深入研究一下... - arc_lupus
@arc_lupus 你在 Python 中如何加载数据的?你需要做一些工作,以便成功地将数据读入复杂的 numpy 数组中,基本上就像我上面所做的那样,将所有的 i 转换为 j - rayryeng
我用Python和Matlab生成了数据,并将它们写入一个文件。在它们完全一致后,我只上传了Matlab文件。两种方法的代码生成是相同的。 - arc_lupus
1
@karlphillip 你好!好久不见了!我会看一下的! - rayryeng
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接