贝塞尔

[复制链接]
匿名  发表于 5 天前
生成的强度分布图中,亮斑半径太小,怎么调整生成图像使亮斑大一点
回复 支持 反对

使用道具 举报

机器人Gpt 发表于 5 天前 | 显示全部楼层
xxm 发表于 2025-03-24 16:15
生成的强度分布图中,亮斑半径太小,怎么调整生成图像 ...


如果想要在生成的强度分布图中增大亮斑的半径,可以调整光束的初始参数或影响光束传播的其它因素。这通常涉及对初始光束的束腰、像素尺寸、锥透镜的角度等参数进行调整。以下是一些可能的调整方法:

### 方法1:增大束腰半径
增加初始光束的束腰半径可以使光斑变得更大。

  1. % 设置初始束腰半径 (例如,从 0.5e-3 米增加到 1e-3 米)
  2. w0 = 1e-3; % 调整这个值来改变光斑大小

  3. % 初始高斯光束
  4. U0 = exp(- (X.^2 + Y.^2) / w0^2); % 使用高斯光束模型初始化平面波
复制代码


### 方法2:调整锥透镜角度
减小锥透镜的底角,会导致光束扩散得更广。

  1. cone_angle = 5 * pi / 180; % 减小锥角以增大光斑
  2. phi_cone = k * Rxy * cone_angle * (n - 1);
复制代码


### 方法3:调整像素尺寸
增大每个像素的尺寸会覆盖更大的物理区域,从而可能影响光斑扩展。

  1. dx = 7e-6; % 增加像素尺寸
  2. dy = dx;
复制代码


### 方法4:增加传播距离
在传播过程中,光斑自然会扩散,因此可以通过增加传播距离来增大光斑。

  1. z_max = 100e-3; % 增加最大传播距离
  2. z_samples = linspace(0, z_max, 50);
复制代码


### 实现增强光斑的代码示例:
确保你根据上述建议的参数调整代码中的相关变量,并展示更新后的图形。

  1. clear; clc; close all;

  2. % 参数设置及修改
  3. lambda = 840e-9;
  4. k = 1 * pi / lambda;
  5. n = 1.451;
  6. cone_angle = 5 * pi / 180; % 修改锥角
  7. z_max = 50e-3;
  8. N = 512;
  9. dx = 7e-6; % 修改像素尺寸
  10. dy = dx;

  11. % 空间坐标系
  12. x = (-N/2:N/2-1) * dx;
  13. y = (-N/2:N/2-1) * dy;
  14. [X, Y] = meshgrid(x, y);
  15. Rxy = sqrt(X.^2 + Y.^2);

  16. % 锥透镜的相位调制
  17. phi_cone = k * Rxy * cone_angle * (n - 1);

  18. % 初始高斯光束(而非平面波)
  19. w0 = 1e-3; % 修改束腰半径
  20. U0 = exp(- (X.^2 + Y.^2) / w0^2);

  21. % 剩余部分代码...
复制代码


通过这些调整,你可以观察到光斑的直径和形状会发生相应变化。根据实验需要微调这些参数,以达到最优效果。
--- 光学专家Gpt
回复 支持 反对

使用道具 举报

匿名  发表于 5 天前
clear; clc; close all;

% 参数设置
lambda = 840e-9; % 光波长 (单位:米)
k = 1 * pi / lambda; % 波数
n = 1.451; % 介质的折射率
cone_angle = 5 * pi / 180; % 锥的底角 (单位:弧度)
z_max = 50e-3; % 模拟传播的最大距离 (单位:米)
N = 512; % 图像的分辨率
dx = 3.45e-6; % 每个像素的尺寸 (单位:米)
dy = dx; % 假设为正方形像素

% 空间坐标系
x = (-N/2:N/2-1) * dx;
y = (-N/2:N/2-1) * dy;
[X, Y] = meshgrid(x, y);
Rxy = sqrt(X.^2 + Y.^2); % 径向坐标

% 锥透镜的相位调制
phi_cone = k * Rxy * cone_angle * (n - 1); % 锥透镜的相位因子

% 初始平面波场
U0 = exp(1i * zeros(size(X))); % 平面波,初始相位为0

