Численное программное обеспечение для манипулирования световым лучом в его плосковолновом представлении?

Любое световое поле можно представить в виде суммы плоских волн. Такой ансамбль плоских волн называется спектром плоских волн светового поля. Спектр плоской волны представляет собой преобразование Фурье светового поля в реальном пространственном представлении.

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

  • Начните со светового поля в реальном пространстве, скажем, с монохроматическим *-гауссовым лучом.
  • вычислить преобразование Фурье
  • применить некоторую операцию, которая изменяет спектр плоской волны, скажем, границу между двумя средами
  • вычислить обратное преобразование Фурье
  • произвести некоторый вывод, например, график

В вычислительном отношении все, что требуется, — это библиотека для выполнения БПФ. Я ищу структуру, которая бы обернула это вместе с некоторыми физическими концепциями.

Ответы (3)

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

Например, позвольте мне обрисовать простейший случай для такого рода вычислений:

  • Входное световое поле г 0 имеет медленно меняющийся фазовый профиль
  • Вы хотите распространяться на короткое расстояние относительно размера луча (или, в более чисто математическом подходе, ваше поле ввода имеет бесконечную протяженность)
  • Входная и выходная плоскости параллельны и отличаются только перемещением по оси Z.
  • Входная и выходная расчетные сетки имеют одинаковый шаг
  • Этот интервал сетки достаточно мал, чтобы Найквист произвел выборку входного поля (ограниченного в пространстве).

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

г 0 ( ξ , η ) "=" Ф [ г 0 ( Икс , у ) ] г г ( ξ , η ) "=" А г ( ξ , η ) г 0 ( ξ , η ) г г ( Икс , у ) "=" Ф 1 [ г г ( ξ , η ) ]

Где Ф представляет собой преобразование Фурье от пространственных координат ( Икс , у ) к пространственно-частотным координатам ( ξ , η ) , и А г ( ξ , η ) ядро распространения для расстояния г . В будущем я буду просто заглавными буквами обозначать преобразование Фурье соответствующих строчных букв. Обычно мы определяем для ASP:

А г ( ξ , η ) "=" опыт [ я 2 π г λ 1 ( λ ξ ) 2 ( λ η ) 2 ]

где λ это длина волны.

Однако это быстро разваливается, если какое-либо из условий, изложенных выше, не выполняется. Если поле ввода изменяется слишком быстро (или, наоборот, если сетка вычислений недостаточно точна, чтобы Найквист мог отобрать эти вариации), то в преобразованиях Фурье возникнет серьезное искажение, и результат будет искажен. Если входная и выходная плоскости не параллельны, вы просто не можете использовать этот метод в том виде, в котором он сформулирован. Если вам нужно, чтобы выходная сетка дискретизировалась иначе, чем входная сетка, то алгоритм БПФ больше не будет работать, потому что существенный компромисс, который вы делаете для скорости БПФ, заключается в том, что вы не можете выбирать произвольные точки для вычисления в Фурье. космос.

Конечно, есть и другие методы размножения. Допустим, у вас есть сходящийся луч, например, сразу после фокусирующей линзы. За исключением крайне мелкого шага расчетной сетки или объектива с очень большим фокусным расстоянием, ASP потерпит неудачу, потому что г 0 будет плохо алиасинг. Это хрестоматийный пример применимости дифракции Френеля :

г г ( Икс , у ) "=" е я к г я λ г е я π λ г ( Икс 2 + у 2 ) Ф [ г 0 ( ты , в ) е я π λ г ( ты 2 + в 2 ) ]

где ( ты , в ) пространственные координаты во входной плоскости.

Если рассматривать поле ввода г 0 состоять из произведения квадратичного фазового фронта д ( Икс , у ) "=" опыт [ я π λ ф ( Икс 2 + у 2 ) ] (представляющий фазу собирающей линзы с фокусным расстоянием ф ) и остаточная плоская составляющая с 0 ( Икс , у ) , мы можем видеть, что в некотором диапазоне расстояний распространения квадратичный фазовый член внутри преобразования Фурье будет действовать, чтобы «сгладить» преобразованную функцию, чтобы не было наложения. Действительно, когда ф "=" г преобразованное поле будет равно примерно плоскому с 0 ! В этом случае результирующее вычисление в основном идентично еще одному методу распространения, дифракции Фраунгофера , пренебрегая второстепенными деталями квадратичного фазового члена вне преобразования Фурье в дифракции Френеля и масштабированием от угловых координат до пространственных координат.

