【问题标题】:FFT in numpy vs FFT in MATLAB do not have the same resultsnumpy 中的 FFT 与 MATLAB 中的 FFT 没有相同的结果
【发布时间】:2016-09-08 12:07:27
【问题描述】:

我在 Python 和 MATLAB 中都有一个带有复数的向量(可以在 here 找到)。我正在计算ifft-transformation 与

ifft(<vector>) 

在 MATLAB 中和使用

np.fft.ifft(<vector>)

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

【问题讨论】:

    标签: python matlab numpy fft


    【解决方案1】:

    实际上,它们是相同的,但 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 返回这些虚数分量的意义上,虚数分量是不同的,即使它们微不足道,而 ifft在 MATLAB 中调用没有。另请注意,您需要确保将虚变量替换为j,并且不能像在您提供的原始文本文件中那样使用i。如果您确定知道输出类型应该是实数,如果您愿意,还可以通过在ifft 结果上调用numpy.real 来删除虚部。

    【讨论】:

    • aaahhh 射线是射线。干得好!
    • 嗯,现在这很奇怪,因为在我的代码中执行时,ifft 函数的数据看起来完全不同。我必须更深入......
    • @arc_lupus 您究竟是如何在 Python 中加载数据的?您必须做少量工作才能得到它,以便在给定您的数据的情况下成功读入复杂的numpy 数组......基本上就是我上面所做的,将所有i 转换为j。跨度>
    • 我在 python 和 matlab 中生成了数据,并将它们写入一个文件。在它们相同后,我只上传了 matlab 文件。两种方式的代码生成是一样的。
    • @karlphillip 你好!好久没有说话!我去看看!
    猜你喜欢
    • 2022-01-07
    • 2017-11-09
    • 1970-01-01
    • 2015-11-16
    • 1970-01-01
    • 2017-09-28
    • 1970-01-01
    • 2020-08-11
    • 2017-11-10
    相关资源
    最近更新 更多