matlab分析微透镜阵列远场的衍射效应

[复制链接]
匿名  发表于 3 天前
不要用FFt2函数,用积分的形式计算远场分布
回复 支持 反对

使用道具 举报

机器人Gpt 发表于 3 天前 | 显示全部楼层
ZJM 发表于 2025-01-15 16:29
不要用FFt2函数,用积分的形式计算远场分布 ...


为了计算微透镜阵列的远场衍射图案,而不使用 `fft2` 函数,我们可以通过数值积分的方法来实现。这涉及到通过每个透镜表面的相位变化来直接计算在空间中某个观察点的光场。

下面是一个示例代码,展示如何通过数值积分计算远场一维衍射图案。不过,注意的是,这种方法会比较耗时,因为它需要在每个网格点上进行二重积分。

  1. % 参数定义
  2. wavelength = 633e-9; % 波长 (m)
  3. n = 1.5; % 透镜材料的折射率
  4. R1 = 0.68; % 第一表面的曲率半径 (m)
  5. R2 = -0.68; % 第二表面的曲率半径 (m)
  6. t = 1.99e-3; % 透镜厚度 (m)
  7. lens_diameter = 0.5e-3; % 整个透镜直径 (m)
  8. N = 256; % 由于数值积分的复杂性,减小网格点数来提高计算速度

  9. % 创建位置坐标
  10. x = linspace(-lens_diameter/2, lens_diameter/2, N);
  11. [X, Y] = meshgrid(x, x);
  12. r = sqrt(X.^2 + Y.^2);

  13. % 表面形状计算
  14. z1 = R1 - sqrt(R1^2 - r.^2); % 第一表面
  15. z2 = R2 - sqrt(R2^2 - r.^2); % 第二表面

  16. % 计算总相位
  17. phase_distribution1 = exp(1i * 2 * pi / wavelength * (n - 1) .* z1);
  18. phase_distribution2 = exp(1i * 2 * pi / wavelength * (1 - n) .* z2);
  19. total_phase = phase_distribution1 .* phase_distribution2 .* exp(-1i * 2 * pi * n * t / wavelength);

  20. % 远场计算
  21. theta = linspace(-pi/6, pi/6, N); % 观察角度,假设集中在较窄范围内
  22. intensity = zeros(size(theta));

  23. for idx = 1:length(theta)
  24.     angle = theta(idx);
  25.     kx = 2 * pi / wavelength * sin(angle); % 空间频率
  26.     E_field = sum(sum(total_phase .* exp(-1i * kx * X))); % 数值积分
  27.     intensity(idx) = abs(E_field)^2;
  28. end

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

  31. figure;
  32. plot(angles_degrees, intensity);
  33. xlabel('Angle (degrees)');
  34. ylabel('Intensity');
  35. title('1D Far Field Diffraction Pattern via Numerical Integration');
  36. grid on;
复制代码


### 说明

1. **相位分布**:由两个透镜表面计算的相位变化和厚度光程差共同构成。
2. **数值积分**:直接对透镜阵列的相位分布进行数值积分,以模拟远场。
3. **复杂性**:相比 FFT 方法,这种方法计算量大,但更符合物理直观。

这个代码在数值积分基础上,通过对微透镜阵列的远场强度进行一维分析。为了优化计算速度,建议灵活调整网格密度或角度采样范围。
--- 光学专家Gpt
回复 支持 反对

使用道具 举报

匿名  发表于 3 天前
微透镜是一维柱透镜,微透镜x方向单元口径0.3,Y方向尺寸8,X方向第一表面的半径为0.7,X方向第二表面的半径为-0.7,厚度为2,计算X方向的衍射远场分布
回复 支持 反对

使用道具 举报

机器人Gpt 发表于 3 天前 | 显示全部楼层
ZJM 发表于 2025-01-15 16:37
微透镜是一维柱透镜,微透镜x方向单元口径0.3,Y方向 ...


为了计算一维柱透镜在 X 方向的远场衍射分布,我们需要在 X 方向上考虑透镜的曲率并进行数值积分。下面是假设微透镜在 Y 方向是无限延伸的(即忽略 Y 方向的影响):

### 参数定义与步骤

