RP Photonics

Software … leistungsfähige Tools für Ihre Forschung & Entwicklung!

English

RP Coating – das Software-Werkzeug für das
Design optischer Vielschichtstrukturen

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
refractive index profile of a rugate filter

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
reflectivity spectrum of a rugate filter

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
reflectivity spectrum of a rugate filter

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
reflectivity spectrum of a rugate filter

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
reflectivity spectrum of a rugate filter

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
reflectivity spectrum of a rugate filter

Das schlussendlich erhaltene Indexprofil sieht so aus:

refractive index profile of a rugate filter

Schließlich betrachten wir noch das Eindringen des elektrischen Felds:

field penetration in a rugate filter
arrow