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

WaveField クラスを 2 次元複素振幅分布として利用する

第 2 章 チュートリアル 33

2.3 WaveField クラスを 2 次元複素振幅分布として利用する

38 第2章 チュートリアル

とから,Normalize()メンバー関数があってもなくても振幅分布は真っ白な画像になる.

Note

球面波はz値によっては容易にエイリアシング誤差を発生するため,本来は最大回折角の範囲で窓 関数を用いなければならない.この例ではz値が大きいためその必要がなく,簡単なソースとなっ ている.

WaveFieldライブラリにはAddSphericalWaveSqr()メンバー関数等,球面波を高速に計算する

ための関数が複数用意されている.

2.2 球面波の位相分布画像(SphericalWave-phs.bmp)

2.3.2 2 次元矩形関数のフーリエ変換

以下は,幅が縦横とも1であるような矩形関数のフーリエ変換を求める例である.

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 ( v o i d )

5 {

6 S t a r t ();

7 W a v e F i e l d a (512 , 512 , 0 . 1 ) ; // 512 x 5 1 22次 元 分 布

8 a . S e t R e c t (1.0 , 1 . 0 ) ; // 縦 横1の 矩 形 関 数 をaに 設 定

9 a . Fft ( -1); // フ ー リ エ 変 換

10 a . N o r m a l i z e ();

11 a . S a v e A s B m p ( " RectFFT - amp . bmp " , A M P L I T U D E , C O L O R );

12 }

この例では11行目のSaveAsBmp()メンバー関数でグラデーションとしてGradation列挙型COLOR を指定しているため,カラースケールで保存されている.実際の画像を図2.3に示す.グラデーションと してカラースケールを指定した場合には,デフォルトで画像の右端にカラーチャートが埋め込まれる.カ ラーチャートの最上部の色が振幅値の1に対応し,最下部の色が0に対応する.カラーチャートを埋め込 みたくない場合は,次の様に,SaveAsBmp()メンバー関数でチャート幅として0を指定する.

40 第2章 チュートリアル a.SaveAsBmp("RectFFT-amp.bmp", AMPLITUDE, COLOR, 0);

Note

2次元FFTはもっとも計算時間を要する演算の一つである.FFTについては,現在,種々の演算 パッケージが入手できる.WaveFieldライブラリでは,利用できる複数のFFTパッケージを組み 込んでおり,またGPGPU等ハードウェア支援を用いたFFTパッケージも利用できる(実装中).

Fft()メンバー関数で用いるFFTパッケージを切り替えるためにはwfl::SetFftLib()関数を用 いる.

2.3 矩形関数のフーリエ変換分布画像(RectFFT-amp.bmp)

2.3.3 FFT による画像の sinc 補間

ディジタル信号処理の一つの手法としてFFTを用いたsinc補間がある.以下は,そのプログラム例で ある.

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 ( v o i d )

5 {

6 S t a r t ();

7 W a v e F i e l d a ;

8 a . L o a d B m p ( " shion - 1 2 8 gs . bmp " , A M P L I T U D E ); // 入 力 画 像 の 読 み 込 み

9 a . M o d R a n d o m P h a s e (); // 位 相 の ラ ン ダ ム 化

10 a . S a v e A s B m p ( " input - amp . bmp " , A M P L I T U D E ); // 振 幅 画 像 の 出 力 11 a . S a v e A s B m p ( " input - phs . bmp " , P H A S E ); // 位 相 画 像 の 出 力

12 a . Fft ( -1); // フ ー リ エ 変 換

13 a . E m b e d (); // サ ン プ リ ン グ 数 の 拡 張

14 a . N o r m a l i z e ();

15 a . S a v e A s B m p ( " E m b e d e d S p e c t r u m - amp . bmp " , A M P L I T U D E ); // 拡 張 し た ス ペ ク ト ル

16 a . Fft ( 1 ) ; // 逆 フ ー リ エ 変 換

17 a . N o r m a l i z e ();

18 a . S a v e A s B m p ( " O u t p u t I m a g e . bmp " , A M P L I T U D E , G R A Y ); // 出 力 画 像 19 }

i n p u t - a m p . b m p i n p u t - p h s . b m p 2.4 入力複素画像

この例では8行目のLoadBmp()メンバー関数で入力画像をWaveFieldオブジェクトaの振幅分布と して読み込み,9行目でModRandomPhase()メンバー関数を用いて位相を乱数化している.この入力画 像の振幅画像と位相画像を図2.4に示す.

この様な画像をsinc 補間するとどうなるか調べるため,12行目で離散フーリエ変換し,13行目で Embed()メンバー関数を用いてサンプリング数を縦横2倍で合計4倍に拡張している.これを逆フーリ エ変換したのが図2.5の右の画像である.

以上の計算は,乱数位相を与えた複素振幅分布の遠視野像のシミュレーションを与えており,単純な位 相の乱数化では像が劣化することを示している.これは,乱数位相には多数の“phase dislocation”が含 まれるためである.ここで,phase dislocation(単に「スペックル」と呼ばれることもある)とは,位相

unwrapping (位相接続)が不可能であるような2次元位相分布上の不連続点のことである.

E m b e d e d S p e c t r u m - a m p . b m p O u t p u t I m a g e . b m p 2.5 拡張したスペクトル像とsinc補間された出力画像

2.3.4 形状の描画

【執筆中】