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

时间:2016-05-12 14:55:42

标签: python matlab numpy fft

我有一个复数的向量(可以找到here),在Python和MATLAB中都有。我正在使用

计算ifft - 转换
ifft(<vector>) 

在MATLAB中和

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

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

1 个答案:

答案 0 :(得分:7)

实际上,它们是相同的,但Python正在以极高的精度显示虚部。假想的组件显示的值大约为NSMutableURLRequest* request = [[NSMutableURLRequest alloc] initWithURL:url]; [request setValue:@"application/json" forHTTPHeaderField:@"Content-Type"]; [request setHTTPMethod:@"POST"]; [request setHTTPBody:jsonData]; RKResponseDescriptor *responseDescriptor = [RKResponseDescriptor responseDescriptorWithMapping: [LoginResponse getResponseMapping] method:RKRequestMethodPOST pathPattern:nil keyPath:@"OutputParameters" statusCodes:RKStatusCodeIndexSetForClass(RKStatusCodeClassSuccessful)]; RKObjectRequestOperation *operation = [[RKObjectRequestOperation alloc]initWithRequest:request responseDescriptors:@[responseDescriptor]];

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

10^{-12}

format long g; data = importdata('data.txt'); out = ifft(data); 是一个格式化选项,可显示更多有效数字,其中我们显示15位有效数字,包括小数位。

当我显示逆FFT输出的前10个元素时,这就是我得到的:

format long g;

对于>> 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函数将这些字符串转换为复数数组。

现在当我拿着IFFT并显示反转结果的前10个元素时,我们看到了MATLAB版本,我们得到:

numpy.loadtxt

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

总而言之,Python和MATLAB中的numpy调用基本相同,但虚构的组件在Python / ifft返回那些虚构组件的意义上是不同的,即使它们是无关紧要的MATLAB中的numpy调用没有。另请注意,您需要确保将虚构变量替换为ifft,并且不能像您提供的原始文本文件那样使用j。如果你知道某些输出类型应该是真实的,那么你也可以通过在i结果上调用numpy.real来删除虚构的组件。