在Python和MATLAB中,我都有一个带有复数的向量(可以在此处找到)。我正在计算ifft
-transformation与
ifft(<vector>)
在MATLAB和
np.fft.ifft(<vector>)
在Python中。我的问题是我从中得到两个完全不同的结果,即,虽然Python中的向量很复杂,但MATLAB中却没有。虽然MATLAB中的某些组件为零,但Python中没有。这是为什么?在fft
按预期-version工作。最小值约为1e-10
,即不要太低。
实际上,它们是相同的,但是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选择不显示虚部,因为它们的大小非常小。实际上,从ifft
MATLAB中的调用返回的数据类型是真实的,因此在调用后可能会进行一些后处理ifft
以丢弃这些虚构的分量。numpy
顺便说一句,它们并没有做相同的事情,但是您最好将这些组件视为很小且无关紧要的。
总而言之,ifft
Python和MATLAB中的调用本质上是相同的,但是虚构组件在某种意义上是不同的,即Python /numpy
返回了这些虚构组件,尽管它们ifft
在MATLAB中的调用并不重要。另外请注意,您需要确保将虚数变量替换为,j
并且不能i
像在提供的原始文本文件中那样使用。如果你知道了一定的输出类型应该是真实的,你也可以通过给调用降虚部numpy.real
的ifft
结果,如果你愿意的话。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句