FFT в numpy vs FFT в MATLAB не имеют одинаковых результатов

У меня есть вектор с комплексными числами (можно найти здесь ), как в Python, так и в MATLAB. Я вычисляю ifft преобразование с помощью

 ifft(<vector>) 

в MATLAB и с

 np.fft.ifft(<vector>) 

в Python. Моя проблема заключается в том, что я получаю два совершенно разных результата, т. Е. В то время как вектор в Python является сложным, это не в MATLAB. Хотя некоторые компоненты в MATLAB равны нулю, ни один из них не находится в Python. Почему это? fft -версия работает по назначению. Минимальные значения составляют около 1e-10 , т.е. не слишком низкие.

На самом деле, они одинаковы, но Python демонстрирует воображаемую часть с чрезвычайно высокой точностью. Показаны мнимые компоненты со значениями величиной около 10^{-12} .

Вот что я написал для восстановления вашей проблемы в MATLAB:

 format long g; data = importdata('data.txt'); out = ifft(data); 

format long g; это опция форматирования, которая показывает вам более значимые цифры, где мы показываем 15 значащих цифр, включая десятичные разряды.

Когда я показываю первые 10 элементов обратного выхода FFT, это то, что я получаю:

 >> 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 , что для numpy следует 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 решил не отображать мнимые компоненты, потому что их величины очень малы. Фактически, тип данных, возвращаемый из вызова ifft в MATLAB, является реальным, поэтому, вероятно, была некоторая пост-обработка после того, как ifft был вызван, чтобы отбросить эти мнимые компоненты. numpy не делает то же самое, кстати, но вы можете также считать эти компоненты очень маленькими и несущественными.


В общем, оба вызова ifft в Python и MATLAB по существу одинаковы, но мнимые компоненты различаются в том смысле, что Python / numpy возвращает эти мнимые компоненты, даже если они несущественны, поскольку в случае, когда вызов ifft в MATLAB этого не делает. Также обратите внимание, что вам нужно убедиться, что мнимая переменная заменена на j и вы не можете использовать i как в исходном текстовом файле, который вы предоставили. Если вы точно знаете, что тип вывода должен быть реальным, вы также можете отказаться от мнимых компонентов, предоставив вызов numpy.real по результату numpy.real если вы этого пожелаете.