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