将Matlab代码转换为Python - FFT

时间:2018-05-07 22:12:28

标签: python matlab numpy fft

我需要将一段MATLAB代码转换为Python,而且两者都不好。 MATLAB中的代码使用fftfftshift。我试图在Python中使用NumPy。代码运行但是当我比较结果时它们不匹配。感谢您的帮助。

这是MATLAB代码:

h(1,1:Modes_number) = -1i*S;
hfft = fft(h);
hft0 = fftshift(hfft);

这是我写的Python代码:

h = np.zeros((1,self.cfg.Modes_number+1),dtype=complex) 
for i in range(0, self.cfg.Modes_number+1):
   h[0,i] = -1j*S;

hfft = np.fft.fft(h)
hft0 = np.fft.fftshift(hfft)

以下是SModes_number的值:

S = 12.5022214424;
Modes_number = 200;

这也是我在MATLAB和Python中得到的结果的一个例子:

MATLAB:
hfft(1,1)
ans =
   1.1857e-13 - 2.5129e+03i

Python:
hfft[0]
0. -2.52544873e+03j

干杯。

1 个答案:

答案 0 :(得分:0)

Python代码中的错误是您将h定义为大小为Modes_number+1,这比MATLAB代码中的大小多一个。 hfft中的第一个值是所有输入值的总和。在MATLAB中,这是-1j*S*200 = -2500.4j,在您的Python代码中,这是-1j*S*201 = -2512.9j。这些是您所看到的值。

这段Python代码产生与你的MATLAB代码相同,达到数值精度(我在Python中看到一些像-1.68388521e-15 +6.55829989e-15j这样的值,它们被MATLAB的算法强制为0)。我正在创建h作为一维向量,而不是一维尺寸为1的二维数组。

import numpy as np

S = 12.5022214424
Modes_number = 200
h = np.zeros(Modes_number,dtype=complex)
for i in range(0,Modes_number):
   h[i] = -1j*S;
hfft = np.fft.fft(h)
hft0 = np.fft.fftshift(hfft)

的Python:

>>> hfft[0]
-2500.4442884800001j

MATLAB:

>> hfft(1)
ans = 
   0.000000000000000e+00 - 2.500444288480000e+03i`