夫琅禾费衍射matlab代码
时间: 2023-07-02 21:10:36 浏览: 71
以下是夫琅禾费衍射的MATLAB代码示例:
```
% 夫琅禾费衍射
% 输入参数:S为光源大小,λ为波长,a为衍射屏宽度,b为屏幕宽度,z为距离
% 输出:I为衍射图像
function I = fraunhoferDiffraction(S, lambda, a, b, z)
k = 2 * pi / lambda;
x = linspace(-a / 2, a / 2, 256); % 衍射屏像素点坐标
y = x';
[X, Y] = meshgrid(x, y); % 生成网格
r = sqrt(X .^ 2 + Y .^ 2); % 到像素点的距离
phi = atan2(Y, X); % 到像素点的角度
U1 = S .* rect(x ./ a) .* rect(y ./ a); % 光源
U2 = (a ^ 2 / (1i * lambda * z)) .* exp(1i * k .* r) ./ r .* U1; % 衍射屏到屏幕的传播
U2(isnan(U2)) = 0;
I = abs(fftshift(fft2(U2))) .^ 2; % 屏幕上的光强分布
I = I ./ (max(I(:))); % 归一化
figure, imshow(I, []), title('夫琅禾费衍射');
end
```
其中,`rect(x)` 为矩形函数,表示在 $[-0.5, 0.5]$ 内为1,在外部为0。该函数可以用MATLAB内置函数 `rectpuls(x)` 来代替。
使用示例:
```matlab
S = ones(256, 256);
lambda = 633e-9;
a = 1e-3;
b = 1;
z = 1;
fraunhoferDiffraction(S, lambda, a, b, z);
```
该示例生成了一个 $256 \times 256$ 的方形光源,波长 $\lambda = 633\text{ nm}$,衍射屏宽度为 $a = 1\text{ mm}$,屏幕宽度为 $b = 1$,距离为 $z = 1$。可以根据需要调整这些参数。