严格耦合波分析计算光栅衍射效率算法

严格耦合波分析(RCWA,又称傅里叶模态法 FMM)计算光栅衍射效率算法。


一、RCWA 算法核心流程

RCWA 将光栅结构沿 z 轴切片,对每一层进行傅里叶展开:

复制代码
1. 构造介电常数/折射率傅里叶级数 ε(x,y) → [ε]
2. 求解本征方程:([Kx]^2 + [Ky]^2 - ω²μ0[ε]) * E = 0
3. 计算特征向量(模式场)与特征值(传播常数)
4. 利用 S 矩阵(散射矩阵)连接各层,避免数值发散
5. 计算透射/反射端口的 Poynting 矢量 → 衍射效率

二、关键数学模型

1、傅里叶展开

对于周期为 Λ\LambdaΛ 的光栅,介电常数展开为:
ε(x)=∑m=−MMεmejmKx,K=2πΛ \varepsilon(x) = \sum_{m=-M}^{M} \varepsilon_m e^{j m K x}, \quad K = \frac{2\pi}{\Lambda} ε(x)=m=−M∑MεmejmKx,K=Λ2π

2、本征方程

(KxKx+KyKy−ω2μ0ε)E=0 \left( K_xK_x + K_yK_y - \omega^2 \mu_0 \\varepsilon \right) \mathbf{E} = 0 (KxKx+KyKy−ω2μ0ε)E=0

其中 ε\\varepsilonεToeplitz 矩阵


三、MATLAB 核心代码实现

1、 傅里叶级数构造

matlab 复制代码
function [eps_conv] = fourier_epsilon(eps_r, M)
% 计算介电常数的傅里叶卷积矩阵
% eps_r: 实空间折射率分布 (Nx x Ny)
% M: 截断阶数 (-M to M)

[Nx, Ny] = size(eps_r);
eps_conv = zeros(2*M+1, 2*M+1);

% 傅里叶变换
eps_fft = fftshift(fft2(eps_r));

% 填充卷积矩阵 (Toeplitz)
for row = -M:M
    for col = -M:M
        eps_conv(row+M+1, col+M+1) = eps_fft(row+Nx/2+1, col+Ny/2+1);
    end
end
eps_conv = eps_conv / (Nx * Ny); % 归一化
end

2、本征模求解

matlab 复制代码
function [kx, Ey] = solve_modes(lambda, epsilon_mat, M, theta)
% 求解光栅层的本征模
% lambda: 波长
% epsilon_mat: 介电常数傅里叶矩阵
% theta: 入射角

k0 = 2 * pi / lambda;
kx_inc = k0 * sin(theta); % 入射波矢x分量

% 构建波矢矩阵 Kx
Kx = diag(kx_inc + (0:M) * 2*pi/lambda);

% 本征方程: (Kx^2 - k0^2 * epsilon) * E = 0
A = Kx^2 - k0^2 * epsilon_mat;

% 求解广义特征值
[eig_vec, eig_val] = eig(A);
kx = sqrt(diag(eig_val)); % 传播常数
Ey = eig_vec;            % 模式场分布
end

3、S 矩阵算法

matlab 复制代码
function [R, T] = s_matrix_propagation(layers, k0, kx_list)
% S矩阵法连接多层结构
% layers: 每层参数结构体
% k0: 真空波数
% kx_list: 各阶衍射波矢

% 初始化 S 矩阵
S11 = zeros(length(kx_list));
S12 = eye(length(kx_list));
S21 = eye(length(kx_list));
S22 = zeros(length(kx_list));

for i = 1:length(layers)
    layer = layers(i);
    
    % 计算单层传输矩阵 F
    F = exp(1j * layer.kz * layer.thickness);
    
    % 更新 S 矩阵 (递归公式)
    % ... (此处省略具体矩阵运算,保持简洁)
end

% 提取反射率 R 和透射率 T
R = abs(S11).^2;
T = abs(S21).^2;
end

四、1D 光栅衍射效率计算

matlab 复制代码
%% 1. 参数设置
lambda = 1550e-9;      % 波长 (nm)
period = 800e-9;       % 光栅周期 (nm)
duty_cycle = 0.5;      % 占空比
n_sub = 1.45;          % 衬底折射率
n_air = 1.0;          % 空气折射率
M = 5;                % 傅里叶阶数 (通常 5~15)

%% 2. 构建光栅折射率分布
Nx = 1024;
x = linspace(0, period, Nx);
eps_r = ones(1, Nx) * n_air^2;
eps_r(x < duty_cycle*period) = n_sub^2;

%% 3. 傅里叶展开
eps_mat = fourier_epsilon(eps_r, M);

%% 4. 求解本征模
theta = 0; % 正入射
[kx, modes] = solve_modes(lambda, eps_mat, M, theta);

%% 5. 计算衍射效率
% 0阶透射效率 (TE偏振)
eff_0th = abs(modes(1,1))^2 * real(kx(1)) / (k0 * cos(theta));

fprintf('0阶衍射效率: %.2f%%\n', eff_0th * 100);

参考代码 严格耦合波分析 www.youwenfan.com/contentcsu/63879.html

五、收敛性与工程经验

参数 建议值 影响
傅里叶阶数 M 5 ~ 15 M 太小 → 精度低;M 太大 → 数值不稳定
介电常数反演 使用 Li 反演 普通傅里叶级数在金属/介质界面误差极大
S 矩阵 必须使用 避免厚光栅的指数发散
网格分辨率 > 10 pts/period 确保傅里叶变换精度

Li 反演公式(必选)

对于磁场 H\mathbf{H}H,应使用:
1ε(x)=∑m(1ε)mejmKx \frac{1}{\varepsilon(x)} = \sum_{m} \left(\frac{1}{\varepsilon}\right)_m e^{jmKx} ε(x)1=m∑(ε1)mejmKx

而非直接对 ε\varepsilonε 展开。


六、支持的光栅类型

1D 光栅 (矩形、正弦、倾斜)
2D 光栅 (十字交叉、二维周期)
各向异性材料 (液晶、钙钛矿)
多层堆叠光栅
锥形衍射(Conical Mounting)

相关推荐
AIGCmagic社区1 分钟前
灵巧手VLA真机均分71%,北大DeCAL用接触门控接入触觉
人工智能·算法·aigc·ai多模态
迷途之人不知返11 分钟前
算法系列4:前缀和
算法
吠品18 分钟前
Python 写入 Excel 的两种主流方案实际用法总结
c语言·开发语言·算法
Zane199422 分钟前
归并排序和堆排序都能保证O(nlogn),为什么谁也没法把稳定和原地两个优点占全
算法·排序算法
天天喝旺仔26 分钟前
Go 泛型实战:从类型参数、约束到可复用泛型容器与函数
数据结构·算法·容器·go
可爱的小小小狼30 分钟前
【无标题】
java·算法
和裕2 小时前
平口开槽箱 vs 飞机盒 vs 扣底盒:自动化、展示效果与成本核心区别
大数据·运维·网络·人工智能·算法·自动化
AgentMaster2 小时前
从售前到售后全链路覆盖:智能客服在企业 5 大场景的落地实践与工具选型
大数据·人工智能·算法
Cccp.1232 小时前
【leetcode】(六) 图和贪心算法
数据结构·算法·leetcode
y1su2 小时前
【Leetcode】1477. 找两个和为目标值且不重叠的子数组
数据结构·后端·算法·leetcode·职场和发展