Numerische Software, um einen Lichtstrahl in seiner ebenen Wellendarstellung zu manipulieren?

Jedes Lichtfeld kann als Summe ebener Wellen ausgedrückt werden. Ein solches Ensemble ebener Wellen nennt man das ebene Wellenspektrum des Lichtfeldes. Das ebene Wellenspektrum ist die Fourier-Transformierte des Lichtfeldes in der Realraumdarstellung.

Da dies eine so grundlegende Technik ist, frage ich mich, ob es ein Standardwerkzeug gibt, vorzugsweise Open Source, mit einer einfachen Schnittstelle über Python, Matlab oder ähnliches, um Folgendes (numerisch) zu tun:

  • Beginnen Sie mit einem Lichtfeld im realen Raum, beispielsweise einem monochromatischen *-Gaußschen Strahl.
  • Berechnen Sie die Fourier-Transformation
  • Wenden Sie eine Operation an, die das Spektrum der ebenen Welle ändert, sagen wir eine Grenze zwischen zwei Medien
  • Berechnen Sie die inverse Fourier-Transformation
  • eine Ausgabe erzeugen, z. B. einen Plot

Rechnerisch ist lediglich eine Bibliothek zur Durchführung der FFT erforderlich. Ich suche nach einem Rahmen, der dies zusammen mit einigen physikalischen Konzepten umschließt.

Antworten (3)

Der Grund dafür, dass diese Arten von Bibliotheken nicht existieren, liegt darin, dass der spezielle Algorithmus, den Sie für die Berechnung verwenden, von den genauen Details des Lichtfelds und den Eingabe- und Ausgabeebenen abhängt, die Sie zu berechnen versuchen.

Lassen Sie mich zum Beispiel den einfachsten Fall für diese Art der Berechnung skizzieren:

  • Das Eingangslichtfeld G 0 hat ein sich langsam änderndes Phasenprofil
  • Sie möchten sich relativ zur Größe des Strahls über eine kurze Distanz ausbreiten (oder, in einem rein mathematischen Ansatz, hat Ihr Eingabefeld eine unendliche Ausdehnung).
  • Die Eingangs- und Ausgangsebene sind parallel und unterscheiden sich nur durch eine Translation entlang der z-Achse
  • Die Eingabe- und Ausgabeberechnungsgitter haben den gleichen Abstand
  • Dieser Gitterabstand ist ausreichend klein, um das (räumlich bandbegrenzte) Eingabefeld nyquist abzutasten.

In diesem Fall können Sie einfach die Methode der Winkelspektrumausbreitung (ASP) mit FFTs verwenden, um Ihre propagierte Wellenfront schnell zu berechnen. Sie scheinen die grundlegende Skalarbeugung zu verstehen, aber um andere Leser zu verdeutlichen, bedeutet dies, dass Sie Folgendes berechnen:

G 0 ( ξ , η ) = F [ G 0 ( X , j ) ] G z ( ξ , η ) = A z ( ξ , η ) G 0 ( ξ , η ) G z ( X , j ) = F 1 [ G z ( ξ , η ) ]

Wo F ist die Fourier-Transformation von räumlichen Koordinaten ( X , j ) zu Raumfrequenzkoordinaten ( ξ , η ) , Und A z ( ξ , η ) ist der Ausbreitungskern für die Entfernung z . In Zukunft werde ich Großbuchstaben einfach die Fourier-Transformation entsprechender Kleinbuchstaben bezeichnen lassen. Typischerweise definieren wir für ASP:

A z ( ξ , η ) = exp [ ich 2 π z λ 1 ( λ ξ ) 2 ( λ η ) 2 ]

Wo λ ist die Wellenlänge.

Dies fällt jedoch schnell auseinander, wenn eine der oben genannten Bedingungen nicht erfüllt ist. Wenn das Eingabefeld zu schnell variiert (oder umgekehrt, wenn das Berechnungsgitter nicht fein genug ist, um diese Variationen mit Nyquist abzutasten), kommt es zu starkem Aliasing in den Fourier-Transformationen, und Ihr Ergebnis wird beschädigt. Wenn die Eingabe- und Ausgabeebenen nicht parallel sind, können Sie diese Methode einfach nicht so verwenden, wie sie formuliert ist. Wenn das Ausgangsgitter anders als das Eingangsgitter abgetastet werden muss, funktioniert ein FFT-Algorithmus nicht mehr, da der wesentliche Kompromiss, den Sie für die Geschwindigkeit einer FFT eingehen, darin besteht, dass Sie keine beliebigen Punkte zur Berechnung in Fourier auswählen können Raum.

Es gibt natürlich auch andere Vermehrungstechniken. Angenommen, Sie haben einen konvergierenden Strahl, z. B. unmittelbar nach einer Fokussierlinse. Abgesehen von einem extrem feinen Berechnungsgitterabstand oder einem Objektiv mit sehr langer Brennweite wird ASP scheitern, weil G 0 wird schlecht aliasiert. Dies ist das Lehrbuchbeispiel für die Anwendbarkeit der Fresnel-Beugung :

G z ( X , j ) = e ich k z ich λ z e ich π λ z ( X 2 + j 2 ) F [ G 0 ( u , v ) e ich π λ z ( u 2 + v 2 ) ]

Wo ( u , v ) sind Raumkoordinaten in der Eingabeebene.

