SiO2/TiO2多層膜の反射率

 特定の波長λを中心とした光の反射を制御するのに、誘電体多層膜が用いられます。カメラのレンズのコーティングに用いられるものです。レンズ表面に、適切な膜厚と反射係数をもつ膜を貼ることで、レンズ表面からの反射を抑える、つまり透過率を上げることができます。反射係数の異なる2種類の材料で多層膜をつくることにより、幅広い波長で、レンズ表面からの光の反射率を低下させることができます。(個人的な疑問だが、なぜ緑色のメガネが多いんだろう?青や紫を反射させた方が目に優しそうだけど?作り難いのかな?)

 一方で、多層膜は、材料と膜厚を選べば反射率を高めることもでき、縦型のレーザー(VCSEL)に使われます。VCSELでは、発光層を、ミラーである誘電体多層膜(DBR)で挟むことで、レーザー発振させます。100%に近いミラーを実現することで、特定の波長の光を閉じ込めることができ、VCSELの効率が向上します。VCSEL実現には、DBR(とcavity長)がとても重要な要素です。
 
 GaN上のSiO2/TiO2多層膜の反射率を計算してみました。波長410 nm、多層膜の周期を7層、それぞれの膜厚はλ/4としました。(横軸:エネルギ(eV)、縦軸:反射率(%))。

【補足】
 お礼:複素数計算のモジュールとして、ここを使わせて頂きました。クラスtest以外はそこのコピペです。感謝申し上げます。
 練習目的:VBAでの複素数(EXP(ix))の計算
 懸念事項1:誘電体の反射率の値。ネットにあるindexを参照したが、短波長側の情報が少ない。もっと正確な実験値を用いるべき。
 懸念事項2:3.5eV付近で反射率が100%を超えている。計算おかしい?
 およそ2.5~3.5eV(波長350-500nm)までの光(青と紫色)を、ほぼ100%反射させることができるのが分かります。実際にDBRを蒸着すると、透明だったサンプルが青紫色の光沢がでます。InGaN活性層の光の波長は、400-450nm程度なのでこの条件で使えそうです。3.4eV以上(波長360 nm以下)の光は、GaNのバンドギャップよりも大きくなるため、GaN層に吸収されます(本計算では考慮していない)。

 VCSEL用のソフトウエアや、MATLABのmultidiel関数を使えば、非常に簡単にかつ正確に描けます。しかし、MATLABや専門ソフトは1万円以上するので、一般家庭でも計算できるようにVBAで計算してみました。実際に、MATLABの計算結果と比較してみましたが、ほぼ同じ形状と値が出ているので、参考程度に使えると思います。さらに発展させれば、フォトニック結晶も計算できそうですね。

 実際のDBRでは、高誘電体材料であるTiO2は、アナターゼとルチル相の混在により、正確な制御が難しく、より高いindexを持つTa2O5が優位とされています。SiO2/TiO2の代わりにAlN/GaNとすれば、BottomのDBRの反射率も計算できます。30層は要りそうですね(一日成長?)。


Option Explicit

'=======【 標準モジュール 】============
' ※ 直接[Real, Imag, Value]へ値を代入しない事!
'    変数は初期化し、値の代入は必ず[CompSet, CompSetStr]で行なう事
Public Type Complex
    Real As Double     '実数部
    Imag As Double     '虚数部
    Value As String    '複素数表示
End Type

'<< 初期化 >>
Public Function CompInit() As Complex
Dim CmpWK As Complex
    CmpWK.Real = 0
    CmpWK.Imag = 0
    CmpWK.Value = "0"
    CompInit = CmpWK
End Function

'<< 加算 >>
Public Function CompSum(ByRef Cmp1 As Complex, ByRef Cmp2 As Complex) As Complex
Dim CmpWK As Complex
    CmpWK.Real = Cmp1.Real + Cmp2.Real
    CmpWK.Imag = Cmp1.Imag + Cmp2.Imag
    CmpWK.Value = CompStr(CmpWK)
    CompSum = CmpWK
End Function

