function simulate_microlens_array_zbf(fileName)
% 读取 ZBF 文件
[nx, ny, dx, dy, isPol, lambda, EX, EY, PilotRays] = read_ZBF(fileName);
lambda = lambda * 1e-9; % 转换波长到米
% 计算 ZBF 文件的光强
if isPol == 1
intensity_zbf = abs(EX).^2 + abs(EY).^2;
else
intensity_zbf = abs(EX).^2;
end
% 微透镜阵列参数设置
pixel_size = 0.0488e-6; % 假设 1 像素 = µm
lens_radius = 460.8 * pixel_size;
edge_size = 51.2 * pixel_size;
lens_height = 25.6 * pixel_size;
focal_length = 6144 * pixel_size;
% 定义 2x2 微透镜阵列
lens_array_size = [2, 2];
period_x = 2 * (lens_radius + edge_size);
period_y = 2 * (lens_radius + edge_size);
% 生成 2x2 微透镜阵列的相位分布
[X, Y] = meshgrid(1:nx, 1:ny);
microlens_phase = zeros(ny, nx);
for i = 1:lens_array_size(1)
for j = 1:lens_array_size(2)
center_x = (j - 0.5) * period_x / pixel_size;
center_y = (i - 0.5) * period_y / pixel_size;
R = sqrt((X - center_x).^2 + (Y - center_y).^2) * pixel_size;
lens_surface = zeros(size(R));
idx_inside = R <= lens_radius;
lens_surface(idx_inside) = lens_height - sqrt(lens_height^2 - R(idx_inside).^2);
k = 2 * pi / lambda;
phase = k * lens_surface;
microlens_phase = microlens_phase + phase;
end
end
% 将 ZBF 文件的光场与微透镜阵列相位相乘
if isPol == 1
EX_microlens = EX .* exp(1i * microlens_phase);
EY_microlens = EY .* exp(1i * microlens_phase);
else
EX_microlens = EX .* exp(1i * microlens_phase);
end
% 傅里叶变换到焦点平面
if isPol == 1
fft_EX = fftshift(fft2(EX_microlens));
fft_EY = fftshift(fft2(EY_microlens));
intensity_focus = abs(fft_EX).^2 + abs(fft_EY).^2;
else
fft_EX = fftshift(fft2(EX_microlens));
intensity_focus = abs(fft_EX).^2;
end
% 绘制结果
figure;
subplot(1, 2, 1);
imagesc(intensity_zbf);
axis image;
title('ZBF 文件光强分布');
xlabel('x (像素)');
ylabel('y (像素)');
colorbar;
subplot(1, 2, 2);
imagesc(intensity_focus);
axis image;
title('微透镜阵列焦点处光强分布');
xlabel('x (像素)');
ylabel('y (像素)');
colorbar;
end
function [nx, ny, dx, dy, isPol, lambda, EX, EY, PilotRays ] = read_ZBF(filename)
% 打开文件
fid = fopen(filename, 'r');
if fid == -1
error('无法打开文件:%s', filename);
end
% 读取第一部分头部信息
vec = fread(fid, 9, 'int');
fileFormat = vec(1);
nx = vec(2);
ny = vec(3);
isPol = vec(4);
% 根据文件格式读取第二部分头部信息
if (fileFormat == 1) % 新文件格式
vec = fread(fid, 20, 'double');
lambda = vec(9);
PilotRays.posX = vec(3);
PilotRays.posY = vec(6);
PilotRays.rayleighX = vec(4);
PilotRays.rayleighY = vec(7);
PilotRays.waistX = vec(5);
PilotRays.waistY = vec(8);
else % 旧文件格式
vec = fread(fid, 11, 'double');
lambda = vec(5);
PilotRays.posX = vec(3);
PilotRays.posY = vec(3);
PilotRays.rayleighX = vec(4);
PilotRays.rayleighY = vec(4);
PilotRays.waistX = vec(6);
PilotRays.waistY = vec(6);
end
dx = vec(1);
dy = vec(2);
% 读取 E 场值 (Ex)
vecEX = fread(fid, nx*ny*2, 'double');
realAndIma = reshape(vecEX, [2, nx*ny]);
real = reshape(realAndIma(1, , [ny, nx]);
ima = reshape(realAndIma(2, , [ny, nx]);
EX = real + 1i * ima;
EX = transpose(EX);
if (isPol == 1)
% 读取 E 场值 (Ey) 如果是偏振光
vecEY = fread(fid, nx*ny*2, 'double');
realAndIma = reshape(vecEY, [2, nx*ny]);
real = reshape(realAndIma(1, , [ny, nx]);
ima = reshape(realAndIma(2, , [ny, nx]);
EY = real + 1i * ima;
EY = transpose(EY);
else
EY = 0;
end
fclose(fid);
end这个代码为什么焦点处没有光强分布呢?
|
|