Ich habe kürzlich die Punktbildverteilungsfunktion (PSF), die häufig im Zusammenhang mit dem Linsendesign auftritt, und die spezifische numerische Berechnungsmethode der MTF-Kurve untersucht und sie zusammengefasst. Ich bin kein Spezialist für Objektivdesign und komme nicht aus der Physikabteilung. Ich bin mir also sicher, dass es einige Fehler gibt, aber ich würde es begrüßen, wenn Sie auf Fehler hinweisen könnten.
** Punktstreufunktion --PSF ** ist eine Funktion, die die Lichtintensitätsverteilung auf der Bildebene ausdrückt, wenn eine Punktlichtquelle auf der Bildebene abgebildet wird.
Das Bild oben ist ein Beispiel für PSF. Je näher es an Rot liegt, desto höher ist die Lichtintensität. Bei der idealen Bildgebung fokussiert eine Punktlichtquelle auf einen Punkt, sodass PSF eine Funktion ist, die nur an einem Punkt eine Spitze aufweist, wie z. B. die Delta-Funktion. In der Realität wird das Bild jedoch aufgrund der Auswirkungen von Aberration und Beugung nicht auf einen Punkt fokussiert, und es kann ein Bild mit einem bestimmten Grad an Streuung erhalten werden, wie in Fig. 1 gezeigt.
Es gibt zwei Arten von PSF: ** geometrische optische PSF **, bei denen der Beugungseffekt nicht berücksichtigt wird, und ** optische Wellen-PSF **, bei der der Beugungseffekt berücksichtigt wird. Im Allgemeinen scheint PSF wellenoptische PSF zu bedeuten. Das obige Beispiel ist eine wellenoptische PSF, die die Beugung berücksichtigt, wobei ein weiterer Peak um das Zentrum herum wellig erscheint.
Die Erklärung von hier ist leicht zu verstehen, daher werde ich sie zitieren.
MTF (Modulation Transfer Function) ist eine der Skalen zur Bewertung der Objektivleistung und drückt aus, wie genau der Kontrast des Motivs auf der Bildebene als räumliche Frequenzcharakteristik reproduziert werden kann.
MTF wird im Allgemeinen durch einen Graphen dargestellt, der wie folgt als MTF-Kurve bezeichnet wird. Dieses Diagramm stammt auch von hier.
Die vertikale Achse repräsentiert den Kontrast und die horizontale Achse repräsentiert die Bildhöhe, dh den Abstand von der Mitte der Bildebene. Die roten und grünen Linien entsprechen bestimmten Raumfrequenzen, und die durchgezogenen und gestrichelten Linien entsprechen der Sagittalrichtung (S) und der Meridionalrichtung (M). Ich verstehe die Bedeutung der sagittalen und meridionalen Richtungen hier nicht wirklich, aber wahrscheinlich die dynamische Richtung $ r $ und die Azimutwinkelrichtung $ \ theta, wenn die Bildebene durch das Polarkoordinatensystem $ (r, \ theta) $ dargestellt wird. Es scheint, dass es $ entspricht.
Zusammenfassend stellt die MTF-Kurve den Kontrast zwischen der dynamischen Richtung und der Azimutwinkelrichtung bei bestimmten räumlichen Frequenzen dar, während die Bildhöhe geändert wird.
Wie PSF hat MTF ** geometrisches optisches MTF ** und ** wellenoptisches MTF **, je nachdem, ob der Einfluss der Lichtbeugung berücksichtigt wird oder nicht.
Es gab zwei Arten von PSF: geometrische optische PSF und wellenoptische PSF. Schauen wir uns zunächst an, wie die geometrische optische PSF berechnet wird.
Die geometrische und optische PSF ist eine Darstellung, wie eine Punktlichtquelle ein Bild auf der Bildebene erzeugt, ohne die Auswirkungen der Beugung zu berücksichtigen. Dies kann relativ einfach mit ** Raytracing ** berechnet werden.
Eine Punktlichtquelle wird an einer geeigneten Position platziert (im Allgemeinen im Unendlichen?), Und eine große Anzahl von Strahlen wird von dort zur Vorderseite der Linse emittiert. Jedes Mal, wenn diese Strahlen auf die Linse treffen, werden sie gebrochen, um die nächste Richtung zu berechnen, und dann wird die Berechnung der Kollisionsposition mit der nächsten Linse wiederholt. Berechnen Sie abschließend die Position, an der der Lichtstrahl die Bildebene schneidet, und addieren Sie die Strahlungshelligkeit des Lichts zu dieser Position.
Durch Wiederholen der späten Schnürung für eine große Anzahl von Strahlen auf diese Weise und geeignetes Interpolieren zwischen den Abtastpunkten kann die Intensitätsverteilung des Lichts auf der Bildebene erhalten werden. Auf diese Weise erhalten Sie eine geometrische optische PSF.
Das Diagramm, das die Position zeigt, an der der Lichtstrahl die Bildebene schneidet, wird als ** Punktdiagramm ** bezeichnet. Die folgende Abbildung ist ein Beispiel.
Um die optische Wellen-PSF zu berechnen, ist es notwendig, das Licht als Welle auszudrücken und die Intensität des Lichts auf der Bildebene unter Berücksichtigung der Beugung beim Durchgang durch die Linse zu erhalten. Schauen wir uns zunächst die grundlegende Methode zur Berechnung der Beugung an. Schließlich werde ich versuchen, numerische Berechnungen mit Python durchzuführen.
Hier werden die folgenden Beugungsberechnungsmethoden betrachtet.
Um Licht als Welle zu betrachten und in einer mathematischen Formel auszudrücken, wird der Ausdruck mit komplexen Zahlen verwendet.
Für ebene Wellen ist die komplexe Amplitude $ u (\ boldsymbol {r}, t) $ an Position $ \ boldsymbol {r} $, Zeit $ t $
Wird ausgedrückt als. Wobei $ A $ die Amplitude ist, $ i $ die imaginäre Einheit ist, $ \ boldsymbol {k} $ der Wellenzahlvektor ist, $ \ omega $ die Winkelfrequenz ist und $ \ delta $ die Anfangsphase ist.
Bei sphärischen Wellen beträgt der Abstand von der Wellenquelle $ r $
Wird ausgedrückt als. Wobei $ k $ die Anzahl der Wellen ist.
In den folgenden Berechnungen haben die Begriffe $ \ omega t $ und $ \ delta $ keine Auswirkung und werden ignoriert.
Betrachten Sie das folgende Koordinatensystem, um die Berechnung der Beugung zu erklären.
$ \ Sigma $ repräsentiert die Öffnung und $ P (x_p, y_p, 0) $ ist der Punkt über $ \ Sigma $. $ Q (x_q, y_q, z_q) $ ist ein Punkt auf der Bildebene. $ r $ ist die Länge der Linie $ PQ $ und $ \ theta $ ist der Winkel zwischen der Linie $ PQ $ und der Achse $ z $.
Betrachten Sie die Situation, in der eine ebene Welle, die durch die Öffnung $ \ Sigma $ geht, beim Beugen den Punkt $ Q $ erreicht. Nach dem Fresnel-Huihens-Prinzip kann die komplexe Amplitude des Punktes $ Q $ als Überlagerung von Sekundärwellen ausgedrückt werden, die auf $ \ Sigma $ erzeugt werden.
Betrachten Sie zunächst die komplexe Amplitude der quadratischen Welle, die vom Punkt $ P $ den Punkt $ Q $ erreicht.
Da die komplexe Amplitude $ u (x_q, y_q, z_q) $ am Punkt $ Q $ die Überlagerung dieser Sekundärwellen über $ \ Sigma $ ist.
\begin{align}
u(x_q, y_q, z_q) &= \frac{1}{i\lambda}\int\int_{\Sigma} u(x, y, 0)\frac{e^{ikr}}{r}\cos{\theta}dxdy \tag{1} \\
&= \frac{z_q}{i\lambda}\int\int_{\Sigma} u(x, y, 0)\frac{e^{ikr}}{r^2}dxdy
\end{align}
Es wird sein. Bei der Formeltransformation haben wir $ \ cos {\ theta} = \ frac {z_q} {r} $ verwendet.
Dieses Integral heißt ** Fresnel-Kirchhoff-Beugungsintegral **. Da die komplexe Amplitude am Punkt $ Q $ durch numerische Integration berechnet werden kann, kann die Intensität auf der Bildebene durch Berechnung des Quadrats des Absolutwerts erhalten werden. Diese Berechnungsmethode ist jedoch nicht praktikabel, da der Berechnungsbetrag $ O (N ^ 4) $ beträgt, wenn die Anzahl der Teilungen zwischen der Öffnungsfläche und der Bildfläche $ N $ beträgt.
Stellen Sie sich eine Situation vor, in der $ \ theta $ klein und $ \ cos {\ theta} \ ungefähr 1 $ ist (Annäherung nahe der Achse).
Wenn man sich auf Gleichung 1 konzentriert, wird der Teil $ \ cos {\ theta} $ zu 1, und $ \ frac {1} {r} $ kann als $ \ frac {1} {z} $ angenähert werden. Andererseits hat der Term $ e ^ {ikr} $ einen großen Wert von $ k = \ frac {2 \ pi} {\ lambda} $. Wenn Sie also $ r $ durch $ z $ ersetzen, ist die Genauigkeit der Approximation gut. Da ist gar nichts.
Erwägen Sie daher, $ r $ zu einer Reihe zu erweitern und bis zum zweiten Term zu verwenden. Wenn $ r = \ sqrt {(x_q - x) ^ 2 + (y_q - y) ^ 2 + z_q ^ 2} $ auf den zweiten Term erweitert wird
Durch Einsetzen in die Gleichung für die Beugungsintegration
Es wird sein. Diese Näherung wird als ** Frenel-Näherung ** bezeichnet, und Gleichung 2 wird als ** Frenel-Beugungsintegration ** bezeichnet.
Erweitern des Inhalts der $ e $ -Schulter in Gleichung 2
Es wird sein. In Gleichung 3 ist $ f_x = \ frac {x_q} {\ lambda z_q} $, $ f_y = \ frac {y_q} {\ lambda z_q} $
\begin{align}
u(x_q, y_q, z_q) &= \frac{1}{i\lambda z_q}e^{ikz_q}e^{ik\frac{x_q^2 + y_q^2}{2z_q}} \int\int_{\Sigma} u(x, y, 0)e^{-ik\frac{xx_q + yy_q}{z_q}}e^{ik\frac{x^2 + y^2}{2z_q}}dx dy \\
&= \frac{1}{i\lambda z_q}e^{ikz_q}e^{ik\frac{x_q^2 + y_q^2}{2z_q}} \int\int_{\Sigma} u(x, y, 0)e^{ik\frac{x^2 + y^2}{2z_q}}e^{-2\pi i(f_x x + f_y y)}dx dy \\
&= \frac{1}{i\lambda z_q}e^{ikz_q}e^{ik\frac{x_q^2 + y_q^2}{2z_q}} \mathcal{F}\{u(x, y, 0)e^{ik\frac{x^2 + y^2}{2z_q}}\}_{f_x = \frac{x_q}{\lambda z_q}, f_y = \frac{y_q}{\lambda z_q}} \end{align}
Daher kann es durch die zweidimensionale Fourier-Transformation von $ u (x, y, 0) e ^ {ik \ frac {x ^ 2 + y ^ 2} {2z_q}} $ berechnet werden.
Damit die Fresnel-Näherung gilt, wird $ r $ mit dem dritten Term multipliziert, der eine Reihenerweiterung darstellt, und $ k $ ist erforderlich.
Muss für $ z_q $ erfüllt und neu geschrieben werden
Es wird sein.
In Gleichung 3 ist $ \ frac {x ^ 2 + y ^ 2} {2z_q} $ klein genug und liegt nahe an $ e ^ {ik \ frac {x ^ 2 + y ^ 2} {2z_q}} \ append Dann
Es wird sein. Diese Näherung wird als ** Fraunhofer-Näherung ** bezeichnet, und Gleichung 4 wird als ** Fraunhofer-Beugungsintegral ** bezeichnet.
In Gleichung 4 ist $ f_x = \ frac {x_q} {\ lambda z_q} $, $ f_y = \ frac {y_q} {\ lambda z_q} $
\begin{align} u(x_q, y_q, z_q) &= \frac{1}{i\lambda z_q}e^{ikz_q}e^{ik\frac{x_q^2 + y_q^2}{2z_q}} \int\int_{\Sigma} u(x, y, 0)e^{-2\pi i(f_x x + f_y y)}dx dy \\ &= \frac{1}{i\lambda z_q}e^{ikz_q}e^{ik\frac{x_q^2 + y_q^2}{2z_q}} \mathcal{F}\{u(x, y, 0)\}_{f_x = \frac{x_q}{\lambda z_q}, f_y = \frac{y_q}{\lambda z_q}}
\end{align}
Daher können wir sehen, dass es durch die zweidimensionale Fourier-Transformation von $ u (x_p, y_p, 0) $ berechnet werden kann. Damit die Fraunhofer-Näherung gilt, muss
Die Fraunhofer-Näherung ist eine gültige Näherung, wenn die Apertur klein genug ist und das Bild sehr weit von der Apertur entfernt beobachtet wird. Andererseits ist die Fresnel-Näherung eine gültige Näherung, die noch näher als die Fraunhofer-Näherung liegt.
Die inverse Fourier-Transformation von $ U (f_x, f_y, 0) $, die die Fourier-Transformation der komplexen Amplitude $ u (x, y, 0) $ der offenen Oberfläche ist, ist
ist. In dieser Gleichung ist die komplexe Amplitude $ u (x, y, 0) $ der Öffnungsfläche die Summe der ebenen Welle $ U (f_x, f_y, 0) \ exp [2 \ pi i (x f_x + y f_y)] $. Es zeigt, dass es ausgedrückt werden kann als.
Finden jeder Komponente des Wellenzahlvektors $ \ boldsymbol {k} $ jeder ebenen Welle
\begin{align}
k_x &= 2\pi f_x \\
k_y &= 2\pi f_y \\
k_z &= \sqrt{k^2 - k_x^2 - k_y^2}
\end{align}
Es wird sein.
Wenn sich jede ebene Welle $ z_q $ in Richtung $ z $ bewegt, ist ihre komplexe Amplitude
Es wird sein. Dann ist die komplexe Amplitude $ u (x ', y', z_q) $ auf der Bildebene die Summe dieser ebenen Wellen.
\begin{align}
u(x', y', z_q) &= \int\int U(f_x, f_y, 0)\exp[2\pi i(x f_x + y f_y)] \exp[i k_z z_q] df_x df_y \\
&= \mathcal{F}^{-1}\{ U(f_x, f_y, 0) \exp[i k_z z_q] \}
\end{align}
Es ist ersichtlich, dass die komplexe Amplitude $ u (x ', y, z_q) $ auf der Bildebene durch die inverse Fourier-Transformation von $ U (f_x, f_y, 0) \ exp [i k_z z_q] $ berechnet werden kann. Diese Berechnungsmethode heißt ** Angular Spectrum Method **.
Die Winkelspektrummethode kann die Beugung in dem Bereich berechnen, der näher an der Öffnungsfläche liegt als die Frenel-Näherung oder die Fraunhofer-Näherung. Da die Berechnung für die Fourier-Transformation und die inverse Fourier-Transformation nur einmal durchgeführt wird, kann sie außerdem mit hoher Geschwindigkeit berechnet werden.
Öffnung $ \ Sigma $ mit Radius $ r = 1 ~ \ mathrm {[mm]} $ kreisförmige Öffnung, $ \ lambda = 550 ~ \ mathrm {[nm]} $, $ z_q = 5 ~ \ mathrm {[m] Berechnen wir numerisch als} $. Das für die Berechnung verwendete Jupyter-Notizbuch finden Sie unter Google Colab.
Berechnen wir zunächst numerisch mit der Fraunhofer-Näherung. Wenn Sie die Näherungsbedingungen überprüfen, sind $ x $ und $ y $ maximal $ r $.
Es wird sein. Es entspricht nicht den Annahmen, aber ich werde mit der Berechnung so fortfahren, wie sie ist.
Die Fraunhofer-Beugung kann berechnet werden, indem eine zweidimensionale Fourier-Transformation an der komplexen Amplitude $ u (x, y, 0) $ an der Apertur $ \ Sigma $ durchgeführt wird. Um numerische Berechnungen programmgesteuert durchzuführen, teilen Sie den Berechnungsbereich mit einer Seitenlänge von $ D $ in ein Gitter von $ N \ mal N $, um die Öffnungsfläche abzudecken, und speichern Sie die komplexen Amplituden auf jedem Gitter. Kann durch Ausführen einer zweidimensionalen diskreten Fourier-Transformation berechnet werden.
Berechnen wir numerisch mit Python. Bereiten Sie zunächst ein Array vor, das komplexe Amplituden im Raster speichert.
import numpy as np
import matplotlib.pyplot as plt
l = 0.55e-6 #Wellenlänge[m]
k = 2 * np.pi / l #Anzahl der Wellen
zq = 5 #Abstand von der Öffnungsfläche zur Bildfläche[m]
N = 200 #Anzahl der Gitterunterteilungen
r = 0.001 #Öffnungsradius[m]
D = 0.05 #Rechenbereich auf der offenen Fläche[m]
fscale = l*zq
#Gibt die komplexe Amplitude auf der offenen Oberfläche zurück
def P(x, y):
if x**2 + y**2 < r**2:
return 1
else:
return 0
#Netzerzeugung
X, Y = np.meshgrid(np.linspace(-D/2, D/2, num=N), np.linspace(-D/2, D/2, num=N))
Pv = np.vectorize(P)
Z = Pv(X, Y)
Lassen Sie es uns planen.
plt.imshow(Z, extent=[-D/2, D/2, -D/2, D/2], cmap='gray')
plt.xlabel('$x_p$ [m]')
plt.ylabel('$y_p$ [m]')
Der weiße Teil entspricht der Öffnungsfläche.
Als nächstes wird dies einer diskreten Fourier-Transformation unterzogen, aber vorher wird der Bereich auf der Bildebene berechnet, der dem Berechnungsbereich entspricht.
v = np.fft.fftfreq(N, d=D/N)
v = fscale * np.fft.fftshift(v)
#Einheiten[mm]
extent= [1e3 * v[0], 1e3 * v[-1], 1e3 * v[0], 1e3 * v[-1]]
Das Fraunhofer-Beugungsbild wird durch diskrete Fourier-Transformation der komplexen Amplitude auf der offenen Oberfläche erhalten.
#Berechnen Sie die komplexe Amplitude in der Bildebene
U_fraun = np.fft.fft2(Z)
U_fraun = 1/(1.0j * l * zq) * np.exp(1.0j * k * zq) * np.exp(1.0j * k * (v**2 + v**2)/(2*zq)) * np.fft.fftshift(U_fraun)
#Stärke berechnen
I_fraun = np.abs(U_fraun)**2
#Normalisierung
I_fraun = I_fraun / np.max(I_fraun)
Zeichnen wir die Intensität.
plt.imshow(I_fraun, cmap='jet', extent=extent)
plt.xlabel('$x_q$ [mm]')
plt.ylabel('$y_q$ [mm]')
plt.title('Fraunhofer Diffraction')
Es gibt auch einen Intensitätspeak um das Zentrum, der zeigt, dass der Beugungseffekt berechnet werden kann.
Überprüfen Sie zunächst die Annäherungsbedingungen. Der bedingte Ausdruck für die Approximation der Fresnel-Beugung ist
war. Dies ist etwas kompliziert, da im Gegensatz zur Fraunhofer-Beugung die Größe der Beobachtungsfläche berücksichtigt werden muss. Vorerst die Größe einer Seite der Beobachtungsfläche
Es wird sein.
Die Frennell-Beugung kann sowohl mit der zweidimensionalen diskreten Fourier-Transformation als auch mit der Fraunhofer-Beugung berechnet werden.
#Berechnen Sie die komplexe Amplitude in der Bildebene
U_fresnel = np.fft.fft2(Z * np.exp(1.0j * k * (X**2 + Y**2)/(2*zq)))
U_fresnel = 1/(1.0j * l * zq) * np.exp(1.0j * k * zq) * np.exp(1.0j * k * (v**2 + v**2)/(2*zq)) * np.fft.fftshift(U_fresnel)
#Stärke berechnen
I_fresnel = np.abs(U_fresnel)**2
#Normalisierung
I_fresnel = I_fresnel / np.max(I_fresnel)
Zeichnen wir die Intensität.
plt.imshow(I_fresnel, cmap='jet', extent=extent)
plt.xlabel('$x_q$ [mm]')
plt.ylabel('$y_q$ [mm]')
plt.title('Fresnel Diffraction')
Es scheint, dass der Peak um das Zentrum stärker ist als in der Fraunhofer-Näherung.
Fresnel Kirchhoffs Beugungsformel
Berechnen wir durch direkte numerische Integration. Diese Methode ist relativ streng, da keine Näherungswerte verwendet werden, sie ist jedoch aufgrund des überwältigenden Rechenaufwands nicht praktikabel. Ich wollte es mit der Approximationsmethode vergleichen, also habe ich es berechnet.
#Fresnel-Kirchhoffs diffraktive numerische Integration
def Uf(x_q, y_q):
r = np.sqrt((x_q - X)**2 + (y_q - Y)**2 + zq**2)
return zq/(1.0j * l) * (Z * np.exp(1.0j * k * r) / r**2).sum()
#Berechnungsbereich auf der Bildebene
X_Q, Y_Q = np.meshgrid(np.linspace(extent[0]*1e-3, extent[1]*1e-3, num=N), np.linspace(extent[2]*1e-3, extent[3]*1e-3, num=N))
#Numerische Integration(Eine Skalierung ist angemessen)
U_strict = np.vectorize(Uf)(X_Q, Y_Q)
#Stärke berechnen
I_strict = np.abs(U_strict)**2
#Normalisierung
I_strict = I_strict / np.max(I_strict)
Zeichnen wir die Intensität.
plt.imshow(I_strict, cmap='jet', extent=extent)
plt.xlabel('$x_q$ [mm]')
plt.ylabel('$y_q$ [mm]')
plt.title('Fresnel Kirchhoff Diffraction')
Lassen Sie uns abschließend eine numerische Berechnung mit der Winkelspektrummethode durchführen. Die Prozedur besteht darin, zuerst die Fourier-Transformation $ U (f_x, f_y, 0) $ der komplexen Amplitude $ u (x, y, 0) $ der offenen Oberfläche und dann $ U (f_x, f_y, 0) $ und $ \ zu finden. Inverses Fourier transformiert das Produkt von exp [ik_z z_q] $.
#Fourier-Transformation der komplexen Amplitude der offenen Oberfläche
U = np.fft.fft2(Z)
#Berechnung des Wellenzahlvektors
k_x = np.fft.fftfreq(N, d=D/N) * 2 * np.pi
k_y = np.fft.fftfreq(N, d=D/N) * 2 * np.pi
K_X, K_Y = np.meshgrid(k_x, k_y)
k_z = np.sqrt(k**2 - K_X**2 - K_Y**2)
#Berechnen Sie die komplexe Amplitude der Bildebene
U_angular = np.fft.ifft2(U * np.exp(1.0j * k_z * zq))
#Stärke berechnen
I_angular = np.abs(U_angular)**2
#Normalisierung
I_angular = I_angular / np.max(I_angular)
Lassen Sie es uns planen.
plt.imshow(I_angular, cmap='jet', extent=[-D/2, D/2, -D/2, D/2])
plt.xlabel('$x_q$ [m]')
plt.ylabel('$y_q$ [m]')
plt.title('Angular Spectrum Diffraction')
Im Gegensatz zur Fresnel-Näherung und zur Fraunhofer-Näherung entspricht die Bildebenenfläche der Berechnungsfläche, sodass sie klein aussieht.
Es ist lange her, also schreibe ich den Rest auf eine andere Seite.