У меня есть только частичный ответ.
Если вы внимательно посмотрите, цвета на синусоидальном изображении, сгенерированном с помощью кода Python, и цвета, сгенерированного с помощью кода Matlab, который вы связали, имеют инвертированный цвет (проверьте цвета полос ближе к краям и цвета нацветная полоса).
Это объясняет, почему у вас есть инвертированные цвета на графике FFT, и может быть, поэтому вы получили 3 Гц вместо -3 Гц. К сожалению, сейчас у меня нет доступа к компьютеру с Python, и я не смогу это проверить. Я думаю, это может быть хорошей идеей для начала поиска неисправностей.
РЕДАКТИРОВАТЬ:
Да, вы правы. Я полностью пропустил flipud
в сценарии Matlab. Я не думаю, что ваш c
расчет неверен. Самый простой способ проверить это - сохранить данные Matlab и импортировать их в Python.
В Matlab:
save('data.mat', 'im')
Затем импортировать их в Python, используя scipy
:
im_matlab = scipy.io.loadmat('data.mat')['im']
np.all(np.isclose(im_matlab, im))
Если последняя строка дает вам True
, то это означает, что вычисления верны.
О графике, imshow
предполагает, что источник (0-й индекс массива numpy)это верхний левый угол, который является нормой для изображений. Вы можете изменить это, используя ключевое слово origin='lower'
в plt.imshow
.
О fftshift
, я думаю этот ответ на другой вопрос StackOverflow - это то, что вам нужно.