'<< 引算 >>
Public Function CompDiff(ByRef Cmp1 As Complex, ByRef Cmp2 As Complex) As Complex
Dim CmpWK As Complex
    CmpWK.Real = Cmp1.Real - Cmp2.Real
    CmpWK.Imag = Cmp1.Imag - Cmp2.Imag
    CmpWK.Value = CompStr(CmpWK)
    CompDiff = CmpWK
End Function

'<< 乗算 >>
Public Function CompMult(ByRef Cmp1 As Complex, ByRef Cmp2 As Complex) As Complex
Dim CmpWK As Complex
    CmpWK.Real = Cmp1.Real * Cmp2.Real - Cmp1.Imag * Cmp2.Imag
    CmpWK.Imag = Cmp1.Real * Cmp2.Imag + Cmp1.Imag * Cmp2.Real
    CmpWK.Value = CompStr(CmpWK)
    CompMult = CmpWK
End Function

'<< 除算 >>
Public Function CompDiv(ByRef Cmp1 As Complex, ByRef Cmp2 As Complex) As Complex
Dim CmpWK As Complex
Dim dblDIV As Double
    If (Cmp2.Real = 0) And (Cmp2.Imag = 0) Then
        '初期化されていない可能性もあるので[Value = "0"]では比較しない
        CmpWK.Real = 0
        CmpWK.Imag = 0
    Else
        dblDIV = (Cmp2.Real ^ 2) + (Cmp2.Imag ^ 2)
        CmpWK.Real = ((Cmp1.Real * Cmp2.Real) _
                    + (Cmp1.Imag * Cmp2.Imag)) / dblDIV
        CmpWK.Imag = ((Cmp1.Imag * Cmp2.Real) _
                    - (Cmp1.Real * Cmp2.Imag)) / dblDIV
    End If
    CmpWK.Value = CompStr(CmpWK)
    CompDiv = CmpWK
End Function

'<< 共役複素数 >>
Public Function CompCnj(ByRef Cmp1 As Complex) As Complex
Dim CmpWK As Complex
    CmpWK.Real = Cmp1.Real
    CmpWK.Imag = (-1) * Cmp1.Imag
    CmpWK.Value = CompStr(CmpWK)
    CompCnj = CmpWK
End Function

'<< 絶対値 >>
Public Function CompAbs(ByRef Cmp1 As Complex) As Complex
Dim CmpWK As Complex
    CmpWK.Real = Sqr(Cmp1.Real ^ 2 + Cmp1.Imag ^ 2)
    CmpWK.Imag = 0
    CmpWK.Value = CompStr(CmpWK)
    CompAbs = CmpWK
End Function

'<< 複素数 生成(実数/虚数 指定) >>
Public Function CompSet(ByVal Real As Double, ByVal Imag As Double) As Complex
Dim CmpWK As Complex
    CmpWK.Real = Real
    CmpWK.Imag = Imag
    CmpWK.Value = CompStr(CmpWK)
    CompSet = CmpWK
End Function

