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

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

 ifft(<vector>) 

в MATLAB и с

 np.fft.ifft(<vector>) 

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

One Solution collect form web for “FFT в numpy vs FFT в MATLAB не имеют одинаковых результатов”

На самом деле, они одинаковы, но 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 если вы этого пожелаете.

  • Как скопировать данные из массива numpy в другой
  • Почему numpy массивы не могут конвертировать из datetime в np.datetime64 неявно?
  • Поиск минимального значения в массиве numpy и соответствующих значений для остальной части строки этого массива
  • Что такое numpy эквивалент zip (*) python?
  • Имейте указатель на данные. Нужен массив Numpy в порядке Fortran. Хотите использовать Cython
  • Найти и заменить несколько значений в python
  • Python scipy - указать произвольное дискретное распределение
  • Как добавить строки и столбцы в массив NUMPY?
  •  
    Interesting Posts for Van-Lav

    В Django, как проверить, находится ли пользователь в определенной группе?

    Как закрепить полярный участок в pylab / pyplot

    Джанго Нос, как написать этот тест?

    Как удалить элемент из списка, итерации его в Python?

    Приближение данных с многосегментной кубической кривой безье и расстоянием, а также с учетом кривизны

    Преобразование массива numpy в массив numpy

    Зачем мне нужно развертывать приложение по умолчанию, прежде чем я смогу развернуть несколько сервисов в GCP?

    Как использовать Matlab's imresize в python

    Возможно форматировать список без * Магии?

    Понимание понимания списков

    изменить элемент списка со списком в python

    Окно PyQT: я хочу запомнить место, в котором оно было закрыто:

    Tensorflow: ошибка подачи корма: вы должны подать значение для тензора заполнителя

    Экранирование строк JavaScript в Python

    Если я использую QT для Windows, мое приложение будет отлично работать на Linux / Mac / Windows?

    Python - лучший язык программирования в мире.