1. **参数定义**:
   - X 方向单元的口径为 \(0.3 \, \text{m}\)。
   - X 方向第一表面半径为 \(0.7 \, \text{m}\),第二表面半径为 \(-0.7 \, \text{m}\)。
   - 厚度为 \(2 \, \text{mm}\)。
   - 假设折射率 \(n = 1.5\)。
   - 波长 \(\lambda = 633 \, \text{nm}\)。

2. **计算相位分布**:
   - 计算每个表面的相位变化。
   - 结合厚度计算总光程差。

3. **数值积分以求远场分布**:
   - 对 X 方向上的相位分布进行傅里叶变换,通过数值积分得到远场分布。

下面是 MATLAB 示例代码:

  1. % 参数定义
  2. wavelength = 633e-9; % 波长 (m)
  3. n = 1.5; % 透镜材料的折射率
  4. R1 = 0.7; % 第一表面的曲率半径 (m)
  5. R2 = -0.7; % 第二表面的曲率半径 (m)
  6. t = 2e-3; % 透镜厚度 (m)
  7. aperture_x = 0.3; % X 方向的口径 (m)
  8. N = 512; % 计算网格点数

  9. % 创建位置坐标
  10. x = linspace(-aperture_x/2, aperture_x/2, N);
  11. [X] = meshgrid(x);
  12. r = abs(X);

  13. % 表面形状计算,仅考虑X方向
  14. z1 = R1 - sqrt(R1^2 - r.^2); % 第一表面
  15. z2 = R2 - sqrt(R2^2 - r.^2); % 第二表面

  16. % 计算总相位
  17. phase_distribution1 = exp(1i * 2 * pi / wavelength * (n - 1) .* z1);
  18. phase_distribution2 = exp(1i * 2 * pi / wavelength * (1 - n) .* z2);
  19. total_phase = phase_distribution1 .* phase_distribution2 .* exp(-1i * 2 * pi * n * t / wavelength);

  20. % 远场计算
  21. theta = linspace(-pi/6, pi/6, N); % 观察角度范围
  22. intensity = zeros(size(theta));

  23. for idx = 1:length(theta)
  24.     angle = theta(idx);
  25.     kx = 2 * pi / wavelength * sin(angle); % 空间频率
  26.     E_field = sum(total_phase .* exp(-1i * kx .* X)); % 数值积分
  27.     intensity(idx) = abs(E_field)^2;
  28. end

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

  31. figure;
  32. plot(angles_degrees, intensity);
  33. xlabel('Angle (degrees)');
  34. ylabel('Intensity');
  35. title('1D Far Field Diffraction Pattern for Cylindrical Microlens');
  36. grid on;
复制代码


### 说明

- **相位分布**:主要由 X 方向透镜曲率和厚度导致,计算出总的光程相位。
- **数值积分**:在 X 方向上进行,得到远场强度分布。
- 如果程序运行速度慢,可以尝试减少网格点数 `N` 或收窄 `theta` 角度范围。

这个代码能够让你模拟一维柱透镜的远场衍射效应,同时,你可能需要根据你的具体需求调整或修改参数。
--- 光学专家Gpt
回复 支持 反对

使用道具 举报

匿名  发表于 3 天前
X方向透镜数量40个
回复 支持 反对

使用道具 举报

机器人Gpt 发表于 3 天前 | 显示全部楼层
ZJM 发表于 2025-01-15 16:49
X方向透镜数量40个


如果你有一个微透镜阵列,其中在 X 方向上有 40 个透镜单元,我们需要将每个透镜的相位贡献累加起来,以便计算整个阵列的远场衍射分布。

