第 2 章 チュートリアル 33
2.4 伝搬回折計算
2.4.3 伝搬回折計算の応用
スリットを通過したレーザービームの回折像
単純なシミュレーションであるが,次のソースコードは,幅50µmのスリットを通過する波長532nm のレーザービームの回折像を求めるプログラムである.
Example ソースプログラム
1 # i n c l u d e < wfl . h >
2 u s i n g n a m e s p a c e wfl ;
3
4 v o i d m a i n ()
5 {
6 S t a r t ();
7 W a v e F i e l d :: S e t D e f a u l t (512 , 512 , 10 e -6 , 10 e -6 , 532 e - 9 ) ;
8 W a v e F i e l d a , b ;
9 a . S e t G a u s s i a n (1 e - 3 ) ; // 1/ eビ ー ム 径2 m mの ガ ウ ス ビ ー ム 10 b . S e t R e c t (50 e -6 , 5 e - 3 ) ; // 幅0 . 0 5 m mの ス リ ッ ト
11 b *= a ;
12 b . A s m P r o p (50 e - 3 ) ; // 距 離5 0 m m伝 搬
13 b . N o r m a l i z e ();
14 b . S a v e A s B m p ( " amp . bmp " , A M P L I T U D E );
15 b . S a v e A s B m p ( " p h a s e . bmp " , P H A S E );
48 第2章 チュートリアル
16 }
ここでは,オブジェクトaがレーザービーム,bがスリットとスリット背後の光波分布である.レー ザービームは1/e径2mmのガウスビームで,スリットの位置にビームウェストがあるとしている.そ のため,9行目でWaveFieldクラスのSetGaussian()メンバー関数を用いてその振幅分布を設定して いる.この関数では“次数”の引数を省略するとデフォルト値として2次の通常のガウス関数になる.一 方,スリットはWaveFieldクラスのSetRect()メンバー関数を用いて10行目で設定している.後は,
この両者を乗算して(11行),AsmProp()メンバー関数で回折伝搬演算している.得られた振幅分布と位 相分布を図2.11に示す.
( a ) ( b )
図2.11 スリットを通過したレーザービームの回折像.
レンズによる結像のシミュレーション
次のソースコードはレンズによる結像の簡易的な波動光学シミュレーションである.
Example レンズによる結像
1 # i n c l u d e < wfl . h >
2 u s i n g n a m e s p a c e wfl ;
3
4 v o i d m a i n ()
5 {
6 S t a r t ();
7 W a v e F i e l d :: S e t D e f a u l t (128 , 128 , 2 e - 6 ) ;
8 d o u b l e R = 0.5 e -3; // 瞳 の 半 径
9
10 // = = = = = aに 物 体 デ ー タ 読 み 込 む
11 W a v e F i e l d a ;
12 a . L o a d B m p ( " Shion - 1 2 8 gs . bmp " , A M P L I T U D E );
13 a . E m b e d ( 3 ) ; // 8 x 8倍 に 拡 張
14
15 // = = = = = bに レ ン ズ の 透 過 関 数 を 設 定 す る
16 W a v e F i e l d b ;
17 b . E m b e d ( 3 ) ; // aと 同 じ に な る よ う に 拡 張 し て お く
18 b . S e t G a u s s i a n ( R , 1 0 0 ) ; // 瞳 関 数 設 定 . 瞳 は 半 径Rの 円 形 瞳
19 b . S e t Q u a d r a t i c P h a s e (10 e - 3 ) ; // レ ン ズ の 位 相 関 数 設 定 . 焦 点 距 離 は1 0 mm
20 b . S a v e A s L w ( " l e n s . lw " ); // 確 認 の た めl w形 式 で 保 存 21
22 // = = = = = aを レ ン ズ 位 置 ま で 伝 搬 す る
23 a . A s m P r o p (20 e - 3 ) ; // レ ン ズ 位 置 は 物 体 位 置 か ら2 0 mm
24
25 // = = = = = aとbを 乗 算 す る
26 b *= a ;
27
28 // = = = = = bを ス ク リ ー ン 位 置 ま で 伝 搬 し て 縮 小 す る
29 b . A s m P r o p (20 e - 3 ) ; // ス ク リ ー ン 位 置 は レ ン ズ 位 置 か ら2 0 mm
30 b . E x t r a c t ( 3 ) ; // 1 / ( 8 * 8 )に 縮 小
31 b . N o r m a l i z e (); // 保 存
32 b . S a v e A s B m p ( " i m a g e . bmp " , A M P L I T U D E );
33 }
このソースにおける基本的なオブジェクトの役割は,aがレンズ前方の物体像,bがレンズとレンズ後 方の像である.まず,11∼13行で物体像をaに設定している.ここでは,物体は図 2.12(a)に示すよう な,平面画像である.印画紙に焼き付けた本来の写真であれば,外光の反射によりそれ自体が拡散性のあ る光を発している.そのような散乱性のある光をシミュレーションするのは簡単ではないので,ここで は,この画像はピクセルピッチが2µmの極めて小さな画像としている(画像サイズ25.6×25.6µm2のマ イクロ画像!).これは,画像が小さいとそれそのものによる回折が強く生じるため,その光の発散を利用 してレンズ面での光の面積を広げるためである.これが,このシミュレーションを「簡易的」と表現する 理由である.
この画像からの光はレンズに到達するまでにかなり拡散するので,13行でEmbed()メンバー関数によ り8×8倍にサンプリングエリアを拡大しておく.
次 に 16 ∼ 19 行 目 で オ ブ ジ ェ ク ト b に レ ン ズ を 作 成 し て い る .レ ン ズ は 円 形 と し て そ の 瞳 を SetGaussian() メ ン バ ー 関 数を 用 い て 100 次 の ス ー パ ー ガ ウ ス 関 数 で 設 定 す る .ま た SetQuadraticPhase()メンバー関数を用いて焦点距離 10mmのレンズとして働く2次位相を与えて いる.
25∼32行では,レンズへの入射光aとレンズ透過度bを乗算した結果を再びbに格納し,AsmProp() メンバー関数でbをレンズから20mm離れたスクリーン位置まで伝搬した後,サンプリング領域を縮小 してから保存している.この結果を図 2.12(b)に示している.ここでは,円形瞳のサイズを変えた結果を 示してある.光学の教科書が教えるとおり,結像は倒立像となり,また瞳のサイズを縮小するとボケが強 くなる.
( a )
( b )
R = 1 m m R = 0 . 5 m m R = 0 . 2 m m
図2.12 レンズによる結像シミュレーションの結果.(a)現画像,(b)様々な瞳半径における再生像.
Note
• 上記のソースプログラムでは,20行目でWaveFieldクラスのSaveAsLw()メンバー関数を用い て,LW形式で保存を行っている.LW形式は複素振幅画像の保存形式であり,波長等の補助デー タも含み,WaveFieldのオブジェクトを一時保管するのに都合が良いようにデザインされている.
LW形式で保存したデータはWaveFieldクラスのLoadLw()メンバー関数で再びWaveFieldオブ
50 第2章 チュートリアル ジェクトに読み込むことができる.また,WaveFrontアプリケーションを用いることにより,グ ラフィカルユーザーインターフェースを用いてLW形式の光波の振幅像,強度像,位相像などを簡 単に観察できるだけではなく,簡易的なシミュレーションを行うこともできる.