Мне нужно было расставить приоритеты по другим вещам, поэтому, хотя я действительно написал код, мне не удалось написать об этом. Во всяком случае…

Я еще не реализовал настоящий алгоритм, надеюсь, я сделаю это завтра или на Пасху. Я занимаюсь двумя вещами: визуализацией и рефакторингом. Давайте сначала избавимся от скучной части (рефакторинга), а затем посмотрим на визуализацию и проблемы, которые у меня были с ней.

Рефакторинг был очень негламурным. Я поместил настройку задачи в отдельный класс и написал несколько функций класса для ее построения, применения апертуры и т.д. и т.п. Это сократило основную программу до следующего:

import ProblemSetup
ps = ProblemSetup.ProblemSetup()

Здесь ProblemSetup — это класс, содержащий, как вы уже догадались, установку проблемы.

Класс выглядит следующим образом. Для ясности я удалил почти весь код, так как вы можете найти подробности в предыдущих сообщениях в блоге. Здесь я хочу показать структуру.

import numpy as np
import matplotlib.pyplot as plt
import dcolor
class ProblemSetup:
    def __init__(self, n=100, aperture_form="circle", aperture_size=10, plot=True):
        self._n = n
        self._aperture_form = "circle"
        self._aperture_size = 10
        self._plot = True
        # Set up for plotting of dcolor image
        self.dc = dcolor.dcolor()
        ## Create aperture
        ... see earlier blog post ...
        
        self._start_guess = np.random.randn(n, n)
        if self._plot:
            self.plot_setup()
def apply_aperture(self, matrix):
    return np.multiply(matrix, self._aperture)
def apply_fft(self, matrix):
    return np.fft.fftshift(np.fft.fft2(matrix))
def plot_setup(self):
    ... plotting stuff ...

Не то, чтобы фантазии, но это работает.

Но теперь к приятной части! Визуализация. До сих пор я наносил на график величину БПФ, но на самом деле нам нужна фаза волны. В конце концов, это называется задачей фазовой реконструкции.

Существует способ красивого построения сложных функций и матриц, который заключается в использовании раскраски предметной области. Это создает красочные и информативные изображения, поэтому я решил попробовать! И я нашел библиотеку python и для этого, так что же может пойти не так?

Ну, видимо много, и что еще хуже: проблему я так и не решил. Я внес небольшие изменения в код библиотеки dcolor, чтобы она могла принимать комплекснозначные матрицы, а затем построил график, надеясь получить красивый график волны.

И я получил один! Вроде…

Это не должно так выглядеть. Почему-то фаза сильно меняется от одного пикселя к другому.

То же самое происходит со случайным стартовым предположением.

Много чего перепробовал, ничего полезного не дало. Пока я не изменил размер изображения туда и обратно. И внезапно!

Мне кажется, что происходит какое-то сглаживание. На данный момент я не совсем уверен, является ли это проблемой алиасинга или алиасинг решил проблему. Надо будет посмотреть на это в ближайшие дни. Этот график не нужен для алгоритма, его лучше иметь.

В любом случае, я продолжу завтра, и, надеюсь, к тому времени проблема с алиасингом решится сама собой…