2016-05-12 287 views
5

在Python和MATLAB中,我有一個具有複數的向量(可以找到here)。我計算ifft -transformation與numpy中的FFT與MATLAB中的FFT沒有相同的結果

ifft(<vector>) 
在MATLAB

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

。我的問題是,我得到了兩個完全不同的結果,即Python中的矢量很複雜,但它不在MATLAB中。雖然MATLAB中的某些組件是零,但是Python中沒有一個組件。這是爲什麼? fft -version按預期工作。最小值約爲1e-10,即不是太低。

回答

7

實際上,它們是一樣的,但是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和我們一樣與MATLAB版本看到顯示反演結果的前10個元素,我們得到:

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。如果你知道某些,輸出類型應該是真實的,你也可以通過給掉話虛組件numpy.realifft的結果,如果你願意的話。

+1

aaahhh ray正在射線。做得好! –

+0

嗯,現在很奇怪,因爲當我在代碼執行的IFFT-功能的數據看起來完全不同。我必須深入... –

+0

@arc_lupus您究竟如何加載Python中的數據?你要做的工作少量得到它,這樣給你的數據讀入一個複雜的'numpy'陣列中的數據是成功的......基本上是我上面那樣通過將所有'i'到'j'。 – rayryeng