Opticalpy
前回、光線解析ライブラリOpticalpyでの回折格子の設定方法を紹介しました。

今回はOpticalpyで波長フィルタの設定方法を紹介します。
今回は波長フィルタということで透過や反射後の波長が変わりますので、前回同様複数の波長を含んだ光源をこんな感じで設定してみました。
import opticalpy as op
import numpy as np
scene = op.Scene(xlim=(-50, 250), ylim=(-100, 100))
beam = op.elems.DivergingBeam(angle=20, wavelength=np.arange(400, 701, 10), scene=scene)
scene.plot()
実行結果

それでは始めていきましょう。
Filter
まずは「op.elems.Filter」を使って、光学フィルタを配置してみましょう。
使い方は「Filter(aperture=フィルタのサイズ, pivot=透過波長, bandwidth=波長幅, scene=シーン, origin=[Xの位置, Yの位置], rotation=フィルタの角度)」です。
import opticalpy as op
import numpy as np
scene = op.Scene(xlim=(-50, 250), ylim=(-100, 100))
beam = op.elems.DivergingBeam(angle=20, wavelength=np.arange(400, 701, 10), scene=scene)
filter1 = op.elems.Filter(aperture=10, pivot=600, bandwidth=20, scene=scene, origin=[100,0], rotation=90)
scene.plot()
実行結果

上記の例の場合、波長600 nm ± 10 nm(=波長幅 20 nm)が透過波長です。
複数枚のフィルタを直列的、もしくは並列的に並べることも可能で、こんな感じのフィルタリングをすることもできます。
import opticalpy as op
import numpy as np
scene = op.Scene(xlim=(-50, 250), ylim=(-100, 100))
beam = op.elems.DivergingBeam(angle=20, wavelength=np.arange(400, 701, 10), scene=scene)
filter1 = op.elems.Filter(aperture=50, pivot=550, bandwidth=200, scene=scene, origin=[100,0], rotation=90)
filter2 = op.elems.Filter(aperture=10, pivot=350, bandwidth=50, scene=scene, origin=[150,25], rotation=90)
filter3 = op.elems.Filter(aperture=10, pivot=450, bandwidth=50, scene=scene, origin=[150,12.5], rotation=90)
filter4 = op.elems.Filter(aperture=10, pivot=550, bandwidth=50, scene=scene, origin=[150,0], rotation=90)
filter5 = op.elems.Filter(aperture=10, pivot=650, bandwidth=50, scene=scene, origin=[150,-12.5], rotation=90)
filter5 = op.elems.Filter(aperture=10, pivot=750, bandwidth=50, scene=scene, origin=[150,-25], rotation=90)
scene.plot()
実行結果

この例の場合、1段目のフィルタは550 ± 100 nm、つまり450 nmから650 nmまで透過します。
2段目のフィルタの一番上は350 ± 50 nmなので325 nmから375 nmまでを透過しますが、1段目のフィルタでその波長はカットオフされているため、このフィルタの後には光は出てこないため、光線は描かれません。
2段目のフィルタの上から2枚目、3枚目、4枚目はそれぞれ450 ± 25 nm、550 ± 25 nm、650 ± 25 nmであり、これらは1枚目のフィルタで透過している波長であるため、それぞれの透過波長の光が透過されます。
2段目のフィルタの一番下は750 ± 50 nmで、こちらは一番上のフィルタと同様1段目のフィルタでその波長がカットオフされているため、光線は描かれません。
Dichroic
「op.elems.Dichroic」はダイクロイックミラーで、特定の波長以上の光、もしくは以下の光を反射したり、透過したりする光学素子です。
使い方は「Dichroic(aperture=ミラーのサイズ, cutoff=カットオフ波長, reflectAbove= カットオフ波長以上の光を反射するか透過するか, scene=シーン, origin=[Xの位置, Yの位置], rotation=フィルタの角度)」です。
import opticalpy as op
import numpy as np
scene = op.Scene(xlim=(-50, 250), ylim=(-100, 100))
beam = op.elems.DivergingBeam(angle=20, wavelength=np.arange(400, 701, 10), scene=scene)
dichroic1 = op.elems.Dichroic(aperture=50, cutoff=650, reflectAbove=False, scene=scene, origin=[100,0], rotation=45)
scene.plot()

この場合、カットオフ波長が650 nm、reflectAboveがFalseになっているので、650 nm以下の波長の光が反射され、それ以上の光が透過されます。
このreflectAboveは分かりにくいので、カットオフ波長を701 nm、つまりこの光源に含まれる波長の上限以上にするとどうなるか見てみましょう。
import opticalpy as op
import numpy as np
scene = op.Scene(xlim=(-50, 250), ylim=(-100, 100))
beam = op.elems.DivergingBeam(angle=20, wavelength=np.arange(400, 701, 10), scene=scene)
dichroic1 = op.elems.Dichroic(aperture=50, cutoff=701, reflectAbove=False, scene=scene, origin=[100,0], rotation=45)
scene.plot()
実行結果

全ての光は反射されたことで、カットオフ波長以下の光が反射されたことが分かります。
次にこのまま「reflectAbove=True」としてみます。
import opticalpy as op
import numpy as np
scene = op.Scene(xlim=(-50, 250), ylim=(-100, 100))
beam = op.elems.DivergingBeam(angle=20, wavelength=np.arange(400, 701, 10), scene=scene)
dichroic1 = op.elems.Dichroic(aperture=50, cutoff=701, reflectAbove=True, scene=scene, origin=[100,0], rotation=45)
scene.plot()
実行結果

こちらは全て透過されたことで、reflectAboveはやはりカットオフ波長以下の光を、Falseだと反射、Trueだと透過することが分かります。
次回はOpticalpyのミラーの設定方法を紹介します。
ではでは今回はこんな感じで。
コメント