'<< 複素数 生成(複素数 表示) >>
Public Function CompSetStr(ByVal CmpStr As String) As Complex
Dim i As Integer
Dim cntP As Integer
Dim cntM As Integer
Dim cntI As Integer
Dim strReal As String
Dim strImag As String
Dim CmpWK As Complex

    For i = 1 To Len(CmpStr)
        Select Case Mid(CmpStr, i, 1)
          Case "+": cntP = cntP + 1
          Case "-": cntM = cntM + 1
          Case "i": cntI = cntI + 1
          Case "."
          Case "0" To "9"
          Case Else
            cntI = cntI + 2  'Errにする為
        End Select
    Next i

    If (cntP > 2) Or (cntM > 2) Or ((cntP + cntM) > 2) Then
        GoTo Err
    ElseIf (cntI > 1) Or _
           ((cntI = 1) And (Right(CmpStr, 1) <> "i")) Then
        GoTo Err
    ElseIf ((cntP + cntM) = 2) Then
        Select Case Left(CmpStr, 1)
          Case "+", "-"
          Case Else
            GoTo Err
        End Select
    End If

    Select Case (cntP + cntM)
      Case 0
        If (cntI = 0) Then      '正の実数のみ
            strReal = CmpStr
            strImag = ""
        Else                    '正の虚数のみ
            strReal = ""
            strImag = CmpStr
        End If
      Case 1
        If (cntI = 0) Then      '(正)/負の実数のみ
            strReal = CmpStr
            strImag = ""
        Else                    '(正)の実数と正/負の虚数
            i = InStr(CmpStr, "+")
            If (i = 0) Then
                i = InStr(CmpStr, "-")
            End If
            strReal = Left(CmpStr, i - 1)
            strImag = Mid(CmpStr, i)
        End If
      Case 2                    '正/負の実数と正/負の虚数
        i = InStr(2, CmpStr, "+")
        If (i = 0) Then
            i = InStr(2, CmpStr, "-")
        End If
        strReal = Left(CmpStr, i - 1)
        strImag = Mid(CmpStr, i)
    End Select

    CmpWK.Real = Val(strReal)
    Select Case strImag
      Case ""
        CmpWK.Imag = 0
      Case "i", "+i"
        CmpWK.Imag = 1
      Case "-i"
        CmpWK.Imag = -1
      Case Else
        strImag = Left(strImag, Len(strImag) - 1)
        CmpWK.Imag = Val(strImag)
    End Select
    CmpWK.Value = CompStr(CmpWK)
    CompSetStr = CmpWK
    Exit Function
Err:
    CmpWK.Real = 0
    CmpWK.Imag = 0
    CmpWK.Value = CompStr(CmpWK)
    CompSetStr = CmpWK
End Function

'<< 複素数表現(文字列) >>
Private Function CompStr(ByRef Cmp1 As Complex) As String
    If (Cmp1.Real = 0) And (Cmp1.Imag = 0) Then
        CompStr = "0"
    ElseIf (Cmp1.Imag = 0) Then
        CompStr = CStr(Cmp1.Real)
    ElseIf (Cmp1.Real = 0) Then
        Select Case Cmp1.Imag
          Case 1
            CompStr = "i"
          Case -1
            CompStr = "-i"
          Case Else
            CompStr = CStr(Cmp1.Imag) & "i"
        End Select
    Else
        Select Case Cmp1.Imag
          Case 1
            CompStr = CStr(Cmp1.Real) & "+i"
          Case -1
            CompStr = CStr(Cmp1.Real) & "-i"
          Case Is < 0
            CompStr = CStr(Cmp1.Real) & CStr(Cmp1.Imag) & "i"
          Case Else
            CompStr = CStr(Cmp1.Real) & "+" & CStr(Cmp1.Imag) & "i"
        End Select
    End If
End Function