% 通过锥透镜调制光波
U_coned = U0 .* exp(-1i * phi_cone); % 平面波经过锥透镜调制

% 计算频率空间 (角谱传播)
fx = (-N/2:N/2-1) / (N * dx); % 频率坐标
fy = fx;
[Fx, Fy] = meshgrid(fx, fy);
F = sqrt(Fx.^2 + Fy.^2); % 频率空间的径向坐标

% 传播传递函数,考虑传播距离 z_max
H = @(z) exp(1i * k * z * sqrt(1 - (lambda * F).^2));

% 设置传播距离的采样点
z_samples = linspace(0, z_max, 10);

% 对每个传播距离进行计算并可视化
for i = 1:length(z_samples)
    z = z_samples(i);
   
    % 计算传播到 z 处的场
    U_freq = fftshift(fft2(U_coned));
    U_freq = U_freq .* H(z);
    U_propagated = ifft2(ifftshift(U_freq));

    U_xy = U_propagated;
    intensity = abs(U_xy).^2;

    % 手动归一化强度
    min_intensity = min(intensity();
    max_intensity = max(intensity();
    normalized_intensity = (intensity - min_intensity) / (max_intensity - min_intensity);
   
    % 创建图形
    figure;
    imagesc(x * 1e3, y * 1e3, normalized_intensity); % 缩放坐标到毫米
    colormap(jet);
    colorbar;
    title(sprintf('Intensity Distribution at z = %.2f mm', z * 1e3));
    xlabel('X (mm)');
    ylabel('Y (mm)');
    axis square;
    set(gca, 'YDir', 'normal');

    % 保存图形
    filename = sprintf('image_%d.png', i);
    saveas(gcf, filename);
    close; % 关闭当前图形
end

% 绘制相位分布灰度图
figure;
imagesc(x * 1e3, y * 1e3, angle(U_coned));
axis equal;
colormap gray;
colorbar;
title('Phase Distribution of the Lens');
xlabel('X (mm)');
ylabel('Y (mm)');

% 保存相位分布图
saveas(gcf, 'phase_distribution.png');   我一定要设置像素尺寸吗,可以根据生成的图像自动生成嘛
回复 支持 反对

使用道具 举报

机器人Gpt 发表于 5 天前 | 显示全部楼层
xxm 发表于 2025-03-24 16:30
clear; clc; close all;

% 参数设置
lambda = 840e- ...


在数值模拟中,像素尺寸是非常重要的,它直接影响到对空间域采样的精度和数值结果的分辨率。当你进行光波传播的模拟时,像素尺寸(或每个采样点对应的实空间大小)需要适当配置,以确保数值模拟的准确性和稳定性。

如果你想让生成的图像自动调整比例而不手动指定像素尺寸,那么需要考虑以下几点:

1. **自动调整像素尺寸**:
   你可以根据计算域的物理尺寸和图像分辨率(N×N)自动计算出每个像素的大小。这样可以避免手动设置。

2. **动态调整**:
   可以根据模拟的需求,动态调整分辨率和物理范围,确保数值计算的稳定性和精确性。

3. **适合编程实现**:
   自动计算像素尺寸的一种简单方法是使用物理尺寸除以分辨率:

  1. % 假设计算域的物理尺寸为Lx和Ly
  2. Lx = 50e-3; % 设置x方向的物理尺寸 (米)
  3. Ly = 50e-3; % 设置y方向的物理尺寸 (米)

  4. % 计算每个像素的大小
  5. dx = Lx / N;
  6. dy = Ly / N;

  7. % 设置空间坐标系
  8. x = (-N/2:N/2-1) * dx;
  9. y = (-N/2:N/2-1) * dy;
  10. [X, Y] = meshgrid(x, y);
  11. Rxy = sqrt(X.^2 + Y.^2); % 径向坐标

  12. % 然后继续进行后续的相同处理
复制代码


通过这种方式,你只需定义你希望覆盖的物理范围,像素大小就会自动根据范围和分辨率计算得出,这样可以减少手动调整参数的麻烦。当然,确保分辨率足够高以捕捉你所研究的物理现象是重要的。

最后,自动调整的参数需要通过反复的实验和分析来确保你的数值结果准确且可靠。
--- 光学专家Gpt
回复 支持 反对

使用道具 举报

匿名  发表于 5 天前
% 参数设置
lambda = 840e-9; % 光波长 (单位:米)
k = 2*pi/lambda; % 波数
n = 1.451; % 介质的折射率
cone_angle = 10*pi/180; % 锥的底角 (单位:弧度)
z_max = 10e-3; % 模拟传播的最大距离 (单位:米)
N = 512; % 图像的分辨率
dx = 3.45e-6; % 每个像素的尺寸 (单位:米)
dy = dx; % 假设为正方形像素


% 空间坐标系
x = (-N/2:N/2 - 1) * dx
y = (-N/2:N/2-1) * dy;
[X, Y] = meshgrid(x, y);
Rxy = sqrt(X.^2 + Y.^2); % 径向坐标

% 锥透镜的相位调制
phi_cone = k * Rxy * cone_angle * (n-1); % 锥透镜的相位因子

% 初始平面波场
U0 = exp(1i * zeros(size(X))); % 平面波,初始相位为0

% 通过锥透镜调制光波
U_coned = U0 .* exp(-1i * phi_cone); % 平面波经过锥透镜调制

% 计算频率空间 (角谱传播)
fx = (-N/2:N/2-1) / (N * dx); % 频率坐标
fy = fx;
[Fx, Fy] = meshgrid(fx, fy);
F = sqrt(Fx.^2 + Fy.^2); % 频率空间的径向坐标

% 传播传递函数,考虑传播距离 z_max
H = @(z) exp(1i * k * z * sqrt(1 - (lambda * F).^2)); % 角谱传播传递函数,动态传递

% 设置传播距离的采样点(例如,模拟从 0 到 z_max 的多个传播距离)
z_samples = linspace(0, z_max, 50); % 50 个传播距离
intensity_xz = zeros(N, length(z_samples)); % 预分配空间


% 对每个传播距离进行计算并可视化
for i = 1:length(z_samples)
    z = z_samples(i);
   
    % 计算传播到 z 处的场
    U_freq = fftshift(fft2(U_coned)); % 2D 傅里叶变换
    U_freq = U_freq .* H(z); % 应用传播传递函数
    U_propagated = ifft2(ifftshift(U_freq)); % 逆傅里叶变换回到空间域

    % 提取 y = 0 处的 xz 平面数据
    y_idx = ceil(N / 2);  % 选择 y = 0 处,即 Ny 中心
    U_xz = U_propagated(:, y_idx);  % 提取 xz 平面的数据
    % 计算强度分布 |U(x, 0, z)|^2并保存
    intensity_xz(:, i) = abs(U_xz).^2;  % 直接存入预分配的矩阵
   
end




% 绘制强度分布(xz平面的切片)
figure(1);  % 5 行 10 列的子图
% 对intensity_xz进行水平翻转,这里使用 fliplr 函数,它可以对矩阵进行左右翻转(水平翻转)
intensity_xz_flipped = fliplr(intensity_xz);
imagesc(x, [0 z_max], intensity_xz_flipped);  % 显示在 xz 平面上的强度分布
colormap('parula');
axis on; % 打开坐标轴
xlabel('x (m)'); % 添加 x 轴标签
ylabel('z (m)'); % 添加 y 轴标签
% 获取当前图像的坐标轴范围
xlim_val = xlim;  % x 轴范围
ylim_val = ylim;  % y 轴范围
% 在图像上添加文字注释
text(mean(xlim_val), mean(ylim_val)*0.2, '10°', ...
    'HorizontalAlignment', 'center', 'FontSize', 10, 'Color', 'yellow');  % 在图像上添加文字
% 调整坐标轴位置,去除不必要的空白
%set(gca, 'Position', [0 0 1 1]);  % 设置坐标轴位置为图形窗口的整个区域
% 手动设置图形窗口为正方形
set(gcf, 'Position', [100, 100, 800, 200]);  % 确保窗口宽度和高度相同

phi = angle(U_coned);   如何调整生成图像的横坐标,使得从0开始,调整纵坐标使中间坐标为0
回复 支持 反对

使用道具 举报

机器人Gpt 发表于 5 天前 | 显示全部楼层
xxm 发表于 2025-03-24 16:44
% 参数设置
lambda = 840e-9; % 光波长 (单位:米)
k ...


要调整生成图像的横坐标使其从0开始,同时调整纵坐标使中间坐标为0,你可以根据生成的 x 和 z 的数组进行重新计算和设置。

### 修改步骤:

1. **调整 x 坐标**:让它从0开始。在计算 `x` 时,可能希望调整原点的位置。
2. **调整 z 坐标**:确保 `z` 坐标的中点处于 0(如果需要取对称范围,可以以 `z_max` 为依据)。

以下是如何实现这些调整的代码片段:

  1. % 参数设置
  2. lambda = 840e-9; % 光波长 (单位:米)
  3. k = 2 * pi / lambda; % 波数
  4. n = 1.451; % 介质的折射率
  5. cone_angle = 10 * pi / 180; % 锥的底角 (单位:弧度)
  6. z_max = 10e-3; % 模拟传播的最大距离 (单位:米)
  7. N = 512; % 图像的分辨率
  8. dx = 3.45e-6; % 每个像素的尺寸 (单位:米)
  9. dy = dx; % 假设为正方形像素

  10. % 空间坐标系
  11. x = (0:N-1) * dx; % 让 x 从 0 开始
  12. y = (-N/2:N/2-1) * dy;
  13. [X, Y] = meshgrid(x - mean(x), y); % 调整 x 使得中间值为0
  14. Rxy = sqrt(X.^2 + Y.^2); % 径向坐标

  15. % 锥透镜的相位调制
  16. phi_cone = k * Rxy * cone_angle * (n - 1); % 锥透镜的相位因子

  17. % 初始平面波场
  18. U0 = exp(1i * zeros(size(X))); % 平面波,初始相位为0

  19. % 通过锥透镜调制光波
  20. U_coned = U0 .* exp(-1i * phi_cone); % 平面波经过锥透镜调制

  21. % 计算频率空间 (角谱传播)
  22. fx = (-N/2:N/2-1) / (N * dx); % 频率坐标
  23. fy = fx;
  24. [Fx, Fy] = meshgrid(fx, fy);
  25. F = sqrt(Fx.^2 + Fy.^2); % 频率空间的径向坐标

  26. % 传播传递函数,考虑传播距离 z_max
  27. H = @(z) exp(1i * k * z * sqrt(1 - (lambda * F).^2));

  28. % 设置传播距离 z 的采样点
  29. z_samples = linspace(-z_max/2, z_max/2, 50); % 以 0 为中心

  30. % 对每个传播距离进行计算并可视化
  31. intensity_xz = zeros(N, length(z_samples)); % 预分配空间
  32. for i = 1:length(z_samples)
  33.     z = z_samples(i);
  34.    
  35.     % 计算传播到 z 处的场
  36.     U_freq = fftshift(fft2(U_coned));
  37.     U_freq = U_freq .* H(z);
  38.     U_propagated = ifft2(ifftshift(U_freq));

  39.     % 提取 y = 0 处的 xz 平面数据
  40.     y_idx = ceil(N / 2);
  41.     U_xz = U_propagated(:, y_idx);
  42.     intensity_xz(:, i) = abs(U_xz).^2;
  43. end

  44. % 绘制强度分布(xz平面的切片)
  45. figure;
  46. imagesc(x, z_samples, fliplr(intensity_xz));
  47. colormap('parula');
  48. axis on;
  49. xlabel('x (m)');
  50. ylabel('z (m)');
  51. colorbar;
  52. set(gca, 'YDir', 'normal');

  53. % 添加注释
  54. xlim_val = xlim;  
  55. ylim_val = ylim;  
  56. text(mean(xlim_val), mean(ylim_val)*0.2, '10°', 'HorizontalAlignment', 'center', 'FontSize', 10, 'Color', 'yellow');

  57. % 设置图形窗口大小
  58. set(gcf, 'Position', [100, 100, 600, 600]); % 确保窗口宽度和高度相同
复制代码


### 说明:
- `x` 坐标从 `0` 开始,而 `X` 在网格中被调整为中心对称(上移 `mean(x)`)。
- `z_samples` 中心设置为 `0`,即以传播的中点为 `0`。
- 这让 `x` 轴上从 `0` 开始,`z` 轴将围绕中心对称地显示传播的变化。这样在视图上得到所需的效果。
--- 光学专家Gpt
回复 支持 反对

使用道具 举报

匿名  发表于 5 天前
% 参数设置
lambda = 840e-9; % 光波长 (单位:米)
k = 2 * pi / lambda; % 波数
n = 1.451; % 介质的折射率
cone_angle = 10 * pi / 180; % 锥的底角 (单位:弧度)
z_max = 10e-3; % 模拟传播的最大距离 (单位:米)
N = 512; % 图像的分辨率
dx = 3.45e-6; % 每个像素的尺寸 (单位:米)
dy = dx; % 假设为正方形像素

% 空间坐标系
x = (-N/2:N/2 - 1) * dx;
y = (-N/2:N/2 - 1) * dy;
[X, Y] = meshgrid(x, y);
Rxy = sqrt(X.^2 + Y.^2); % 径向坐标

% 锥透镜的相位调制
phi_cone = k * Rxy * cone_angle * (n-1); % 锥透镜的相位因子

% 初始平面波场
U0 = exp(1i * zeros(size(X))); % 平面波,初始相位为0

% 通过锥透镜调制光波
U_coned = U0 .* exp(-1i * phi_cone); % 平面波经过锥透镜调制

% 计算频率空间 (角谱传播)
fx = (-N/2:N/2-1) / (N * dx); % 频率坐标
fy = fx;
[Fx, Fy] = meshgrid(fx, fy);
F = sqrt(Fx.^2 + Fy.^2); % 频率空间的径向坐标

% 传播传递函数,考虑传播距离 z_max
H = @(z) exp(1i * k * z * sqrt(1 - (lambda * F).^2)); % 角谱传播传递函数,动态传递

% 设置传播距离的采样点(例如,模拟从 0 到 z_max 的多个传播距离)
z_samples = linspace(0, z_max, 50); % 50 个传播距离
intensity_xz = zeros(N, length(z_samples)); % 预分配空间


% 对每个传播距离进行计算并可视化
for i = 1:length(z_samples)
    z = z_samples(i);
   
    % 计算传播到 z 处的场
    U_freq = fftshift(fft2(U_coned)); % 2D 傅里叶变换
    U_freq = U_freq .* H(z); % 应用传播传递函数
    U_propagated = ifft2(ifftshift(U_freq)); % 逆傅里叶变换回到空间域

    % 提取 y = 0 处的 xz 平面数据
    y_idx = ceil(N / 2);  % 选择 y = 0 处,即 Ny 中心
    U_xz = U_propagated(:, y_idx);  % 提取 xz 平面的数据
    % 计算强度分布 |U(x, 0, z)|^2并保存
    intensity_xz(:, i) = abs(U_xz).^2;  % 直接存入预分配的矩阵
   
end




% 绘制强度分布(xz平面的切片)
figure(1);  % 5 行 10 列的子图
% 对intensity_xz进行水平翻转,这里使用 fliplr 函数,它可以对矩阵进行左右翻转(水平翻转)
intensity_xz_flipped = fliplr(intensity_xz);
imagesc(x, [0 z_max], intensity_xz_flipped);  % 显示在 xz 平面上的强度分布
colormap('parula');
axis on; % 打开坐标轴
xlabel('x (m)'); % 添加 x 轴标签
ylabel('z (m)'); % 添加 y 轴标签
% 获取当前图像的坐标轴范围
xlim_val = xlim;  % x 轴范围
ylim_val = ylim;  % y 轴范围
% 在图像上添加文字注释
text(mean(xlim_val), mean(ylim_val)*0.2, '10°', ...
    'HorizontalAlignment', 'center', 'FontSize', 10, 'Color', 'yellow');  % 在图像上添加文字
% 调整坐标轴位置,去除不必要的空白
%set(gca, 'Position', [0 0 1 1]);  % 设置坐标轴位置为图形窗口的整个区域
% 手动设置图形窗口为正方形
set(gcf, 'Position', [100, 100, 800, 200]);  % 确保窗口宽度和高度相同

%phi = angle(U_coned);

%绘制相位分布灰度图
phi = angle(U_coned);  % 提取相位
figure;
imagesc(x, y, phi);  % 使用 imagesc 函数展示相位分布
axis equal;   % 保证坐标轴比例相等
colormap gray;                      % 使用灰度色图
colorbar;                           % 显示颜色条
title('Phase Distribution of the Lens');
xlabel('X');
ylabel('Y');          如何使图一x轴坐标从0开始,z轴坐标中间为0,图二坐标不变
回复 支持 反对

使用道具 举报

机器人Gpt 发表于 5 天前 | 显示全部楼层
xxm 发表于 2025-03-24 17:38
% 参数设置
lambda = 840e-9; % 光波长 (单位:米)
k ...


要实现图一的 `x` 轴坐标从 0 开始,而 `z` 轴坐标以中间为 0,同时保持图二的坐标不变,可以通过对 `x` 和 `z_samples` 进行适当的处理。

### 图一:调整坐标系

1. **调整 `x` 轴**:将 `x` 坐标从负值偏移到非负值。通常,这意味着将其转换为绝对值,以便从 0 开始。
2. **调整 `z` 轴**:基于中点设置为 0 的方法,改变 `z_samples` 在图中显示的范围。

  1. % 修改后的代码片段
  2. z_samples = linspace(-z_max / 2, z_max / 2, 50); % z轴以0为中心

  3. % 绘制强度分布(xz平面的切片)
  4. figure(1);
  5. imagesc(x + x(end)/2, z_samples, intensity_xz_flipped); % 调整x轴,使其从0开始
  6. colormap('parula');
  7. axis on;
  8. xlabel('x (m)');
  9. ylabel('z (m)');
  10. colorbar;
  11. % 添加文字注释
  12. text(mean(xlim), mean(ylim)*0.2, '10°', ...
  13.     'HorizontalAlignment', 'center', 'FontSize', 10, 'Color', 'yellow');

  14. set(gcf, 'Position', [100, 100, 600, 600]); % 确保窗口的宽度和高度相同
复制代码


### 图二:保持坐标不变

对于图二,由于只是展示相位分布,保持原有的 `x` 和 `y` 坐标即可,不需要做额外的调整。

  1. % 绘制相位分布灰度图
  2. phi = angle(U_coned);  % 提取相位
  3. figure;
  4. imagesc(x, y, phi);  % 使用 imagesc 函数展示相位分布
  5. axis equal;   % 保证坐标轴比例相等
  6. colormap gray; % 使用灰度色图
  7. colorbar; % 显示颜色条
  8. title('Phase Distribution of the Lens');
  9. xlabel('X');
  10. ylabel('Y');
复制代码


### 说明
- **`x + x(end)/2`**:在图一的绘制中通过调整 `x` 的起始位置,让其从 0 开始。具体实现是将所有 `x` 数据向右移动一个半宽度。
- **`z_samples`**:通过调整 `z_samples` 范围从 `[-z_max/2, z_max/2]`,使其中心为 0,以便展现对称的传播距离。
- **窗口大小设置**:`set(gcf, 'Position', [100, 100, 600, 600])` 设置图形窗口为正方形,更直观地观察到调整后的坐标。

请调整 `set(gcf, 'Position', ...)` 根据你的屏幕分辨率和需求来定义窗口的位置和大小。
--- 光学专家Gpt
回复 支持 反对

使用道具 举报

匿名  发表于 5 天前
调整`x` 的起始位置,让其从最左边为0开始
调整使z轴中心坐标为0,坐标向两边逐渐变化
回复 支持 反对

使用道具 举报

机器人Gpt 发表于 5 天前 | 显示全部楼层
xxm 发表于 2025-03-24 17:48
调整`x` 的起始位置,让其从最左边为0开始
调整使z轴 ...


为了调整图一的 `x` 轴使其从最左边开始为 0,并且将 `z` 轴调整为中间坐标为 0,坐标向两边逐渐变化,你需要对坐标轴的设置进行一些小的调整。

### 实现步骤:

1. **`x` 轴调整**:将 `x` 的值全部偏移到正值,使左边界为 0。
2. **`z` 轴设置**:将 `z_samples` 调整为对称的区间,以便中心为 0。

以下是调整后的代码片段:

  1. % 参数设置
  2. lambda = 840e-9; % 光波长 (单位:米)
  3. k = 2 * pi / lambda; % 波数
  4. n = 1.451; % 介质的折射率
  5. cone_angle = 10 * pi / 180; % 锥的底角 (单位:弧度)
  6. z_max = 10e-3; % 模拟传播的最大距离 (单位:米)
  7. N = 512; % 图像的分辨率
  8. dx = 3.45e-6; % 每个像素的尺寸 (单位:米)
  9. dy = dx; % 假设为正方形像素

  10. % 空间坐标系
  11. x = (0:N-1) * dx; % x 从 0 开始
  12. y = (-N/2:N/2 - 1) * dy;
  13. [X, Y] = meshgrid(x - mean(x), y); % 调整X以便中间为0
  14. Rxy = sqrt(X.^2 + Y.^2); % 径向坐标

  15. % 锥透镜的相位调制
  16. phi_cone = k * Rxy * cone_angle * (n-1); % 锥透镜的相位因子

  17. % 初始平面波场
  18. U0 = exp(1i * zeros(size(X))); % 平面波,初始相位为0

  19. % 通过锥透镜调制光波
  20. U_coned = U0 .* exp(-1i * phi_cone); % 平面波经过锥透镜调制

  21. % 计算频率空间 (角谱传播)
  22. fx = (-N/2:N/2-1)/ (N * dx); % 频率坐标
  23. fy = fx;
  24. [Fx, Fy] = meshgrid(fx, fy);
  25. F = sqrt(Fx.^2 + Fy.^2); % 频率空间的径向坐标

  26. % 传播传递函数,考虑传播距离 z_max
  27. H = @(z) exp(1i * k * z * sqrt(1 - (lambda * F).^2)); % 角谱传播传递函数,动态传递

  28. % 设置传播距离的采样点,z轴中心为0,范围为[-z_max/2, z_max/2]
  29. z_samples = linspace(-z_max/2, z_max/2, 50); % 中心对称

  30. % 计算强度分布并可视化
  31. intensity_xz = zeros(N, length(z_samples)); % 预分配空间
  32. for i = 1:length(z_samples)
  33.     z = z_samples(i);
  34.    
  35.     % 计算传播到 z 处的场
  36.     U_freq = fftshift(fft2(U_coned)); % 2D 傅里叶变换
  37.     U_freq = U_freq .* H(z); % 应用传播传递函数
  38.     U_propagated = ifft2(ifftshift(U_freq)); % 逆傅里叶变换回到空间域

  39.     % 提取 y = 0 处的 xz 平面数据
  40.     y_idx = ceil(N / 2);  % 选择 y = 0 处,即 Ny 中心
  41.     U_xz = U_propagated(:, y_idx); % 提取 xz 平面的数据
  42.    
  43.     % 计算强度分布 |U(x, 0, z)|^2 并保存
  44.     intensity_xz(:, i) = abs(U_xz).^2;
  45. end

  46. % 绘制强度分布(xz平面的切片)
  47. figure;
  48. imagesc(x, z_samples, intensity_xz);
  49. colormap('parula');
  50. axis on;
  51. xlabel('x (m)');
  52. ylabel('z (m)');
  53. colorbar;
  54. title('Intensity Distribution (XZ plane)');

  55. set(gca, 'YDir', 'normal'); % 确保 z 坐标方向正确

  56. % 注释说明
  57. xlim_val = xlim;
  58. ylim_val = ylim;
  59. text(mean(xlim_val), mean(ylim_val)*0.2, '10°', ...
  60.      'HorizontalAlignment', 'center', 'FontSize', 10, 'Color', 'yellow');
复制代码


### 说明:
- `x` 轴已经从 0 开始,这是通过设置 `x = (0:N-1) * dx` 来实现的。
- `z` 轴中心被设置为 0,这是通过设置 `z_samples` 范围为 `[−z_max/2, z_max/2]`。
- 这一调整确保了我们在图形中观察到的是一个从 0 开始的 x 轴和一个对称的 z 轴。
--- 光学专家Gpt
回复 支持 反对

使用道具 举报

快速回帖

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

本版积分规则

关于楼主

匿名用户组
  • 主题

    26
  • 回答

    5
  • 积分

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