Betrachten wir das Eingabefeld G 0 aus dem Produkt einer quadratischen Phasenfront zusammengesetzt sein Q ( X , j ) = exp [ ich π λ F ( X 2 + j 2 ) ] (repräsentiert die Phase der Brennweite der Sammellinse F ) und eine verbleibende flache Komponente S 0 ( X , j ) , können wir sehen, dass über einen gewissen Bereich von Ausbreitungsentfernungen der quadratische Phasenterm innerhalb der Fourier-Transformation so wirkt, dass er die transformierte Funktion "abflacht", so dass kein Aliasing auftritt. In der Tat, wann F = z Das transformierte Feld entspricht dem ungefähr flachen S 0 ! In diesem Fall ist die resultierende Berechnung im Wesentlichen identisch mit noch einer anderen Ausbreitungstechnik, der Fraunhofer-Beugung , wobei das kleinere Detail des quadratischen Phasenterms außerhalb der Fourier-Transformation in der Fresnel-Beugung und eine Skalierung von Winkelkoordinaten zu räumlichen Koordinaten vernachlässigt werden.

Auch bei der Fresnel/Fraunhoffer-Beugung stoßen wir immer noch auf Probleme, wenn die Ausbreitungsdistanz zu klein ist. Beachten Sie, dass der Begriff e ich π λ z ( u 2 + v 2 ) wird eine sehr hohe Krümmung haben, wenn z klein ist, was wiederum Aliasing-Probleme in der Fourier-Transformation erzeugt. Typischerweise besteht die Lösung dafür darin, das Feld zweimal zu verbreiten; zunächst ein Stück vorwärts z 1 , dann rückwärts vorbei z 2 so dass die Gesamtausbreitungsdistanz ist z = z 1 z 2 , aber zu erkennen, dass dies notwendig ist und dass diese (oder jede andere) bestimmte Lösung anwendbar ist, ist nicht trivial.

Was ist nun, wenn Ihr Eingabefeld erheblich geneigt ist (dh es breitet sich nicht parallel zur z-Achse aus)? Sie möchten, dass Ihr Berechnungsgitter das Ausgangsfeld enthält, aber der Großteil der Energie befindet sich möglicherweise weit vom Ursprung entfernt ( X , j ) Koordinatensystem. Sie könnten Ihr Raster groß genug machen, um dies aufzunehmen, aber idealerweise würden Sie einen Teil der Ausgabeebene außerhalb der Achse berechnen. Wieder einmal brauchen Sie einen neuen Algorithmus!

Bedenken Sie, dass manche Leute im Allgemeinen komplizierte optische Felder auf nicht parallele Ebenen oder gekrümmte Oberflächen ausbreiten müssen, um den Gitterabstand in der Ausgangsebene zu ändern, oder was auch immer für eine andere Komplikation Sie sich vorstellen können, und Sie werden sehen, wie viel Entscheidungsfindung und Komplexität können bei der Auswahl eines Ausbreitungsalgorithmus beteiligt sein. Dies auf automatisierte Weise zu tun, ist nicht unbedingt unmöglich, aber sehr wahrscheinlichschwierig, und es gibt einfach niemanden, der es sich zur Aufgabe gemacht hat, dafür eine Open-Source-Bibliothek zu schreiben. Ich vermute, dass ein solcher Code in proprietären Softwarepaketen wie CodeV oder anderer Linsendesign-Software vorhanden ist, aber denken Sie daran, dass es für die Entwicklung einer Bibliothek jemanden geben muss, der gleichzeitig interessiert (oder ausreichend bezahlt), qualifiziert und die Zeit zum Produzieren hat solch eine Sache. Denken Sie auch daran, dass das Publikum dafür auf optische Ingenieure und Forscher beschränkt wäre, so dass es wenig Belohnung gibt.

Was sind die Einheiten von ξ und η in Ihren Beispielen für ASP? 1/m oder rad/m?

Du könntest MEEP ausprobieren . Es ist ein Open-Source-Tool zur Lichtmanipulation. Es führt automatisch alle FFTs durch und hat eine eingebaute Gaußsche Quelle und erzeugt auch schöne Diagramme von numerischen 1D-, 2D- und 3D-Simulationen. Es hat auch einen Python-Wrapper .

Ich verwende pylab numpy scipy matplotlib (und matplotlib.mlab)
Beispiele fi hier und doc und nette Referenz hier
oder verwende die online integrierte Python-Umgebung sagenb.org (Konto eröffnen oder Paket herunterladen, Dateien hochladen und überall arbeiten)

nice plots ...
um digitale Filter zu machen, stöbern Sie im Online-Buch The Scientist and Engineer's Guide to Digital Signal Processing
und sehen Sie sich die Videos (30 Lektionen) "Lineare Systeme und Optimierung der Fourier-Transformation und ihre Anwendungen" von stanford.edu an.

Wenn Sie eine gute Grafikkarte haben, können Sie OPENCL, pyOpenCL, pyfft (einfacher in der Linux-Box) installieren und die fft- und alle Array-Operationen beschleunigen.
BEARBEITEN hinzufügen

SCIAO -- :

SciAO ist eine quelloffene, plattformübergreifende und benutzerfreundliche Toolbox, die auf der Scilab/Scicos-Umgebung zur Modellierung und Simulation von Wellenoptik, insbesondere des adaptiven Optiksystems, basiert

Ich kenne numpy, scipy, matplotlib und sie sind für meinen Zweck geeignet. Das war jedoch nicht meine Frage. Ich frage mich, ob es ein Framework gibt, das auf numpy und Co. aufbaut und etwas über Optik "versteht".
@Jan Ich habe meiner Antwort die SCIAO-Toolbox hinzugefügt, ich hoffe, mehr im Einklang mit der Frage