这里是一个方法,它考虑了多个微透镜的相位叠加。我们将每个透镜的相位分布逐一计算,并将所有这些叠加起来,然后进行数值积分以得到远场分布。

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

  11. % 创建位置坐标
  12. x = linspace(-total_aperture/2, total_aperture/2, N);
  13. [X] = meshgrid(x);
  14. r = abs(X);

  15. % 初始化相位分布
  16. total_phase = zeros(size(X));

  17. % 循环计算每个透镜的相位贡献
  18. for lens_idx = 1:N_lenses
  19.     % 计算透镜中心位置
  20.     lens_center = (lens_idx - N_lenses/2 - 0.5) * aperture_x;
  21.    
  22.     % 计算每个透镜的局部坐标
  23.     local_x = X - lens_center;
  24.    
  25.     % 表面形状计算,考虑X方向
  26.     z1 = R1 - sqrt(R1^2 - local_x.^2); % 第一表面
  27.     z2 = R2 - sqrt(R2^2 - local_x.^2); % 第二表面
  28.    
  29.     % 相位分布计算
  30.     phase_distribution1 = exp(1i * 2 * pi / wavelength * (n - 1) .* z1);
  31.     phase_distribution2 = exp(1i * 2 * pi / wavelength * (1 - n) .* z2);
  32.    
  33.     % 累积总相位
  34.     total_phase = total_phase + phase_distribution1 .* phase_distribution2 .* exp(-1i * 2 * pi * n * t / wavelength);
  35. end

  36. % 远场计算
  37. theta = linspace(-pi/6, pi/6, N); % 观察角度范围
  38. intensity = zeros(size(theta));

  39. for idx = 1:length(theta)
  40.     angle = theta(idx);
  41.     kx = 2 * pi / wavelength * sin(angle); % 空间频率
  42.     E_field = sum(total_phase .* exp(-1i * kx .* X)); % 数值积分
  43.     intensity(idx) = abs(E_field)^2;
  44. end

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

  47. figure;
  48. plot(angles_degrees, intensity);
  49. xlabel('Angle (degrees)');
  50. ylabel('Intensity');
  51. title('1D Far Field Diffraction Pattern for 40 Cylindrical Microlenses');
  52. grid on;
复制代码


### 关键点:

- **位置偏移**:在循环内对于每个透镜,我们计算其中心位置并修正局部坐标系。
- **相位叠加**:每个透镜的相位贡献通过累加方式储存在 `total_phase`。
- **远场积分**:对完整的相位分布进行空间频率下的数值积分,以获得最终的远场衍射图案。

这种方法可用于模拟复杂的微透镜阵列系统。注意:数值积分可能会比较耗时,此方法在参数设置上需要一定调校以达到合理的计算时间和精度。
--- 光学专家Gpt
回复 支持 反对

使用道具 举报

匿名  发表于 3 天前
代码第48行出现错误
回复 支持 反对

使用道具 举报

机器人Gpt 发表于 3 天前 | 显示全部楼层
ZJM 发表于 2025-01-15 16:50
代码第48行出现错误


抱歉给你带来困扰。让我们仔细检查第48行的内容,特别是在进行数值积分时可能出现矩阵维度不匹配的问题。以下是修改后的代码,以确保在累加微透镜阵列的相位贡献时能正确执行:

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

  11. % 创建位置坐标
  12. x = linspace(-total_aperture/2, total_aperture/2, N);
  13. [X] = meshgrid(x); % 生成二维网格

  14. % 初始化总相位分布
  15. total_phase = zeros(size(X));

  16. % 循环计算每个透镜的相位贡献
  17. for lens_idx = 1:N_lenses
  18.     % 计算透镜中心位置
  19.     lens_center = (lens_idx - N_lenses/2 - 0.5) * aperture_x;
  20.    
  21.     % 计算每个透镜的局部坐标
  22.     local_x = X - lens_center;
  23.    
  24.     % 确保只在透镜口径范围内应用相位分布
  25.     mask = abs(local_x) <= aperture_x/2;
  26.    
  27.     % 表面形状计算,考虑X方向
  28.     z1 = R1 - sqrt(R1^2 - local_x.^2); % 第一表面
  29.     z2 = R2 - sqrt(R2^2 - local_x.^2); % 第二表面
  30.    
  31.     % 相位分布计算
  32.     phase_distribution1 = exp(1i * 2 * pi / wavelength * (n - 1) .* z1);
  33.     phase_distribution2 = exp(1i * 2 * pi / wavelength * (1 - n) .* z2);
  34.    
  35.     % 加入透镜口径掩模并累积相位
  36.     total_phase = total_phase + (phase_distribution1 .* phase_distribution2 .* exp(-1i * 2 * pi * n * t / wavelength)) .* mask;
  37. end

  38. % 远场计算
  39. theta = linspace(-pi/6, pi/6, N); % 观察角度范围
  40. intensity = zeros(size(theta));

  41. for idx = 1:length(theta)
  42.     angle = theta(idx);
  43.     kx = 2 * pi / wavelength * sin(angle); % 空间频率
  44.     E_field = sum(total_phase .* exp(-1i * kx .* X)); % 数值积分
  45.     intensity(idx) = abs(E_field)^2;
  46. end

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

  49. figure;
  50. plot(angles_degrees, intensity);
  51. xlabel('Angle (degrees)');
  52. ylabel('Intensity');
  53. title('1D Far Field Diffraction Pattern for 40 Cylindrical Microlenses');
  54. grid on;
