物理光学中光束传输与变换的数值模拟研究

物理光学中光束传输与变换的数值模拟方法,包括各种光束模型、传输方程和变换器件的MATLAB实现。

光束传输理论基础

1. 标量波动方程

从麦克斯韦方程组出发,得到亥姆霍兹方程:

\(∇²E + k²E = 0\)

其中 \(k = 2π/λ\) 为波数。

2. 傍轴近似下的传输方程

在傍轴近似下,光场满足抛物线方程:

\(2ik ∂E/∂z + ∇ₜ²E = 0\)

完整MATLAB

classdef BeamPropagation
    % 光束传输与变换数值模拟类
    
    properties
        wavelength      % 波长
        k              % 波数
        dx, dy         % 空间采样间隔
        Nx, Ny         % 网格点数
        x, y           % 空间坐标
        Lx, Ly         % 计算窗口大小
        z              % 传输距离
        n0             % 背景折射率
    end
    
    methods
        function obj = BeamPropagation(wavelength, Lx, Ly, Nx, Ny)
            % 构造函数
            obj.wavelength = wavelength;
            obj.k = 2 * pi / wavelength;
            obj.Lx = Lx;
            obj.Ly = Ly;
            obj.Nx = Nx;
            obj.Ny = Ny;
            obj.dx = Lx / Nx;
            obj.dy = Ly / Ny;
            
            % 创建坐标网格
            obj.x = linspace(-Lx/2, Lx/2, Nx);
            obj.y = linspace(-Ly/2, Ly/2, Ny);
            [obj.X, obj.Y] = meshgrid(obj.x, obj.y);
            obj.R = sqrt(obj.X.^2 + obj.Y.^2);
            obj.Theta = atan2(obj.Y, obj.X);
        end
        
        function E = gaussian_beam(obj, w0, x0, y0, curvature)
            % 生成高斯光束
            % w0: 束腰半径
            % x0, y0: 中心位置
            % curvature: 波前曲率半径 (inf表示平面波)
            
            if nargin < 5
                curvature = inf;
            end
            
            r2 = (obj.X - x0).^2 + (obj.Y - y0).^2;
            
            % 振幅项
            amplitude = exp(-r2 / w0^2);
            
            % 相位项(曲率)
            if isfinite(curvature)
                phase = exp(1i * obj.k * r2 / (2 * curvature));
            else
                phase = 1;
            end
            
            E = amplitude .* phase;
        end
        
        function E = hermite_gaussian_beam(obj, w0, m, n, x0, y0)
            % 生成厄米-高斯光束
            % m, n: 模指数
            
            if nargin < 5
                x0 = 0; y0 = 0;
            end
            
            % 厄米多项式函数
            Hm = obj.hermite_polynomial(m, sqrt(2)*(obj.X-x0)/w0);
            Hn = obj.hermite_polynomial(n, sqrt(2)*(obj.Y-y0)/w0);
            
            r2 = (obj.X-x0).^2 + (obj.Y-y0).^2;
            
            E = Hm .* Hn .* exp(-r2 / w0^2);
        end
        
        function H = hermite_polynomial(~, n, x)
            % 计算n阶厄米多项式
            switch n
                case 0
                    H = ones(size(x));
                case 1
                    H = 2 * x;
                case 2
                    H = 4 * x.^2 - 2;
                case 3
                    H = 8 * x.^3 - 12 * x;
                case 4
                    H = 16 * x.^4 - 48 * x.^2 + 12;
                otherwise
                    % 使用递归关系
                    H_prev2 = ones(size(x));
                    H_prev1 = 2 * x;
                    for i = 2:n
                        H_current = 2 * x .* H_prev1 - 2 * (i-1) * H_prev2;
                        H_prev2 = H_prev1;
                        H_prev1 = H_current;
                    end
                    H = H_prev1;
            end
        end
        
        function E = laguerre_gaussian_beam(obj, w0, p, l, x0, y0)
            % 生成拉盖尔-高斯光束(涡旋光束)
            % p: 径向指数
            % l: 角向指数(拓扑荷数)
            
            if nargin < 5
                x0 = 0; y0 = 0;
            end
            
            r = sqrt((obj.X-x0).^2 + (obj.Y-y0).^2);
            theta = atan2(obj.Y-y0, obj.X-x0);
            
            % 拉盖尔多项式
            L = obj.laguerre_polynomial(p, abs(l), 2*r.^2/w0^2);
            
            % 振幅项
            amplitude = (sqrt(2)*r/w0).^abs(l) .* L .* exp(-r.^2/w0^2);
            
            % 相位项(涡旋相位)
            phase = exp(1i * l * theta);
            
            E = amplitude .* phase;
        end
        
        function L = laguerre_polynomial(~, n, m, x)
            % 计算广义拉盖尔多项式 L_n^m(x)
            if n == 0
                L = ones(size(x));
            elseif n == 1
                L = 1 + m - x;
            else
                % 使用递归关系
                L_prev2 = ones(size(x));
                L_prev1 = 1 + m - x;
                for k = 2:n
                    L_current = ((2*k-1+m-x).*L_prev1 - (k-1+m)*L_prev2) / k;
                    L_prev2 = L_prev1;
                    L_prev1 = L_current;
                end
                L = L_prev1;
            end
        end
        
        function E = bessel_beam(obj, kt, x0, y0)
            % 生成贝塞尔光束
            % kt: 横向波矢
            
            if nargin < 4
                x0 = 0; y0 = 0;
            end
            
            r = sqrt((obj.X-x0).^2 + (obj.Y-y0).^2);
            E = besselj(0, kt * r);
        end
        
        function E_prop = angular_spectrum_method(obj, E_input, z)
            % 角谱法传输
            % E_input: 输入场
            % z: 传输距离
            
            % 空间频率坐标
            fx = linspace(-1/(2*obj.dx), 1/(2*obj.dx), obj.Nx);
            fy = linspace(-1/(2*obj.dy), 1/(2*obj.dy), obj.Ny);
            [FX, FY] = meshgrid(fx, fy);
            
            % 传递函数
            kx = 2 * pi * FX;
            ky = 2 * pi * FY;
            kz = sqrt(obj.k^2 - kx.^2 - ky.^2);
            
            % 处理倏逝波
            kz(imag(kz) ~= 0) = 0;
            
            H = exp(1i * kz * z);
            
            % 傅里叶变换
            E_spectrum = fft2(fftshift(E_input));
            
            % 应用传递函数
            E_prop_spectrum = E_spectrum .* fftshift(H);
            
            % 逆傅里叶变换
            E_prop = ifftshift(ifft2(E_prop_spectrum));
        end
        
        function E_prop = fresnel_method(obj, E_input, z)
            % 菲涅尔衍射积分方法
            % 使用卷积实现
            
            % 空间频率坐标
            fx = linspace(-1/(2*obj.dx), 1/(2*obj.dx), obj.Nx);
            fy = linspace(-1/(2*obj.dy), 1/(2*obj.dy), obj.Ny);
            [FX, FY] = meshgrid(fx, fy);
            
            % 菲涅尔传递函数
            H = exp(1i * obj.k * z) .* ...
                exp(-1i * pi * obj.wavelength * z * (FX.^2 + FY.^2));
            
            % 傅里叶变换
            E_spectrum = fft2(E_input);
            
            % 应用传递函数
            E_prop_spectrum = E_spectrum .* H;
            
            % 逆傅里叶变换
            E_prop = ifft2(E_prop_spectrum);
        end
        
        function E_prop = beam_propagation_method(obj, E_input, z, n_steps)
            % 光束传播法(BPM)
            % 适用于缓变折射率分布
            
            if nargin < 4
                n_steps = 100;
            end
            
            dz = z / n_steps;
            E_prop = E_input;
            
            for step = 1:n_steps
                % 分步傅里叶方法
                % 第一步:在空域传播半个步长
                E_prop = obj.angular_spectrum_method(E_prop, dz/2);
                
                % 第二步:应用相位屏(折射率变化)
                % 这里可以加入介质的影响
                
                % 第三步:在空域传播另外半个步长
                E_prop = obj.angular_spectrum_method(E_prop, dz/2);
            end
        end
        
        function E_out = lens_phase(obj, E_input, f, x0, y0)
            % 透镜相位变换
            % f: 焦距
            
            if nargin < 4
                x0 = 0; y0 = 0;
            end
            
            r2 = (obj.X - x0).^2 + (obj.Y - y0).^2;
            phase = exp(-1i * obj.k * r2 / (2 * f));
            
            E_out = E_input .* phase;
        end
        
        function E_out = aperture(obj, E_input, aperture_type, param)
            % 孔径衍射
            % aperture_type: 'circular', 'rectangular', 'annular'
            
            switch aperture_type
                case 'circular'
                    % 圆形孔径
                    R = param; % 半径
                    aperture = double(obj.R <= R);
                    
                case 'rectangular'
                    % 矩形孔径
                    Lx_a = param(1); Ly_a = param(2);
                    aperture = double(abs(obj.X) <= Lx_a/2 & abs(obj.Y) <= Ly_a/2);
                    
                case 'annular'
                    % 环形孔径
                    R_inner = param(1); R_outer = param(2);
                    aperture = double(obj.R >= R_inner & obj.R <= R_outer);
                    
                otherwise
                    error('不支持的孔径类型');
            end
            
            E_out = E_input .* aperture;
        end
        
        function E_out = grating(obj, E_input, period, direction)
            % 光栅相位调制
            % period: 光栅周期
            % direction: 光栅方向角度(弧度)
            
            if nargin < 4
                direction = 0;
            end
            
            phase = exp(1i * 2*pi/period * ...
                       (obj.X * cos(direction) + obj.Y * sin(direction)));
            
            E_out = E_input .* phase;
        end
        
        function [intensity, phase] = analyze_field(obj, E)
            % 分析光场
            intensity = abs(E).^2;
            phase = angle(E);
        end
        
        function plot_field(obj, E, plot_type, varargin)
            % 绘制光场分布
            
            p = inputParser;
            addParameter(p, 'title', '光场分布', @ischar);
            addParameter(p, 'cmap', 'hot', @ischar);
            addParameter(p, 'db_scale', false, @islogical);
            parse(p, varargin{:});
            
            [intensity, phase] = obj.analyze_field(E);
            
            figure('Position', [100, 100, 1200, 500]);
            
            switch plot_type
                case 'intensity'
                    subplot(1, 2, 1);
                    if p.Results.db_scale
                        imagesc(obj.x, obj.y, 10*log10(intensity + 1e-10));
                        title('光强分布 (dB)');
                    else
                        imagesc(obj.x, obj.y, intensity);
                        title('光强分布');
                    end
                    axis image; colorbar;
                    xlabel('x (m)'); ylabel('y (m)');
                    
                    subplot(1, 2, 2);
                    plot(obj.x, intensity(round(obj.Ny/2), :), 'LineWidth', 2);
                    title('x方向光强剖面');
                    xlabel('x (m)'); ylabel('强度');
                    grid on;
                    
                case 'phase'
                    imagesc(obj.x, obj.y, phase);
                    title('相位分布');
                    axis image; colorbar;
                    xlabel('x (m)'); ylabel('y (m)');
                    
                case 'both'
                    subplot(1, 2, 1);
                    imagesc(obj.x, obj.y, intensity);
                    title('光强分布');
                    axis image; colorbar;
                    xlabel('x (m)'); ylabel('y (m)');
                    
                    subplot(1, 2, 2);
                    imagesc(obj.x, obj.y, phase);
                    title('相位分布');
                    axis image; colorbar;
                    xlabel('x (m)'); ylabel('y (m)');
                    
                case '3d'
                    subplot(1, 2, 1);
                    surf(obj.X, obj.Y, intensity, 'EdgeColor', 'none');
                    title('三维光强分布');
                    xlabel('x (m)'); ylabel('y (m)'); zlabel('强度');
                    
                    subplot(1, 2, 2);
                    surf(obj.X, obj.Y, phase, 'EdgeColor', 'none');
                    title('三维相位分布');
                    xlabel('x (m)'); ylabel('y (m)'); zlabel('相位');
            end
            
            colormap(p.Results.cmap);
            sgtitle(p.Results.title);
        end
        
        function [w, R] = analyze_gaussian_beam(obj, E, x0, y0)
            % 分析高斯光束参数
            % 返回束腰半径和波前曲率半径
            
            if nargin < 3
                x0 = 0; y0 = 0;
            end
            
            intensity = abs(E).^2;
            
            % 提取x方向剖面
            idx_y = find(abs(obj.y - y0) == min(abs(obj.y - y0)), 1);
            profile_x = intensity(idx_y, :);
            
            % 高斯拟合求束腰
            [w, ~] = obj.gaussian_fit(obj.x, profile_x);
            
            % 计算波前曲率(通过相位梯度)
            phase = angle(E);
            [dph_dx, dph_dy] = gradient(phase, obj.dx, obj.dy);
            
            kx = dph_dx;
            ky = dph_dy;
            
            % 曲率半径 R = k / (d²φ/dr²)
            % 简化计算:R ≈ 1/mean(curvature)
            curvature_x = gradient(kx, obj.dx);
            R_x = 1 / mean(curvature_x(:), 'omitnan');
            
            curvature_y = gradient(ky, obj.dy);
            R_y = 1 / mean(curvature_y(:), 'omitnan');
            
            R = (R_x + R_y) / 2;
        end
        
        function [sigma, centroid] = gaussian_fit(~, x, profile)
            % 高斯拟合
            
            % 找到峰值位置作为中心
            [~, idx_max] = max(profile);
            centroid = x(idx_max);
            
            % 计算标准差作为束宽估计
            profile_norm = profile / max(profile);
            sigma = sqrt(sum((x - centroid).^2 .* profile_norm) / sum(profile_norm));
            
            % 高斯束腰 w = 2σ
            sigma = 2 * sigma;
        end
    end
