第 3 章 リファレンス 51
3.2 WaveField クラス
3.2.18 光波伝搬 ( 回折 ) に関するメンバー関数
WaveField& AsmProp(double d) 戻り値 対象オブジェクトへの参照
説 明 高速畳み込みを用いた帯域制限角スペクトル法[4]により,距離d[m]だけ光波を伝搬(回折)
する.Fresnel近似のような伝搬距離dに関する制約はないが,この関数では円状畳み込みである
ため,数10cm以上伝搬するとエリアシング誤差を生じる場合が多い.
Note
• より正確な伝搬結果が必要な場合はこの関数の呼び出し前にEmbed()メンバー関数でサンプリン グ領域を4倍拡張して呼出し後にExtract()メンバー関数を用いるか(サンプルコード参照),こ れらを一括して行うExactAsmProp()メンバー関数を用いる.
• ExactAsmProp()メンバー関数は正確な伝搬結果を与えるが,一方この関数の方が演算が高速であ り,必要なメモリ容量も約1/4という利点がある.
• この計算法では伝搬後のサンプリング間隔は伝搬前と変化しない.
Example高速・コンパクトだが誤差が多い計算 W a v e F i e l d wf ;
wf . L o a d L w ( " s a m p l e . lw " );
wf . A s m P r o p (10 e - 3 ) ; //角スペクトル法による回折計算
wf . N o r m a l i z e ();
wf . S a v e A s L w ( " s a m p l e 1 . lw " ); //正規化して保存
Example正確な計算 W a v e F i e l d wf ;
wf . L o a d L w ( " s a m p l e . lw " );
wf . E m b e d ( 1 ) ; //4倍拡張
wf . A s m P r o p (10 e - 3 ) ; //角スペクトル法による回折計算
wf . E x t r a c t (1) //4分の1縮小
wf . N o r m a l i z e ();
wf . S a v e A s L w ( " s a m p l e 1 . lw " ); //正規化して保存
WaveField& AsmPropFs(double d) 戻り値 対象オブジェクトへの参照
説 明 帯域制限角スペクトル法[4]により,フーリエ空間にあるオブジェクト(スペクトル状態)を距 離d[m]だけ伝搬(回折)する.したがってオブジェクトはスペクトルでなければならない.フー リエ空間で追加の処理が必要な場合にはこの関数が便利である.Fresnel近似のような伝搬距離d に関する制約はないが,数10cm以上伝搬するとエリアシング誤差を生じる場合が多い.
Note
• AsmProp() メンバー関数と同様,より正確な伝搬結果が必要な場合は FFT の呼び出し前に
Embed()メンバー関数でサンプリング領域を拡張して逆FFTの後にExtract()メンバー関数を
96 第3章 リファレンス 用いる.
• この計算法では伝搬後のサンプリング間隔は伝搬前と変化しない.
Example
W a v e F i e l d wf ;
wf . L o a d L w ( " s a m p l e . lw " );
wf . Fft ( -1); //フーリエスペクトルに変換する
wf . A s m P r o p F s (10 e - 3 ) ; //角スペクトル法による回折計算
wf . Fft ( 1 ) ; //複素振幅に戻す
wf . N o r m a l i z e ();
wf . S a v e A s L w ( " s a m p l e 1 . lw " ); //正規化して保存
WaveField& ExactAsmProp(double d) 戻り値 対象オブジェクトへの参照
説 明 高速畳み込みを用いた帯域制限角スペクトル法[4]により,距離d[m]だけ光波を伝搬(回折)
する.Fresnel近似のような伝搬距離dに関する制約はない.またAsmProp()メンバー関数と異
なり,この関数では線状畳み込みをおこなうため伝搬に伴うエリアシング誤差は生じない.
Note
• この関数はAsmProp()メンバー関数に比べて正確な伝搬結果を与えるが,演算中に一時的に必要 なメモリ容量が4倍であり,その分計算も遅い問題点があり,ラフな計算ではAsmProp()メン バー関数で十分であることも多い.
• この計算法では伝搬後のサンプリング間隔は伝搬前と変化しない.
Example
W a v e F i e l d wf ;
wf . L o a d L w ( " s a m p l e . lw " );
wf . E a c t A s m P r o p (10 e - 3 ) ; //正確な角スペクトル法による回折計算
wf . N o r m a l i z e ();
wf . S a v e A s L w ( " s a m p l e 1 . lw " ); //正規化して保存
WaveField& ShiftedAsmProp(const WaveField& source, int prec = 1) 戻り値 対象オブジェクトへの参照
説 明 sourceオブジェクトを精度指数precのシフテッド角スペクトル法 [5]で伝搬した結果を対
象のオブジェクトに代入する.
Note
• この関数では二つのオブジェクトの原点のグローバルなx,y位置がずれていてもかまわない.
• 伝搬距離はsourceオブジェクトと対象オブジェクトのローカル原点のグローバルz値の差から自 動的に計算される.
• サンプリングピッチPx,Pyとサンプリング数は同一でなければならない.
• この関数は,ShiftedFresnelProp()メンバー関数と異なり,近距離の伝搬計算でも正しい結果 を得ることができる.その半面,ある程度距離の長い伝搬ではShiftedFresnelProp()メンバー
関数の方が計算精度が高いことが多い.
• 精度指数precは通常1である.1以上の値を設定した場合,計算精度は向上するが,2のprec乗 のサンプリング数拡張を行うので,メモリ消費量が増加し計算速度が低下する.
Example
W a v e F i e l d a , b ; a . L o a d L w ( " i n p u t . lw " );
b . C o p y P a r a m ( a );
a . S e t O r i g i n ( V e c t o r (0 , 0 , 0 ) ) ; // aの 原 点 は グ ロ ー バ ル 座 標(0 , 0 , 0)
b . S e t O r i g i n ( V e c t o r (10 e -3 , 10 e -3 , 50 e - 3 ) ) ; // bの 原 点 は グ ロ ー バ ル 座 標(10 , 10 , 5 0 ) [ mm ]
b . S h i f t e d A s m P r o p ( a ); // aをbの 位 置 に 伝 搬 し た 結 果 をbに 入 れ る .
b . S a v e A s L w ( " r e s u l t . lw " );
WaveField& ShiftedAsmPropAdd(const WaveField& source, int prec = 1) 戻り値 対象オブジェクトへの参照
説 明 sourceオブジェクトを精度指数precのシフテッド角スペクトル法 [5]で伝搬した結果を対
象のオブジェクトに加算する.
Note
• 詳細はShiftedAsmProp()メンバー関数参照.
• サンプリングピッチPx,Pyとサンプリング数は同一でなければならない.
WaveField& ShiftedAsmPropEx(const WaveField& source) 戻り値 対象オブジェクトへの参照
説 明 sourceオブジェクトをシフテッド角スペクトル計算法により伝搬した結果を対象のオブジェ
クトに代入する.サンプリング数可変型.
Note
• この関数ではShiftedAsmProp()メンバー関数とは異なり,伝搬元のsourceオブジェクトと伝 搬先の対象オブジェクトは異なったサンプリング数でもよい.
WaveField& ShiftedAsmPropAddEx(const WaveField& source) 戻り値 対象オブジェクトへの参照
説 明 sourceオブジェクトをシフテッド角スペクトル法 [5]により伝搬した結果を対象のオブジェ
クトに加算する.サンプリング数可変型.
Note
• この関数ではShiftedAsmPropAdd()メンバー関数とは異なり,伝搬元のsourceオブジェクト と伝搬先の対象オブジェクトは異なったサンプリング数でもよい.
98 第3章 リファレンス
WaveField& FresnelProp(double d) 戻り値 対象オブジェクトへの参照
説 明 Fresnel近似により,距離d[m]だけ光波を伝搬(回折)する.伝搬距離dにはFresnel近似の
制約がある.また,伝搬後のサンプリング間隔は伝搬前に比べて大きくなる.
WaveField& FourierProp(double f) 戻り値 対象オブジェクトへの参照
説 明 焦点距離f [m]のレンズを用いた2f セットアップによるフーリエ回折により光波を伝搬(回 折)する.回折後のサンプリング間隔は回折前とは異なる.
WaveField& BackFourierProp(double f) 戻り値 対象オブジェクトへの参照
説 明 焦点距離f[m]のレンズを用いた2f セットアップによるフーリエ回折により光波を後方伝搬 (逆回折)する.回折後のサンプリング間隔は回折前とは異なる.
WaveField& ShiftedFresnelProp(const WaveField& source)
WaveField& ShiftedFresnelProp(const WaveField& source, const ShiftedFresnelPropDescriptor& sfpd)
WaveField& ShiftedFresnelProp(const Vector& origin, double px, double py) WaveField& ShiftedFresnelProp(const Vector& origin, double px, double py, const ShiftedFresnelPropDescriptor& sfpd)
戻り値 対象オブジェクトへの参照
説 明 第 1 と 第 2 の 形 式 で は source オ ブ ジ ェ ク ト を シ フ テ ッ ド フ レ ネ ル 型 計 算 法 [6] に よ り 伝 搬 し た 結 果 を 対 象 の オ ブ ジ ェ ク ト に 代 入 す る .こ の 場 合 source オ ブ ジ ェ ク ト の 内 容 は 変 化 し な い (out-place 型).第 3 と 第 4 の 形 式 で は 対 象 オ ブ ジ ェ ク ト そ の も の を 位 置 origin,ピッチ px,py に伝搬した結果に変化させる (in-place 型).第 2 と第 4 の形式では ShiftedFresnelPropDescriptor型デスクリプタsfpdを用いた事前計算により高速化を行う.
Note
• この関数では伝搬元と伝搬先の原点のグローバルなx,y位置がずれていてもかまわない.またそ れぞれのPx,Pyが異なっていてもよい.
• out-place型での伝搬距離はsourceオブジェクトと対象オブジェクトのローカル原点のグローバ
ルz値の差から自動的に計算される.in-place型での伝搬距離は伝搬前の対象オブジェクトの原点 とoriginから計算される.
• この関数では伝搬元と伝搬先のサンプリング数は等しくなければならない.サンプリング数を変え
たい場合は ShiftedFresnelPropEx()メンバー関数あるいはShiftedFresnelAdd()メンバー 関数を用いる.
Exampleout-place型 W a v e F i e l d a , b ; a . L o a d L w ( " i n p u t . lw " );
a . S e t O r i g i n ( V e c t o r (0 , 0 , 0 ) ) ; // aの 原 点 は グ ロ ー バ ル 座 標(0 , 0 , 0)
b . S e t O r i g i n ( V e c t o r (10 e -3 , 10 e -3 , 100 e - 3 ) ; // bの 原 点 は グ ロ ー バ ル 座 標(10 , 10 , 1 0 0 ) [ mm ]
b . S h i f t e d F r e s n e l P r o p ( a ); // aをbの 位 置 に 伝 搬 し た 結 果 をbに 入 れ る .
b . S a v e A s L w ( " r e s u l t . lw " );
Exampleout-place型でデスクリプタを利用 W a v e F i e l d a ;
a . L o a d L w ( " i n p u t . lw " );
a . S e t O r i g i n ( V e c t o r (0 , 0 , 0 ) ) ; // aの 原 点 は グ ロ ー バ ル 座 標(0 , 0 , 0) d o u b l e d = 100 e -3 , px = 5 e -6 , py = 3 e -6;
S e t D e f a u l t ( a . G e t N x () , a . G e t N y () , px , py , a . G e t W a v e l e n g t h ( ) ) ; W a v e F i e l d b , c , d ;
b . S e t O r i g i n ( V e c t o r (10 e -3 , 0 , d ));
c . S e t O r i g i n ( V e c t o r ( -10 e -3 , 0 , d ));
d . S e t O r i g i n ( V e c t o r (0 , 10 e -3 , d ));
//以下で伝搬計算.重複する無駄な計算を行わないので複数伝搬で高速化
S h i f t e d F r e s n e l D e s c r i p t o r s f p d ( d , px , py , a ); //デスクリプタ構築 b . S h i f t e F r e s n e l P r o p ( a , s f p d ); // aをbに 伝 搬 c . S h i f t e F r e s n e l P r o p ( a , s f p d ); // aをcに 伝 搬 d . S h i f t e F r e s n e l P r o p ( a , s f p d ); // aをdに 伝 搬 b . S a v e A s L w ( " result - b . lw " );
c . S a v e A s L w ( " result - c . lw " );
d . S a v e A s L w ( " result - d . lw " );
Examplein-place型 W a v e F i e l d a ;
a . L o a d L w ( " i n p u t . lw " );
a . S e t O r i g i n ( V e c t o r (0 , 0 , 0 ) ) ; // aの 原 点 は グ ロ ー バ ル 座 標(0 , 0 , 0) a . S h i f t e d F r e s n e l P r o p ( V e c t o r (10 e -3 , 10 e -3 , 100 e -3 , a . G e t P x ()/2 , a . G e t P x ( ) ) ;
// aそ の も の を 伝 搬 す る a . S a v e A s L w ( " r e s u l t . lw " );
WaveField& ShiftedFresnelPropAdd(const WaveField& source, const ShiftedFresnelPropDescriptor& sfpd)
戻り値 対象オブジェクトへの参照
説 明 sourceオブジェクトをシフテッドフレネル型計算法により伝搬しそ,その結果を対象のオブ
ジェクトに加算する.
WaveField& ShiftedFresnelPropEx(const WaveField& source) 戻り値 対象オブジェクトへの参照
説 明 sourceオブジェクトをシフテッドフレネル型計算法により伝搬した結果を対象のオブジェク
トに代入する.サンプリング数可変型.
100 第3章 リファレンス Note
• この関数ではShiftedFresnelProp()メンバー関数とは異なり,伝搬元のsourceオブジェクト と伝搬先の対象オブジェクトは異なったサンプリング数でもよい.
WaveField& ShiftedFresnelPropAddEx(const WaveField& source) 戻り値 対象オブジェクトへの参照
説 明 sourceオブジェクトをシフテッドフレネル型計算法により伝搬しそ,その結果を対象のオブ
ジェクトに加算する.サンプリング数可変型.
Note
• この関数の第 1 の形式では,ShiftedFresnelPropAdd()メンバー関数とは異なり,伝搬元の
sourceオブジェクトと伝搬先の対象オブジェクトは異なったサンプリング数でもよい.