Main Content

GPU에서 FFT2를 사용한 회절 패턴 시뮬레이션

이 예제에서는 Parallel Computing Toolbox™를 사용하여 GPU에서 2차원 FFT(고속 푸리에 변환)를 수행합니다. 2차원 푸리에 변환은 광학에서 원거리장 회절 패턴을 계산하는 데 사용됩니다. 이러한 회절 패턴은 Young의 이중 슬릿 실험과 같이 단색 광원이 작은 구멍을 통과할 때 관찰됩니다.

좌표계 정의하기

구멍을 통과한 빛을 시뮬레이션하기 전에 좌표계를 정의해야 합니다. fft2를 호출할 때 올바른 수치 해석을 얻으려면 xy를 주의 깊게 정렬하여 0 값이 올바른 위치에 있도록 해야 합니다.

N2는 각 차원에서 크기의 절반입니다.

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

사각형 구멍의 회절 패턴 시뮬레이션하기

단색광의 평행 빔이 작은 사각형 구멍을 통과할 때의 효과를 시뮬레이션합니다. 2차원 푸리에 변환은 구멍에서 원거리에 있는 빛의 장(light field)을 설명합니다. 먼저 좌표계를 기반으로 한 논리형 마스크로 aperture를 형성하면 광원은 간단하게 구멍(aperture)의 배정밀도 버전이 됩니다. 원거리장 광신호는 fft2를 사용하여 찾습니다.

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

사각형 구멍의 광도 표시하기

빛의 장(light field)의 제곱 크기로부터 원거리장 광도를 계산합니다. 마지막으로 시각화를 돕기 위해 fftshift를 사용합니다.

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

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

Young의 이중 슬릿 실험 시뮬레이션하기

광학 분야에서 가장 유명한 실험 중 하나는 구멍 하나가 두 개의 평행한 슬릿으로 되어 있을 때 빛의 간섭을 보여주는 Young의 이중 슬릿 실험입니다. 보강 간섭이 발생하면서 연속적으로 밝은 점이 보입니다. 이 경우 두 개의 슬릿을 나타내도록 구멍을 만듭니다. 결과 패턴이 수평 축으로만 모이지 않도록 구멍을 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' );