• 検索結果がありません。

回転変換 ( 非平行平面間の回折伝搬計算 )

ドキュメント内 Wave Field Library (WFL) Polygon Source Library (PSL) (ページ 51-54)

第 2 章 チュートリアル 37

2.5 回転変換 ( 非平行平面間の回折伝搬計算 )

め,その光の発散を利用してレンズ面での光の面積を広げるためである.これが,このシミュレーションを「簡易的」

と表現する理由である.

この画像からの光はレンズに到達するまでにかなり拡散するので,13行でEmbed()メンバー関数により8×8倍に サンプリングエリアを拡大しておく.

次に1619行目でオブジェクトbにレンズを作成している.レンズは円形としてその瞳をSetGaussian()メン バー関数を用いて100次のスーパーガウス関数で設定する.またSetQuadraticPhase()メンバー関数を用いて焦点 距離10mmのレンズとして働く2次位相を与えている.

2532行では,レンズへの入射光aとレンズ透過度bを乗算した結果を再びbに格納し,ExactAsmProp()メン バー関数でbをレンズから20mm離れたスクリーン位置まで伝搬した後,サンプリング領域を縮小してから保存して いる.この結果を図 2.12(b)に示している.ここでは,円形瞳のサイズを変えた結果を示してある.光学の教科書が教 えるとおり,結像は倒立像となり,また瞳のサイズを縮小するとボケが強くなる.

R = 1 mm R = 0.5 mm R = 0.2 mm

(a)原画像 (b)再⽣像

図2.12 レンズによる結像シミュレーションの結果.(a)現画像,(b)様々な瞳半径における再生像.

Note

上記のソースプログラムでは,20行目でWaveFieldクラスのSaveAsWf()メンバー関数を用いて,WF形式で 保存を行っている.WF形式は光波の複素振幅分布の保存形式であり,波長等の補助データも含み,WaveField のオブジェクトを一時保管するのに都合が良いようにデザインされている.WF 形式で保存したデータは WaveFieldクラスのLoadWf()メンバー関数で再びWaveFieldオブジェクトに読み込むことができる.また,

WaveFrontアプリケーションを用いることにより,グラフィカルユーザーインターフェースを用いてWF形式

の光波の振幅像,強度像,位相像などを簡単に観察できるだけではなく,簡易的なシミュレーションを行うこと もできる.

2.5 回転変換 ( 非平行平面間の回折伝搬計算 )

回転変換は,あるサンプリング平面で与えられる光波を傾いた別のサンプリング平面で観測した結果を与える.すな わち,回転変換は平行ではない平面間の回折伝搬計算と考えられる.

2.5.1 傾いた平面上で得られる円形開口からの回折像 ( キャリア位相を無視 )

次のソースコード例は,直径0.5 mmの円形開口からの回折像を45傾いた平面上で計算するプログラムである.こ こで,回折像を得る平面を観測面と呼ぶことにする.観測面が伝搬元のサンプリング平面に対して大きく傾いている場 合には,一般に観測面での光波のキャリア周波数が高くなるため,位相像では容易にエイリアシングが発生する.しか し,傾いた平面上での回折像(振幅像または強度像)にのみ興味がある場合には,位相を無視して回折像のみを求める ことができる.

Example 円形開口からのキャリア位相を無視した回折像計算(ソース: ExRotationalTransform-a.cpp)

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 u0 (2048 , 2048 , 0.5 e - 6 ) ; //サンプリング数2 K 2 K, 間 隔0 .5μmの フ ィ ー ル ド 8 u0 . S e t G a u s s i a n ( 0 . 2 5 e -3 , 5 0 ) ; //開口の生成

9 u0 . E x a c t A s m P r o p (6 e - 3 ) ; // 6 m mの 並 進 伝 搬 計 算

10 u0 . S a v e A s W f ( " P a r a l l e l . wf " ); //伝搬元フィールドの保存

11 R M a t r i x mat = C R M a t r i x Y ( 4 5 * DEG ); // y軸 周 り に4 5度 座 標 回 転 す る 変 換 行 列

12 W a v e F i e l d u1 (2048 , 2048 , 0.5 e - 6 ) ; //伝搬先フィールド

13 u1 . R o t a t e ( u0 , mat ); //回転変換の実行(キ ャ リ ア 位 相 は 無 視 す る)