'ここからメイン
Sub test()
    Dim Nc(2000), Nl(2000), Nh(2000) As Double
    Dim x, y, i, W, Na, L, H, m, Dl, Dh As Double
    Dim Rm, Rb, Rt, R, S, T, Z As Double
    Dim Pi As Double
    Dim Vo As Complex
    Dim Vm As Complex
    Dim Val As Complex
    Dim Vah As Complex
    Dim Vb As Complex
    Dim Vmb As Complex
    Dim Vr As Complex
    Dim Vt As Complex
    Dim Vrt As Complex
    Dim Vz As Complex
    Dim Vmm As Complex
    Dim Vmu As Complex
    Dim Vmv As Complex
    Dim V(2000) As Complex
    Dim U(2000) As Complex
    Dim Vmp As Complex
    Dim Vp As Complex
    Dim Vmq As Complex
    Dim Vq As Complex

    Pi = Application.WorksheetFunction.Pi()

    Vo = CompInit
    Vm = CompInit
    Val = CompInit
    Vah = CompInit

    Vb = CompInit
    Vmb = CompInit
    Vr = CompInit
    Vt = CompInit
    Vrt = CompInit
    Vz = CompInit

    Vmm = CompInit
    Vmu = CompInit
    Vmv = CompInit
    V(2000) = CompInit
    U(2000) = CompInit

    Vmp = CompInit
    Vp = CompInit
    Vmq = CompInit
    Vq = CompInit

    For x = 1 To 1000

        y = 0.29 + x / 1000
        W = Cells(2, 8)
        Na = 1 'air
   
        Nc(y) = Sqr(3.6 + 1.75 * y ^ 2 / (y ^ 2 - 0.256 ^ 2) + 4.1 * y ^ 2 / (y ^ 2 - 17.86 ^ 2)) 'GaN
        Nl(y) = 1.553 - 0.249 * y + 0.2573 * y ^ 2 - 0.113 * y ^ 3 + 0.0178 * y ^ 4 'SiO2 single layer
        Nh(y) = 0.2 + Sqr(3.6 + 1.75 * y ^ 2 / (y ^ 2 - 0.256 ^ 2) + 4.1 * y ^ 2 / (y ^ 2 - 17.86 ^ 2)) 'TiO2 single layer(4eV付近のデータが見つからなかったため、GaNの関数を参考にしている。適切ではない)
   
        L = Nl(W) 'SiO2 index
        H = Nh(W) 'TiO2 index
        Cells(3, 5) = L
        Cells(2, 5) = H
        Dl = W / (4 * L) 'SiO2 thickness, 300um
        Dh = W / (4 * H) 'TiO2 thickness, 300um
        Cells(3, 6) = Dl
        Cells(2, 6) = Dh
        m = Cells(2, 7) 'period
   
        Rt = (Nc(y) - Nl(y)) / (Nc(y) + Nl(y)) 'reflectivity between air and siO2
        Rm = (Nl(y) - Nh(y)) / (Nl(y) + Nh(y)) ' reflectivity between siO2 and TiO2
        Rb = (Nh(y) - Na) / (Nh(y) + Na) 'reflectivity between TiO2 and GaN
   
        Vo = CompSet(1, 0)
        Vm = CompSet(Rm, 0)
        Vb = CompSet(Rb, 0)
        Vmb = CompMult(Vm, Vb)
        Val = CompSet(Cos((4 * Pi * Nl(y) * Dl / y)), Sin((4 * Pi * Nl(y) * Dl / y)))
        Vah = CompSet(Cos((4 * Pi * Nh(y) * Dh / y)), Sin((4 * Pi * Nh(y) * Dh / y)))
        Vr = CompDiv(CompSum(Vm, CompMult(Vb, Vah)), CompSum(Vo, CompMult(Vmb, Vah)))
       
        Vmm = CompSet(-Rm, 0)

        If m > 1 Then
        For i = 1 To m
            Vmv = CompMult(V(i - 1), Vmm)
            Vmu = CompMult(U(i), Vm)
         
             V(0) = Vr
             U(i) = CompDiv(CompSum(Vmm, CompMult(V(i - 1), Val)), CompSum(Vo, CompMult(Vmv, Val)))
             V(i) = CompDiv(CompSum(Vm, CompMult(U(i), Vah)), CompSum(Vo, CompMult(Vmu, Vah)))
        Next
   
            Vmp = CompMult(V(m), Vmm)
            Vp = CompDiv(CompSum(Vmm, CompMult(V(m), Val)), CompSum(Vo, CompMult(Vmp, Val)))
       
            Vmq = CompMult(Vp, Vm)
            Vq = CompDiv(CompSum(Vm, CompMult(Vp, Vah)), CompSum(Vo, CompMult(Vmq, Vah)))
        Else
            Vq = Vr
        End If
   
        Vt = CompSet(Rt, 0)
        Vrt = CompMult(Vq, Vt)
        Vz = CompDiv(CompSum(Vt, CompMult(Vq, Val)), CompSum(Vo, CompMult(Vrt, Val)))
   
        Cells(x + 1, 1) = 1.2398 / y
        Cells(x + 1, 2) = (CompAbs(Vz).Value) ^ 2 * 100
   
        Cells(x + 1, 12) = Nc(y) 'GaNのindex
        Cells(x + 1, 13) = Nl(y)'SiO2
        Cells(x + 1, 14) = Nh(y)'TiO2
    Next

End Sub