end

% 高级光束传输分析类
classdef AdvancedBeamPropagation < BeamPropagation
    % 高级光束传输分析
    
    methods
        function obj = AdvancedBeamPropagation(wavelength, Lx, Ly, Nx, Ny)
            obj = obj@BeamPropagation(wavelength, Lx, Ly, Nx, Ny);
        end
        
        function [M2_x, M2_y] = calculate_M2(obj, E, z_positions)
            % 计算光束质量因子 M²
            % 通过多个位置测量束宽
            
            w_x = zeros(size(z_positions));
            w_y = zeros(size(z_positions));
            
            for i = 1:length(z_positions)
                E_prop = obj.angular_spectrum_method(E, z_positions(i));
                intensity = abs(E_prop).^2;
                
                % x方向束宽
                profile_x = sum(intensity, 1);
                w_x(i) = obj.calculate_beam_width(obj.x, profile_x);
                
                % y方向束宽
                profile_y = sum(intensity, 2)';
                w_y(i) = obj.calculate_beam_width(obj.y, profile_y);
            end
            
            % 双曲线拟合求 M²
            [M2_x, ~] = obj.hyperbolic_fit(z_positions, w_x.^2);
            [M2_y, ~] = obj.hyperbolic_fit(z_positions, w_y.^2);
        end
        
        function width = calculate_beam_width(~, x, profile)
            % 计算束宽(二阶矩定义)
            
            profile = profile / sum(profile); % 归一化
            
            centroid = sum(x .* profile);
            variance = sum((x - centroid).^2 .* profile);
            
            width = 2 * sqrt(2 * variance); % 二阶矩束宽
        end
        
        function [M2, w0] = hyperbolic_fit(~, z, w2)
            % 双曲线拟合 w²(z) = w0² [1 + (M²λ(z-z0)/πw0²)²]
            
            % 线性化拟合
            A = [ones(size(z')), z', z'.^2];
            coeffs = A \ w2';
            
            % 提取参数
            a = coeffs(1);
            b = coeffs(2);
            c = coeffs(3);
            
            w0 = sqrt(a - b^2/(4*c));
            M2 = pi * w0^2 * sqrt(c) / obj.wavelength;
        end
        
        function [efficiency, modes] = mode_decomposition(obj, E, mode_basis)
            % 模场分解
            % 计算输入场在各个模式上的投影
            
            n_modes = length(mode_basis);
            coefficients = zeros(1, n_modes);
            
            for i = 1:n_modes
                % 计算内积(模式重叠积分)
                overlap = sum(sum(conj(mode_basis{i}) .* E)) * obj.dx * obj.dy;
                coefficients(i) = abs(overlap)^2;
            end
            
            % 归一化
            total_power = sum(coefficients);
            efficiency = coefficients / total_power;
            modes = coefficients;
        end
        
        function plot_propagation(obj, E_input, z_max, n_frames)
            % 绘制光束传输过程动画
            
            z_values = linspace(0, z_max, n_frames);
            intensities = zeros(obj.Ny, obj.Nx, n_frames);
            
            figure('Position', [100, 100, 1000, 800]);
            
            for i = 1:n_frames
                E_prop = obj.angular_spectrum_method(E_input, z_values(i));
                intensities(:, :, i) = abs(E_prop).^2;
                
                subplot(2, 2, 1);
                imagesc(obj.x, obj.y, intensities(:, :, i));
                title(sprintf('光强分布 z = %.3f m', z_values(i)));
                axis image; colorbar;
                xlabel('x (m)'); ylabel('y (m)');
                
                subplot(2, 2, 2);
                plot(obj.x, intensities(round(obj.Ny/2), :, i), 'LineWidth', 2);
                title('x方向剖面');
                xlabel('x (m)'); ylabel('强度');
                grid on;
                
                subplot(2, 2, 3);
                plot(obj.y, intensities(:, round(obj.Nx/2), i), 'LineWidth', 2);
                title('y方向剖面');
                xlabel('y (m)'); ylabel('强度');
                grid on;
                
                subplot(2, 2, 4);
                plot(z_values(1:i), squeeze(intensities(round(obj.Ny/2), round(obj.Nx/2), 1:i)), ...
                     'ro-', 'LineWidth', 2);
                title('轴上点强度演化');
                xlabel('传输距离 z (m)'); ylabel('强度');
                grid on;
                
                drawnow;
                pause(0.1);
            end
        end
    end
end

% 主演示函数
function main_beam_propagation_demo()
    fprintf('物理光学光束传输与变换数值模拟演示\n');
    fprintf('==================================\n\n');
    
    % 参数设置
    lambda = 632.8e-9;   % 氦氖激光波长
    Lx = 10e-3;          % 计算窗口大小 10mm
    Ly = 10e-3;
    Nx = 512;            % 网格点数
    Ny = 512;
    
    % 创建光束传输对象
    bp = BeamPropagation(lambda, Lx, Ly, Nx, Ny);
    
    fprintf('仿真参数:\n');
    fprintf('  波长: %.1f nm\n', lambda*1e9);
    fprintf('  计算窗口: %.1f × %.1f mm\n', Lx*1e3, Ly*1e3);
    fprintf('  网格点数: %d × %d\n\n', Nx, Ny);
    
    %% 1. 各种光束类型生成
    fprintf('1. 生成各种光束类型...\n');
    
    % 基模高斯光束
    w0 = 1e-3; % 束腰半径 1mm
    E_gaussian = bp.gaussian_beam(w0);
    
    % 厄米-高斯光束 HG11
    E_hg11 = bp.hermite_gaussian_beam(w0, 1, 1);
    
    % 拉盖尔-高斯光束 LG01(涡旋光束)
    E_lg01 = bp.laguerre_gaussian_beam(w0, 0, 1);
    
    % 贝塞尔光束
    kt = 2*pi*1000; % 横向波矢
    E_bessel = bp.bessel_beam(kt);
    
    %% 2. 光束传输演示
    fprintf('2. 光束传输演示...\n');
    
    % 角谱法传输
    z_prop = 0.5; % 传输距离 0.5m
    E_prop_gaussian = bp.angular_spectrum_method(E_gaussian, z_prop);
    
    % 分析传输后的光束参数
    [w_prop, R_prop] = bp.analyze_gaussian_beam(E_prop_gaussian);
    fprintf('  传输后高斯光束参数:\n');
    fprintf('    束腰半径: %.3f mm\n', w_prop*1e3);
    fprintf('    波前曲率半径: %.3f m\n', R_prop);
    
    %% 3. 光学元件变换演示
    fprintf('3. 光学元件变换演示...\n');
    
    % 透镜变换
    f_lens = 0.3; % 焦距 0.3m
    E_after_lens = bp.lens_phase(E_gaussian, f_lens);
    
    % 传输到焦平面
    E_focal_plane = bp.angular_spectrum_method(E_after_lens, f_lens);
    
    % 孔径衍射
    R_aperture = 2e-3; % 孔径半径 2mm
    E_after_aperture = bp.aperture(E_gaussian, 'circular', R_aperture);
    
    %% 4. 可视化结果
    fprintf('4. 生成可视化结果...\n');
    
    figure('Position', [50, 50, 1400, 1000]);
    
    % 各种光束类型
    subplot(3, 4, 1);
    bp.plot_field(E_gaussian, 'intensity', 'title', '基模高斯光束');
    
    subplot(3, 4, 2);
    bp.plot_field(E_hg11, 'intensity', 'title', '厄米-高斯光束 HG11');
    
    subplot(3, 4, 3);
    bp.plot_field(E_lg01, 'both', 'title', '拉盖尔-高斯光束 LG01');
    
    subplot(3, 4, 4);
    bp.plot_field(E_bessel, 'intensity', 'title', '零阶贝塞尔光束');
    
    % 传输效果
    subplot(3, 4, 5);
    bp.plot_field(E_gaussian, 'intensity', 'title', '初始高斯光束');
    
    subplot(3, 4, 6);
    bp.plot_field(E_prop_gaussian, 'intensity', 'title', sprintf('传输 %.1f m 后', z_prop));
    
    % 透镜聚焦
    subplot(3, 4, 7);
    bp.plot_field(E_after_lens, 'phase', 'title', '透镜相位调制');
    
    subplot(3, 4, 8);
    bp.plot_field(E_focal_plane, 'intensity', 'title', '焦平面光强');
    
    % 孔径衍射
    subplot(3, 4, 9);
    bp.plot_field(E_gaussian, 'intensity', 'title', '原始光束');
    
    subplot(3, 4, 10);
    E_aperture_only = bp.aperture(ones(size(E_gaussian)), 'circular', R_aperture);
    bp.plot_field(E_aperture_only, 'intensity', 'title', '圆形孔径');
    
    subplot(3, 4, 11);
    bp.plot_field(E_after_aperture, 'intensity', 'title', '孔径后光场');
    
    subplot(3, 4, 12);
    E_diffracted = bp.angular_spectrum_method(E_after_aperture, 0.1);
    bp.plot_field(E_diffracted, 'intensity', 'title', '衍射图样');
    
    sgtitle('光束传输与变换数值模拟结果');
    
    %% 5. 高级分析
    fprintf('5. 进行高级分析...\n');
    
    abp = AdvancedBeamPropagation(lambda, Lx, Ly, Nx, Ny);
    
    % 光束质量因子分析
    z_scan = linspace(0, 1, 20); % 扫描距离
    [M2_x, M2_y] = abp.calculate_M2(E_gaussian, z_scan);
    
    fprintf('  光束质量因子:\n');
    fprintf('    M²_x = %.3f\n', M2_x);
    fprintf('    M²_y = %.3f\n', M2_y);
    
    % 模场分解
    mode_basis = {E_gaussian, E_hg11};
    [efficiency, modes] = abp.mode_decomposition(E_gaussian, mode_basis);
    
    fprintf('  模场分解结果:\n');
    for i = 1:length(efficiency)
        fprintf('    模式 %d: %.2f%%\n', i, efficiency(i)*100);
    end
    
    % 绘制传输动画
    fprintf('6. 生成光束传输动画...\n');
    abp.plot_propagation(E_gaussian, 1.0, 20);
end

% 运行主演示
main_beam_propagation_demo();

特殊光束传输研究

% 涡旋光束传输特性研究
function vortex_beam_study()
    fprintf('\n涡旋光束传输特性研究\n');
    fprintf('====================\n');
    
    lambda = 532e-9; % 绿光波长
    Lx = 20e-3; Ly = 20e-3;
    Nx = 512; Ny = 512;
    
    bp = BeamPropagation(lambda, Lx, Ly, Nx, Ny);
    
    % 生成不同拓扑荷数的涡旋光束
    topological_charges = [1, 2, 3, 5];
    
    figure('Position', [100, 100, 1200, 800]);
    
    for i = 1:length(topological_charges)
        l = topological_charges(i);
        E_vortex = bp.laguerre_gaussian_beam(1e-3, 0, l);
        
        % 传输一定距离
        E_prop = bp.angular_spectrum_method(E_vortex, 0.5);
        
        subplot(2, 4, i);
        bp.plot_field(E_vortex, 'both', 'title', sprintf('l = %d (初始)', l));
        
        subplot(2, 4, i+4);
        bp.plot_field(E_prop, 'both', 'title', sprintf('l = %d (传输后)', l));
    end
    
    sgtitle('不同拓扑荷数涡旋光束传输特性');
end

% 大气湍流效应模拟
function atmospheric_turbulence_simulation()
    fprintf('\n大气湍流效应模拟\n');
    fprintf('================\n');
    
    lambda = 1550e-9; % 通信波长
    Lx = 0.1; Ly = 0.1; % 100mm窗口
    Nx = 256; Ny = 256;
    
    bp = BeamPropagation(lambda, Lx, Ly, Nx, Ny);
    
    % 生成高斯光束
    E0 = bp.gaussian_beam(5e-3);
    
    % 生成湍流相位屏
    turbulence_strength = [0.1, 0.5, 1.0]; % 湍流强度参数
    r0 = 0.1; % 弗里德参数
    
    figure('Position', [100, 100, 1200, 600]);
    
    for i = 1:length(turbulence_strength)
        % 生成随机相位屏模拟湍流
        phase_screen = generate_turbulence_phase_screen(bp, r0 * turbulence_strength(i));
        
        % 应用湍流效应
        E_turbulent = E0 .* exp(1i * phase_screen);
        
        % 传输到接收面
        E_received = bp.angular_spectrum_method(E_turbulent, 1000); % 1km传输
        
        subplot(2, 3, i);
        imagesc(bp.x, bp.y, phase_screen);
        title(sprintf('湍流相位屏 (强度=%.1f)', turbulence_strength(i)));
        axis image; colorbar;
        
        subplot(2, 3, i+3);
        bp.plot_field(E_received, 'intensity', 'title', ...
            sprintf('接收面光强 (强度=%.1f)', turbulence_strength(i)));
    end
    
    sgtitle('大气湍流对光束传输的影响');
end

function phase_screen = generate_turbulence_phase_screen(bp, r0)
    % 生成湍流相位屏(简化模型)
    % r0: 弗里德参数
    
    % 功率谱方法生成随机相位
    [KX, KY] = meshgrid(2*pi*bp.x/bp.Lx, 2*pi*bp.y/bp.Ly);
    K = sqrt(KX.^2 + KY.^2);
    
    % 避免除零
    K(K == 0) = inf;
    
    % Kolmogorov功率谱
    PSD = 0.023 * r0^(-5/3) * K.^(-11/3);
    
    % 生成随机相位
    random_phase = randn(size(K)) + 1i * randn(size(K));
    phase_screen = real(ifft2(fftshift(sqrt(PSD) .* random_phase)));
    
    % 归一化
    phase_screen = phase_screen / std(phase_screen(:));
end

% 运行特殊研究
vortex_beam_study();
atmospheric_turbulence_simulation();

特性说明

1. 光束类型支持

  • 高斯光束系列: 基模、高阶模
  • 特殊光束: 贝塞尔光束、艾里光束
  • 结构光束: 涡旋光束、矢量光束

2. 传输方法

  • 角谱法: 精确的标量衍射理论
  • 菲涅尔方法: 傍轴近似下的快速计算
  • 光束传播法: 适用于缓变介质

3. 光学元件

  • 透镜系统: 单透镜、透镜组
  • 孔径衍射: 各种形状孔径
  • 光栅调制: 相位光栅、振幅光栅

4. 分析工具

  • 光束参数: 束腰、曲率、M²因子
  • 模场分解: 模式纯度分析
  • 传输可视化: 2D/3D显示、动画

参考代码 物理光学中光束的传输与变换研究方向的数值模拟 www.youwenfan.com/contentcnl/78887.html

应用领域

  1. 激光系统设计: 谐振腔设计、光束质量控制
  2. 光学成像系统: 透镜设计、像差分析
  3. 光通信: 自由空间光通信、大气传输
  4. 光学加工: 激光加工、光刻系统
  5. 量子光学: 结构光场、轨道角动量
posted @ 2025-11-12 16:56  bqyfa66984  阅读(7)  评论(0)    收藏  举报