14 u1 . S a v e A s W f ( " R o t a t i o n . wf " ); //伝搬先フィールドの保存 15 }

振幅像 位相像

図2.13 開口から6mm伝搬した時の回折光波(Parallel.wf)

ここで,9行で円形開口からの光波を開口から6mm平面上で求め,次に13行でy軸の周りに45傾いた平面上で の光波を求めている.回転角を設定するために,11行目でRMatrix型の回転行列matを設定している.ここではy軸 周りの座標回転の変換行列を与える関数wfl::CRMatrixY()関数を用いてる.回転変換行列には,座標位置を回転する 行列RMatrixY()関数と,座標系を回転する行列CRMatrixY()関数があることに注意しなければならない.回転変換 で観測面を傾けるためには後者の座標系を回転する行列が必要である.なお,これらの関数の引数の角度の単位はラジ アンである.11行目で用いているDEGはマクロであり,π/180の値に展開されるので,DEGを乗算することによりラ ジアン単位の角度が得られる.計算の結果を図2.14に示す.

振幅像 位相像

図2.14 45傾いた観測面での回折像(Rotation.wf)

複数の軸の周りに回転する場合は,回転行列を乗算する.例えば,まずx軸の周りに15回転し,次にy軸の周りに

2.5 回転変換(非平行平面間の回折伝搬計算) 53 45回転する場合には,11行目は

RMatrix mat = CRMatrixY(45*DEG)*CRMatrixX(15*DEG);

となる.

Note

回転変換で用いる回転行列には,文字Cで始まる座標回転行列を用いる.

座標系として右手系を用いるので,座標軸周りの回転の向きは右ねじの向きであり,また角度の単位はラジアン である.

2.5.2 傾いた平面上で得られる円形開口からのキャリア位相を含む回折光波

次のソースコード例は,前節と同様,直径0.5 mmの円形開口からの回折像を45傾いた平面上で計算するプログラ ムである.しかし,ここでは回折光波をさらに伝搬するような場合を想定し,キャリア周波数を正しく反映した結果を 得ている.

振幅像 位相像

図2.15 45傾いた観測面でのキャリア位相を含む回折光波(Rotation-c.wf)

Example 円形開口からのキャリア位相を含む回折光波計算(ソース: ExRotationalTransform-b.cpp)

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 u0 (2048 , 2048 , 0.5 e - 6 ) ; //サンプリング数2 K 2 K, 間 隔0 .5μmの フ ィ ー ル ド 8 u0 . S e t G a u s s i a n ( 0 . 2 5 e -3 , 5 0 ) ; //開口の生成

9 u0 . E x a c t A s m P r o p (6 e - 3 ) ; // 6 m mの 並 進 伝 搬 計 算

10 u0 . S a v e A s W f ( " P a r a l l e l . wf " ); //伝搬元フィールドの保存

11 R M a t r i x mat = C R M a t r i x Y ( 4 5 * DEG ); // y軸 周 り に4 5度 座 標 回 転 す る 変 換 行 列

12 W a v e F i e l d u1 (2048 , 2048 , 0.5 e - 6 ) ; //伝搬先フィールド

13

14 S F r e q u e n c y cal ; //キャリア周波数を入れる変数

15 u1 . R o t a t e ( u0 , mat , & cal ); //回転変換の実行(キ ャ リ ア 周 波 数 がc a lに 入 る)

16 u1 . M u l t i p l y P l a n e W a v e ( cal ); //得られたキャリア周波数の平面波を乗算する

17

18 u1 . S a v e A s W f ( " R o t a t i o n - c . wf " ); //伝搬先フィールドの保存 19 }

14 行目からが異なる部分である.Rotate()メンバー関数に第 3 の引数として SFrequency 型の変数のポイ ン タ を 与 え る と ,関 数 終 了 時 に は 回 転 変 換 で 除 去 し た キ ャ リ ア 周 波 数 が そ の 変 数 に 代 入 さ れ る .16 行 目 で は MultiplyPlaneWave()メンバー関数を用いて,このキャリア周波数の平面波を乗算している.これにより,Rotate() メンバー関数内で除去されたキャリアを復旧することができる.計算の結果を図2.15に示す.図2.14と比べると,振 幅像に違いはないが,位相像にはキャリア成分がのっていることがわかる.

ドキュメント内 Wave Field Library (WFL) Polygon Source Library (PSL) (ページ 51-54)