Parallel Computing Toolbox

最新のリリースでは、このページがまだ翻訳されていません。 このページの最新版は英語でご覧になれます。

GPU で FFT2 を使用した回折パターンのシミュレート

この例では Parallel Computing Toolbox™ を使用して、GPU で 2 次元の高速フーリエ変換 (FFT) を実行します。この 2 次元フーリエ変換は、光学における遠視野回折パターンの計算に使用されます。こうした回折パターンは、Young の二重スリット実験のように、単色光源の光が小さな開口部を通過するときに観察されます。

座標系の定義

開口部を通過した光のシミュレーションを行う前に、座標系を定義しなければなりません。fft2 を呼び出す際に正しい数値動作を得るには、xy を注意深く調整してゼロ値が適切な場所にくるようにします。

N2 は各次元で半分のサイズとなります。

N2 = 1024;
[gx, gy] = meshgrid( gpuArray.colon( -1, 1/N2, (N2-1)/N2 ) );

矩形開口部に対する回折パターンのシミュレーション

単色の平行光線が小さな矩形開口部を通過する際の効果をシミュレートします。2 次元フーリエ変換により、開口部から遠く離れた光照射野を記述します。まず座標系を基に論理マスクとして aperture を形成することから始め、光源は開口部の単なる倍精度バージョンとします。遠視野の光信号は fft2 を使用して求められます。

aperture       = ( abs(gx) < 4/N2 ) .* ( abs(gy) < 2/N2 );
lightsource    = double( aperture );
farfieldsignal = fft2( lightsource );

矩形開口部に対する光強度の表示

遠視野の光の強度は、光照射野の振幅 2 乗から計算されます。最後に、fftshift を使用して可視化を補助します。

farfieldintensity = real( farfieldsignal .* conj( farfieldsignal ) );

imagesc( fftshift( farfieldintensity ) );
axis( 'equal' ); axis( 'off' );
title( 'Rectangular aperture far-field diffraction pattern' );

Young の二重スリット実験のシミュレーション

光学において最も有名な実験の 1 つである Young の二重スリット実験では、開口部が 2 つの平行なスリットで構成されている場合の光の干渉が示されます。干渉により光が強めあう場所に、一連の明るい点が見られます。この例では、2 つのスリットを表す開口部を形成します。y 方向の開口を制限して、結果のパターンが横軸沿いにのみ現れることのないようにします。

slits          = (abs( gx ) <= 10/N2) .* (abs( gx ) >= 8/N2);
aperture       = slits .* (abs(gy) < 20/N2);
lightsource    = double( aperture );
farfieldsignal = fft2( lightsource );

Young の二重スリットにおける光強度の表示

前と同様に計算と表示を行います。

farfieldintensity = real( farfieldsignal .* conj( farfieldsignal ) );
imagesc( fftshift( farfieldintensity ) );
axis( 'equal' ); axis( 'off' );
title( 'Double slit far-field diffraction pattern' );