GPU에서 FFT2를 사용한 회절 패턴 시뮬레이션
R2026b이 예제에서는 Parallel Computing Toolbox™를 사용하여 GPU에서 2차원 FFT(고속 푸리에 변환)를 수행합니다.
광학에서는 푸리에 변환을 사용하여 작은 개구(aperture)에 입사하는 평면파에 의해 생성되는 원거리장 회절 패턴을 근사할 수 있습니다[1]. 이러한 회절 패턴은 Young의 이중 슬릿 실험과 같이 단색 광원이 작은 개구를 통과할 때 관찰됩니다.
GPU에서 MATLAB® 함수를 실행하여 코드의 속도를 높일 수 있습니다. MATLAB과 기타 툴박스의 많은 함수는 gpuArray 데이터 인수를 제공받으면 자동으로 GPU에서 실행됩니다. MATLAB에서 gpuArray는 GPU에 저장되는 배열을 나타냅니다.
광학 마스크 정의하기
회절 패턴을 계산하기 전에, 먼저 작은 사각형 개구를 포함하는 광학 구조를 정의합니다.
2048×2048 마스크를 정의합니다. 이후 모든 계산이 GPU에서 수행되도록 마스크를 gpuArray로 변환합니다.
n = 2048; x = -n/2:1:n/2-1; [X,Y] = meshgrid(x); X = gpuArray(X); Y = gpuArray(Y);
마스크의 중앙에 작은 사각형 개구를 생성합니다.
aperture = (abs(X)<4) .* (abs(Y)<2);
개구를 표시합니다.
figure imagesc(aperture) title("Rectangular Aperture") axis("off","equal") xlim([n/2-30 n/2+30]) ylim([n/2-30 n/2+30])

회절 패턴 시뮬레이션하기
평면파가 작은 사각형 개구를 통과할 때의 효과를 시뮬레이션합니다. 2차원 푸리에 변환은 원거리장 영역의 광학장을 설명합니다.
fft2 함수를 사용하여 2차원 푸리에 변환을 계산합니다.
lightSource = double(aperture); farFieldSignal = fft2(lightSource);
빛의 장(light field)의 크기 제곱로부터 원거리장 광학장을 계산하고 표시합니다. fftshift를 사용하여 영주파수 성분이 중앙에 오도록 출력을 재배열합니다.
farFieldIntensity = abs(farFieldSignal).^2; figure imagesc(fftshift(farFieldIntensity)) axis("off","equal") title("Rectangular Aperture Far-Field Diffraction Pattern")

Young의 이중 슬릿 실험 시뮬레이션하기
광학 분야에서 가장 유명한 실험 중 하나는 개구가 두 개의 평행한 슬릿으로 구성되어 있을 때 빛의 간섭을 보여주는 Young의 이중 슬릿 실험입니다. 보강 간섭이 발생하는 위치에서는 일련의 밝은 영역을 관찰할 수 있습니다.
두 개의 슬릿을 나타내는 개구를 정의합니다.
aperture = ((abs(X)<=10).*(abs(X)>=8) ) .* (abs(Y)<20);
개구를 표시합니다.
figure imagesc(aperture) title("Double Slit Arrangement") axis("off","equal") xlim([n/2-30 n/2+30]) ylim([n/2-30 n/2+30])

farFieldSignal = fft2(aperture);
원거리장 광학장을 계산하여 표시합니다.
farfieldIntensity = abs(farFieldSignal).^2; imagesc(fftshift(farfieldIntensity)); axis("equal"); axis("off"); title("Double Slit Far-Field Diffraction Pattern");

참고 문헌
[1] Fowles, G. R. Introduction to Modern Optics. New York: Dover, 1989.