RP Coating – das Software-Werkzeug für das Design optischer Vielschichtstrukturen
Überblick | Anwendung | Modell | Benutzung | Demos | Versionen |
Beispiel: Rugate-Filter
Wir entwickeln ein Rugate-Filter, bei dem der Brechungsindex in der Struktur kontinuierlich variiert wird. Ein solches Filter kann beispielsweise hergestellt werden, indem man ein variables Gemisch von SiO2 und Nb2O5 aufdampft.
Für die numerische Modellierung beschreiben wir die Struktur als eine Folge vieler sehr dünner Schichten. Wenn hierbei genügend kleine Schritte gewählt werden, sind die Indexschritte so klein, dass die Resultate sehr genau sind.
Das Filter soll nur Wellenlängen nahe 1000 nm reflektieren und keine Seiten-Peaks in der Reflektivität aufweisen, wie es bei gewöhnlichen Bragg-Spiegeln der Fall wäre. Wir können dies mit einer sinusförmigen Oszillation des Brechungsindex erreichen, wenn wir zwei andere Dinge dabei beachten:
- Wir müssen zusätzliche Reflexionen an Indexsprüngen an den Enden vermeiden, indem wir z. B. kontinuierliche Übergänge erzeugen.
- Wir müssen außerdem die Struktur apodisieren, d. h. die Oszillation gegen die Enden abklingen lassen.
Insgesamt führt dieser Ansatz zu einer etwas komplizierten Struktur, die wir sicher nicht in Form von hunderten von vorberechneten Indexwerten eingeben wollten. Stattdessen möchten wir die ganze Struktur mit wenigen Parametern beschreiben, aus denen dann alles berechnet wird.
Zuerst definieren wir nur das Substrat und das Superstrate – momentan in der Annahme, dass beiden aus BK7-Glas bestehen:
beam from superstrate substrate: BK7 ; no layers defined yet superstrate: BK7
(Später werden wir das Superstrate durch Luft ersetzen.)
Wir nehmen an, dass nur Brechungsindizes größer als die von BK7 erreicht werden können. Deswegen definieren wir einen erhöhten Indexwert n0, um den wir später die Oszillation durchführen können. Wir müssen dann zwei Anpassungsregionen um die reflektierende Region herum platzieren, in denen der Brechungsindex sanft vom dem von BK7 auf n0 ansteigt und später wieder abfällt:
l_ref := 1000 { reference wavelength } n_s := n(-1, l_ref) { substrate index } n0 := n_s + 0.3 { medium index in reflecting region } n_rug(l, x) := n_BK7(l) + x { rugate material, e.g. realized as SiO2 mixed with Nb2O5 } ; Parameters of the index matching regions: z_m := 1000 { thickness } dz_m := 20 { resolution } x_m(z) := (n0 - n_s) * (10 * z^3 - 15 * z^4 + 6 * z^5) ; Parameters of the reflecting region: z_r := 10000 { approximate thickness } dz_r := 25 { resolution } Lambda := l_ref / (2 * n0) { oscillation period } z_r := Lambda * round(z_r / Lambda) { thickness correction } W(x) := exp(-15 * (x - 0.5)^2) { window function } si(x) := if sin(x) >= 0 then 1 else -1 x_r(z) := (n0 - n_s) * (1 + sin(2pi * z / Lambda) * W(z / z_r)) MakeStructure() := { Make the coating structure based on the parameters above } begin while nolayers() > 0 do remove_layer(1); { allow repeated application: remove all already existing layers } { index matching region } for z := 0 to z_m step dz_m do add_layer(nolayers() + 1, "rug", x_m(z / z_m), dz_m, 0, 0); { reflecting part } for z := 0 to z_r step dz_r do add_layer(nolayers() + 1, "rug", x_r(z), dz_r, 0, 0); { index matching region } for z := 0 to z_m step dz_m do add_layer(nolayers() + 1, "rug", x_m(1 - z / z_m), dz_m, 0, 0); end calc MakeStructure() show "Thickness: ", get_d(0) * d_units:d3:"m"
Wir möchten nun zuerst das erzeugte Indexprofil anzeigen:
diagram 1: "Refractive Index Profile" x: -100, get_d(0) + 100 "position (nm)", @x y: 0, 3 "refractive index", @y frame hx hy f: n(x,1000), color = blue, step = 1 ! begin setcolor(gray); line(0,i * CS_y2); line(z := z_m,z + i * CS_y2); line(z := z_m + z_r,z + i * CS_y2); line(z := get_d(0),z + i * CS_y2); end
Dann möchten wir das erhaltene Reflektivitätsspektrum sehen:
diagram 2: "Reflection Spectrum" x: 600, 1400 "wavelength (nm)", @x y: 0, 100 "reflectivity (%)", @y frame hx hy f: 100 * R(x), color = red, step = 1, maxconnect = 1
Dies funktioniert in der Tat gut. Wir können die verbleibenden Seitenpeaks mit einer logarithmischen Skala besser untersuchen:
diagram 3: "Reflection Spectrum" x: 600, 1400 "wavelength (nm)", @x y: -60, 0 "reflectivity (dB)", @y frame hx hy f: 10 * lg(R(x)), color = red, step = 1, maxconnect = 1
Als nächstes möchten wir die Struktur so ändern, dass das Superstrate nun Luft ist. Wenn wir sonst nichts ändern, erhalten wir wegen der Fresnel-Reflexion an der Oberfläche ein verschlechtertes Verhalten des Filters:
diagram 4: "Reflection Spectrum Against Air" x: 600, 1400 "wavelength (nm)", @x y: 0, 100 "reflectivity (%)", @y frame hx hy ! set_layer(nolayers() + 1, "air", 0, 0, 0, 0) f: 100 * R(x), color = red, step = 1, maxconnect = 1
Dies können wir verbessern, indem wir zunächst die obere Anpassungsregion wieder entfernen und dann stattdessen eine Anti-Reflex-Struktur aufbringen. Als die einfachste Lösung verwenden wir eine einzige Schicht:
diagram 5: "Reflection Spectrum Against Air" "with an anti-reflection coating" x: 600, 1400 "wavelength (nm)", @x y: 0, 100 "reflectivity (%)", @y frame hx hy ! for z := 0 to z_m step dz_m do remove_layer(nolayers()) { remove the top index-matching region } ! begin { add a single-layer AR coating } n_ar := sqrt(n0); { refractive index of anti-reflection layer } x_ar := n_ar - n_fsilica(l_ref * l_units); { corresponding x value } add_layer(nolayers() + 1, "rug", x_ar, l_ref / 4 / n_ar, 0, 0); end f: 100 * R(x), color = red, step = 1, maxconnect = 1
Für eine bessere Performance können wir ein Multischicht-System einsetzen, welches anderswo optimiert wurde:
! begin { add previously calcultaed AR coating, optimized for n0 = 1.8075 } add_layer(nolayers() + 1, "TiO2", 0, 34.6, 0, 0); add_layer(nolayers() + 1, "SiO2", 0, 23.7, 0, 0); add_layer(nolayers() + 1, "TiO2", 0, 127.8, 0, 0); add_layer(nolayers() + 1, "SiO2", 0, 20.8, 0, 0); add_layer(nolayers() + 1, "TiO2", 0, 42.6, 0, 0); add_layer(nolayers() + 1, "SiO2", 0, 151.9, 0, 0); end
Das schlussendlich erhaltene Indexprofil sieht so aus:
Schließlich betrachten wir noch das Eindringen des elektrischen Felds: