Преобразование кода Matlab в Python - FFT - PullRequest
0 голосов
/ 08 мая 2018

Мне нужно преобразовать часть кода MATLAB в Python, и я плохо умею в обоих случаях. Код в MATLAB использует fft и fftshift. Я пытался использовать NumPy в Python. Код работает, но когда я сравниваю результат, они не совпадают. Я ценю вашу помощь.

Вот код 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)

Вот значения для S и Modes_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 голосов
/ 15 мая 2018

Ошибка в вашем коде Python заключается в том, что вы определяете h как размер Modes_number+1, что на единицу больше, чем размер в коде MATLAB. Первое значение в hfft является суммой всех входных значений. В MATLAB это -1j*S*200 = -2500.4j, а в вашем коде Python это -1j*S*201 = -2512.9j. Это те значения, которые вы видите.

Этот бит кода Python производит то же самое, что и ваш бит кода MATLAB, с точностью до числовой (я вижу некоторые значения, такие как -1.68388521e-15 +6.55829989e-15j в Python, которые принудительно устанавливаются в 0 алгоритмами MATLAB). Я создаю 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`
...