В этом примере используется Toolbox™ параллельных вычислений для выполнения двухмерного быстрого преобразования Фурье (FFT) на графическом процессоре. Двумерное преобразование Фурье используется в оптике для вычисления дифракционных диаграмм дальнего поля. Эти дифракционные картины наблюдаются, когда монохроматический источник света проходит через небольшое отверстие, как в эксперименте Янга с двойной щелью.
Прежде чем моделировать свет, прошедший через апертуру, мы должны определить нашу систему координат. Чтобы получить правильное числовое поведение при вызове fft2, мы должны тщательно организовать x и y чтобы нулевое значение находилось в правильном месте.
N2 равна половине размера в каждом измерении.
N2 = 1024; [gx, gy] = meshgrid( gpuArray.colon( -1, 1/N2, (N2-1)/N2 ) );
Моделируем эффект прохождения параллельного луча монохроматического света через небольшую прямоугольную апертуру. Двумерное преобразование Фурье описывает световое поле на большом расстоянии от апертуры. Мы начинаем с формирования aperture в качестве логической маски, основанной на системе координат, тогда источник света является просто вариантом апертуры с двойной точностью. Световой сигнал дальнего поля обнаруживается с помощью fft2.
aperture = ( abs(gx) < 4/N2 ) .* ( abs(gy) < 2/N2 ); lightsource = double( aperture ); farfieldsignal = fft2( lightsource );
Мы рассчитываем яркость света в дальнем поле по величине в квадрате светового поля. Наконец, мы используем fftshift чтобы помочь визуализации.
farfieldintensity = real( farfieldsignal .* conj( farfieldsignal ) ); imagesc( fftshift( farfieldintensity ) ); axis( 'equal' ); axis( 'off' ); title( 'Rectangular aperture far-field diffraction pattern' );

Одним из наиболее известных экспериментов в оптике является двухщелевой эксперимент Янга, который показывает световые помехи, когда апертура содержит две параллельные щели. Виден ряд ярких точек, где происходит конструктивное пересечение. В этом случае мы формируем отверстие, представляющее две щели. Ограничим апертуру в y направление для обеспечения того, чтобы результирующий массив не был полностью сконцентрирован вдоль горизонтальной оси.
slits = (abs( gx ) <= 10/N2) .* (abs( gx ) >= 8/N2); aperture = slits .* (abs(gy) < 20/N2); lightsource = double( aperture ); farfieldsignal = fft2( lightsource );
Вычисляем и отображаем интенсивность, как и раньше.
farfieldintensity = real( farfieldsignal .* conj( farfieldsignal ) ); imagesc( fftshift( farfieldintensity ) ); axis( 'equal' ); axis( 'off' ); title( 'Double slit far-field diffraction pattern' );