复制代码


### 修正内容:
- **掩模**:在计算相位贡献时使用 `mask` 限制,只考虑在实际透镜口径内的区域。
- **网格定义**:确保网格生成对应于一维的 X 方向,避免多余的维度。
- **网格点数 `N`**:可以根据需要进行调整,以确保分辨率能够满足精细要求。

如有进一步的问题或需要额外调整,请告诉我!
--- 光学专家Gpt
回复 支持 反对

使用道具 举报

匿名  发表于 3 天前
用于对矩阵求幂的维度不正确。请检查并确保矩阵为方阵并且幂为标量。要单独对矩阵的每个元素进行运算,请使用 POWER (.^)执行按元素求幂
回复 支持 反对

使用道具 举报

机器人Gpt 发表于 3 天前 | 显示全部楼层
ZJM 发表于 2025-01-15 16:51
用于对矩阵求幂的维度不正确。请检查并确保矩阵为方阵 ...


抱歉,之前的代码中可能有一个关于求幂运算的错误。我将修正这一点。在 MATLAB 中,如果我们要对矩阵中的每个元素进行幂运算,应该使用 `.^` 而不是 `^`。

以下是修正后的代码,其中确保所有的按元素运算都使用了正确的操作符:

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

  11. % 创建位置坐标
  12. x = linspace(-total_aperture/2, total_aperture/2, N);
  13. [X, ~] = meshgrid(x); % 生成二维网格,只用X方向

  14. % 初始化总相位分布
  15. total_phase = zeros(size(X));

  16. % 循环计算每个透镜的相位贡献
  17. for lens_idx = 1:N_lenses
  18.     % 计算透镜中心位置
  19.     lens_center = (lens_idx - N_lenses/2 - 0.5) * aperture_x;
  20.    
  21.     % 计算每个透镜的局部坐标
  22.     local_x = X - lens_center;
  23.    
  24.     % 确保只在透镜口径范围内应用相位分布
  25.     mask = abs(local_x) <= (aperture_x / 2);
  26.    
  27.     % 表面形状计算,仅考虑X方向
  28.     z1 = mask .* (R1 - sqrt(R1.^2 - local_x.^2));
  29.     z2 = mask .* (R2 - sqrt(R2.^2 - local_x.^2));
  30.    
  31.     % 相位分布计算
  32.     phase_distribution1 = exp(1i * 2 * pi / wavelength * (n - 1) .* z1);
  33.     phase_distribution2 = exp(1i * 2 * pi / wavelength * (1 - n) .* z2);
  34.    
  35.     % 累积总相位
  36.     total_phase = total_phase + phase_distribution1 .* phase_distribution2 .* exp(-1i * 2 * pi * n * t / wavelength);
  37. end

  38. % 远场计算
  39. theta = linspace(-pi/6, pi/6, N); % 观察角度范围
  40. intensity = zeros(size(theta));

  41. for idx = 1:length(theta)
  42.     angle = theta(idx);
  43.     kx = 2 * pi / wavelength * sin(angle); % 空间频率
  44.     E_field = sum(total_phase .* exp(-1i * kx .* X), 'all'); % 数值积分
  45.     intensity(idx) = abs(E_field)^2;
  46. end

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

  49. figure;
  50. plot(angles_degrees, intensity);
  51. xlabel('Angle (degrees)');
  52. ylabel('Intensity');
  53. title('1D Far Field Diffraction Pattern for 40 Cylindrical Microlenses');
  54. grid on;
复制代码


### 修正说明:
- **按元素运算**:使用 `.^`, `.*` 和 `./` 确保按元素运算,这样就不会遇到矩阵维度问题。
- **遮罩应用**:使用 `mask` 确保只在透镜实际存在的区域计算相位。
- **合计相位分布**:总相位分布累加过程确保考虑每一个透镜的贡献。

如果还有问题,请告诉我!
--- 光学专家Gpt
回复 支持 反对

使用道具 举报

快速回帖

您需要登录后才可以回帖 登录 | 立即注册 手机动态码快速登录

本版积分规则

关于楼主

匿名用户组
  • 主题

    18
  • 回答

    1
  • 积分

    18
联系客服 关注微信 访问手机版 返回顶部 返回列表