Anonymous 发表于 2025-1-15 16:57:30

用傅里叶公式求x方向衍射分布

机器人Gpt 发表于 2025-1-15 16:57:45

ZJM 发表于 2025-01-15 16:57
用傅里叶公式求x方向衍射分布

为了计算微透镜阵列在 X 方向的远场衍射分布,我们可以利用傅里叶变换来分析。由于这是一个一维的问题,我们可以将对于每个微透镜的贡献叠加起来,并使用傅里叶变换计算整个阵列在远场的衍射图样。

假设你有多个微透镜在 X 方向排列,我们需要定义每个透镜的几何形状及其相位变化,然后进行傅里叶变换。

% 参数定义
wavelength = 633e-9; % 波长 (m)
n = 1.5; % 透镜材料的折射率
R1 = 0.7; % 第一表面的曲率半径 (m)
R2 = -0.7; % 第二表面的曲率半径 (m)
t = 2e-3; % 透镜厚度 (m)
aperture_x = 0.3; % X 方向的单个透镜口径 (m)
N_lenses = 40; % 透镜数量
total_aperture = aperture_x * N_lenses; % 总阵列横向尺寸
N = 2048; % 计算网格点数

% 创建位置坐标
x = linspace(-total_aperture/2, total_aperture/2, N);

% 初始化光场
E_field = zeros(size(x));

% 循环计算每个透镜的相位贡献
for lens_idx = 1:N_lenses
    % 计算透镜中心位置
    lens_center = (lens_idx - N_lenses/2 - 0.5) * aperture_x;
   
    % 计算每个透镜的局部坐标
    local_x = x - lens_center;
   
    % 确保只在透镜口径范围内应用相位分布
    mask = abs(local_x) <= (aperture_x / 2);
   
    % 表面形状计算,仅考虑X方向
    z1 = R1 - sqrt(max(R1^2 - local_x.^2, 0));
    z2 = R2 - sqrt(max(R2^2 - local_x.^2, 0));
   
    % 相位分布计算(按元素运算)
    phase_distribution1 = exp(1i * 2 * pi / wavelength * (n - 1) .* z1);
    phase_distribution2 = exp(1i * 2 * pi / wavelength * (1 - n) .* z2);
    lens_phase = phase_distribution1 .* phase_distribution2 .* exp(-1i * 2 * pi * n * t / wavelength);
   
    % 将相位贡献累加到总的E_field中
    E_field = E_field + lens_phase .* mask;
end

% 计算远场衍射图样(傅里叶变换)
far_field_pattern = abs(fftshift(fft(E_field))).^2;

% 定义空间频率
fx = linspace(-1/(2*total_aperture), 1/(2*total_aperture), N);
angles = asind(wavelength * fx); % 使用 arcsin 计算角度

% 可视化一维分布
figure;
plot(angles, far_field_pattern);
xlabel('Angle (degrees)');
ylabel('Intensity');
title('1D Far Field Diffraction Pattern for Cylindrical Microlens Array');
grid on;

### 说明:

- **相位贡献**:我们为每个透镜计算局部相位贡献,并应用一个掩膜限制在透镜的口径范围内。
- **傅里叶变换**:对总的光场 `E_field` 进行傅里叶变换,获取远场强度分布。
- **角度空间**:将空间频率转换为角度,以便于解释远场图样。

这种方法允许你模拟具有多个排列微透镜的系统的 X 向远场衍射。根据实际的物理参数调整代码中的参数。
--- 光学专家Gpt

Anonymous 发表于 2025-1-15 16:58:40

不要用fft2,用积分的方式计算

机器人Gpt 发表于 2025-1-15 16:58:53

ZJM 发表于 2025-01-15 16:58
不要用fft2,用积分的方式计算

为了计算一维柱透镜阵列在 X 方向的远场衍射分布,而不使用 `fft2` 这样的傅里叶变换函数,可以直接通过数值积分的方式来实现。我们可以根据光的波动理论,计算通过透镜后的光场,并在远场条件下对透镜表面的相位变化进行直接积分。

以下是一个示例代码,通过对每个透镜贡献的光场进行数值积分,计算整个阵列的远场衍射图样:

% 参数定义
wavelength = 633e-9; % 波长 (m)
n = 1.5; % 透镜材料的折射率
R1 = 0.7; % 第一表面的曲率半径 (m)
R2 = -0.7; % 第二表面的曲率半径 (m)
t = 2e-3; % 透镜厚度 (m)
aperture_x = 0.3; % X 方向的单个透镜口径 (m)
N_lenses = 40; % 透镜数量
total_aperture = aperture_x * N_lenses; % 总阵列横向尺寸
N = 1024; % 计算网格点数

% 创建位置坐标
x = linspace(-total_aperture/2, total_aperture/2, N);

% 初始化光场
E_field = zeros(size(x));

% 循环计算每个透镜的相位贡献
for lens_idx = 1:N_lenses
    % 计算透镜中心位置
    lens_center = (lens_idx - N_lenses/2 + 0.5) * aperture_x;
   
    % 计算每个透镜的局部坐标
    local_x = x - lens_center;
   
    % 确保只在透镜口径范围内应用相位分布
    mask = abs(local_x) <= (aperture_x / 2);
   
    % 表面形状计算,考虑X方向
    z1 = R1 - sqrt(R1^2 - local_x.^2 .* mask); % 第一表面
    z2 = R2 - sqrt(R2^2 - local_x.^2 .* mask); % 第二表面
   
    % 相位分布计算
    phase_distribution1 = exp(1i * 2 * pi / wavelength * (n - 1) .* z1);
    phase_distribution2 = exp(1i * 2 * pi / wavelength * (1 - n) .* z2);
    lens_phase = phase_distribution1 .* phase_distribution2 .* exp(-1i * 2 * pi * n * t / wavelength);
   
    % 将该透镜的相位贡献叠加到总电场中
    E_field = E_field + lens_phase .* mask;
end

% 观测角度范围设定
theta = linspace(-pi/6, pi/6, N);

% 初始化强度分布
intensity = zeros(size(theta));

% 数值计算在各个角度的远场强度
for idx = 1:length(theta)
    angle = theta(idx);
    kx = 2 * pi / wavelength * sin(angle); % 空间频率
    E_far_field = sum(E_field .* exp(-1i * kx * x)); % 数值积分
    intensity(idx) = abs(E_far_field)^2;
end

% 转换为角度并可视化结果
angles_degrees = rad2deg(theta); % 弧度转换为度数

figure;
plot(angles_degrees, intensity);
xlabel('Angle (degrees)');
ylabel('Intensity');
title('1D Far Field Diffraction Pattern for Cylindrical Microlens Array');
grid on;

### 说明
- **相位分布**:每个透镜表面导致的相位变化和透镜厚度的光程差联合影响最终光场。
- **数值积分**:在每个观察角度,对整个阵列所产生的相位进行叠加并求和。
- **性能优化**:这种方法可能在计算时较慢,增加 N 会提高分辨率但也会增加计算时间。可以根据实际需要调整参数。

通过这种方法,你应该能够获得微透镜阵列在 X 方向上的远场衍射分布。
--- 光学专家Gpt
页: 1 2 3 [4]
查看完整版本: matlab分析微透镜阵列远场的衍射效应