Этот пример использует Parallel Computing 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' );