Даже с дифракцией Френеля/Фраунгоффера мы по-прежнему сталкиваемся с проблемами, если расстояние распространения слишком мало. Обратите внимание, что термин е я π λ г ( ты 2 + в 2 ) будет иметь очень большую кривизну, когда г мало, что снова создает проблемы наложения спектров в преобразовании Фурье. Как правило, решение этой проблемы состоит в том, чтобы распространить поле дважды; первый нападающий на дистанцию г 1 , затем назад на г 2 таким образом, чтобы общее расстояние распространения было г "=" г 1 г 2 , но понять, что это необходимо, и что это (или любое другое) частное решение применимо, нетривиально.

Что делать, если ваше поле ввода значительно наклонено (т. е. оно не распространяется параллельно оси Z)? Вы хотите, чтобы ваша вычислительная сетка включала выходное поле, но большая часть энергии может располагаться далеко от начала координат. ( Икс , у ) система координат. Вы можете сделать свою сетку достаточно большой, чтобы вместить это, но в идеале вы должны вычислить внеосевой фрагмент выходной плоскости. Опять нужен новый алгоритм!

Учтите, что в целом у некоторых людей может возникнуть потребность распространить сложные оптические поля на непараллельные плоскости или криволинейные поверхности, изменить шаг сетки в выходной плоскости или выполнить любые другие усложнения, которые вы можете отобразить, и вы начнете видеть, насколько принятие решений и сложность могут быть связаны с выбором алгоритма распространения. Выполнение этого автоматизированным способом не обязательно невозможно, но оченьсложно, и просто никто не взялся за написание библиотеки с открытым исходным кодом для этого. Я подозреваю, что такой код существует в проприетарных программных пакетах, таких как CodeV или другое программное обеспечение для проектирования объективов, но помните, что для разработки библиотеки должен быть кто-то, кто одновременно заинтересован (или достаточно платит), квалифицирован и имеет время для создания. такая вещь. Также помните, что аудитория для него будет ограничена инженерами-оптиками и исследователями, поэтому награда невелика.

каковы единицы ξ и η в ваших примерах для ASP? 1/м или рад/м?

Можешь попробовать МИЭП . Это инструмент с открытым исходным кодом для управления светом. Он автоматически выполняет все БПФ и имеет встроенный источник Гаусса, а также создает красивые графики 1D, 2D, 3D численного моделирования. Он также имеет оболочку Python .

Я использую примеры pylab numpy scipy matplotlib (и matplotlib.mlab) fi здесь и doc и nice ref здесь или использую интегрированную онлайн-среду python sagenb.org (откройте учетную запись или загрузите пакет, загрузите файлы и начните работать где угодно)

хорошие графики ...
чтобы сделать цифровые фильтры, изучите онлайн-книгу « Руководство для ученых и инженеров по цифровой обработке сигналов»
и изучите видео (30 уроков) «линейные системы и оптимизация преобразования Фурье и его приложений» на stanford.edu.

Если у вас хорошая видеокарта, вы можете установить OPENCL, pyOpenCL, pyfft (проще в linux box), и вы можете ускорить fft и все операции с массивами.
РЕДАКТИРОВАТЬ добавить

СКИАО -- :

SciAO — это кроссплатформенный и удобный набор инструментов с открытым исходным кодом, основанный на среде Scilab/Scicos, для моделирования и имитации волновой оптики, особенно системы адаптивной оптики.

Я знаю о numpy, scipy, matplotlib, и они подходят для моей цели. Однако это был не мой вопрос. Интересно, есть ли фреймворк, построенный на numpy и его друзьях, который что-то «знает» об оптике.
@Jan Я добавил набор инструментов SCIAO к своему ответу, надеюсь, он больше соответствует Вопросу.